OSDN Git Service

filter txpool by asset whitelis (#488)
authorHAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com>
Sat, 15 Feb 2020 11:27:46 +0000 (19:27 +0800)
committerGitHub <noreply@github.com>
Sat, 15 Feb 2020 11:27:46 +0000 (19:27 +0800)
* add AssetWhitelist to FederationConfig

* use []*bc.AssetID for AssetWhitelist

* add (f *FederationAssetFilter) IsDust()

* fix https://github.com/Bytom/vapor/pull/488#discussion_r379226522

* fix https://github.com/Bytom/vapor/pull/488#discussion_r379226868

* fix https://github.com/Bytom/vapor/pull/488/files#r379226149

* fix https://github.com/Bytom/vapor/pull/488/files#r379225830

* convert assetID to lower-case

* golint

cmd/vapord/commands/run_node.go
config/config.go
config/toml.go
node/node.go
protocol/asset_filter.go [new file with mode: 0644]

index 2cc8bc7..af75e32 100644 (file)
@@ -21,6 +21,7 @@ var runNodeCmd = &cobra.Command{
 func init() {
        runNodeCmd.Flags().String("prof_laddr", config.ProfListenAddress, "Use http to profile vapord programs")
        runNodeCmd.Flags().Bool("mining", config.Mining, "Enable mining")
+       runNodeCmd.Flags().String("cross_chain.asset_whitelist", config.CrossChain.AssetWhitelist, "Cross-chain-allowed asset whitelist")
 
        runNodeCmd.Flags().Bool("auth.disable", config.Auth.Disable, "Disable rpc access authenticate")
 
index fa19b30..e9490f9 100644 (file)
@@ -28,6 +28,7 @@ type Config struct {
        Web        *WebConfig        `mapstructure:"web"`
        Websocket  *WebsocketConfig  `mapstructure:"ws"`
        Federation *FederationConfig `mapstructure:"federation"`
+       CrossChain *CrossChainConfig `mapstructure:"cross_chain"`
 }
 
 // Default configurable parameters.
@@ -40,6 +41,7 @@ func DefaultConfig() *Config {
                Web:        DefaultWebConfig(),
                Websocket:  DefaultWebsocketConfig(),
                Federation: DefaultFederationConfig(),
+               CrossChain: DefaultCrossChainConfig(),
        }
 }
 
@@ -214,6 +216,10 @@ type FederationConfig struct {
        Quorum int            `json:"quorum"`
 }
 
+type CrossChainConfig struct {
+       AssetWhitelist string `mapstructure:"asset_whitelist"`
+}
+
 // Default configurable rpc's auth parameters.
 func DefaultRPCAuthConfig() *RPCAuthConfig {
        return &RPCAuthConfig{
@@ -238,6 +244,7 @@ func DefaultWalletConfig() *WalletConfig {
        }
 }
 
+// Default configurable websocket parameters.
 func DefaultWebsocketConfig() *WebsocketConfig {
        return &WebsocketConfig{
                MaxNumWebsockets:     25,
@@ -245,6 +252,7 @@ func DefaultWebsocketConfig() *WebsocketConfig {
        }
 }
 
+// Default configurable federation parameters.
 func DefaultFederationConfig() *FederationConfig {
        return &FederationConfig{
                Xpubs: []chainkd.XPub{
@@ -257,6 +265,11 @@ func DefaultFederationConfig() *FederationConfig {
        }
 }
 
+// Default configurable crosschain parameters.
+func DefaultCrossChainConfig() *CrossChainConfig {
+       return &CrossChainConfig{}
+}
+
 func xpub(str string) (xpub chainkd.XPub) {
        if err := xpub.UnmarshalText([]byte(str)); err != nil {
                log.Panicf("Fail converts a string to xpub")
index 4733981..83091b5 100644 (file)
@@ -31,18 +31,24 @@ var mainNetConfigTmpl = `chain_id = "mainnet"
 [p2p]
 laddr = "tcp://0.0.0.0:56656"
 seeds = "47.103.79.68:56656,47.103.13.86:56656,47.102.193.119:56656,47.103.17.22:56656"
+[cross_chain]
+asset_whitelist = ""
 `
 
 var testNetConfigTmpl = `chain_id = "testnet"
 [p2p]
 laddr = "tcp://0.0.0.0:56657"
 seeds = "52.82.7.233:56657,52.82.109.252:56657,52.82.29.30:56657"
+[cross_chain]
+asset_whitelist = ""
 `
 
 var soloNetConfigTmpl = `chain_id = "solonet"
 [p2p]
 laddr = "tcp://0.0.0.0:56658"
 seeds = ""
+[cross_chain]
+asset_whitelist = ""
 `
 
 // Select network seeds to merge a new string.
index d71f2e7..b352ae2 100644 (file)
@@ -97,7 +97,8 @@ func NewNode(config *cfg.Config) *Node {
 
        dispatcher := event.NewDispatcher()
        movCore := mov.NewMovCore(config.DBBackend, config.DBDir(), consensus.ActiveNetParams.MovStartHeight)
-       txPool := protocol.NewTxPool(store, []protocol.DustFilterer{movCore}, dispatcher)
+       assetFilter := protocol.NewAssetFilter(config.CrossChain.AssetWhitelist)
+       txPool := protocol.NewTxPool(store, []protocol.DustFilterer{movCore, assetFilter}, dispatcher)
        chain, err := protocol.NewChain(store, txPool, []protocol.Protocoler{movCore}, dispatcher)
        if err != nil {
                cmn.Exit(cmn.Fmt("Failed to create chain structure: %v", err))
diff --git a/protocol/asset_filter.go b/protocol/asset_filter.go
new file mode 100644 (file)
index 0000000..aef0dbd
--- /dev/null
@@ -0,0 +1,41 @@
+package protocol
+
+import (
+       "strings"
+
+       "github.com/bytom/vapor/consensus"
+       "github.com/bytom/vapor/protocol/bc/types"
+)
+
+type assetFilter struct {
+       whitelist map[string]struct{}
+}
+
+// NewAssetFilter returns a assetFilter according a whitelist,
+// which is a strings list cancated via comma
+func NewAssetFilter(whitelist string) *assetFilter {
+       af := &assetFilter{whitelist: make(map[string]struct{})}
+       af.whitelist[consensus.BTMAssetID.String()] = struct{}{}
+       for _, assetID := range strings.Split(whitelist, ",") {
+               af.whitelist[strings.ToLower(assetID)] = struct{}{}
+       }
+       return af
+}
+
+// IsDust implements the DustFilterer interface.
+// It filters a transaction as long as there is one asset neither BTM or in the whitelist
+// No need to check the output assets types becauese they must have been cover in input assets types
+func (af *assetFilter) IsDust(tx *types.Tx) bool {
+       for _, input := range tx.Inputs {
+               if _, ok := input.TypedInput.(*types.CrossChainInput); !ok {
+                       continue
+               }
+
+               assetID := input.AssetID()
+               if _, ok := af.whitelist[assetID.String()]; !ok {
+                       return true
+               }
+       }
+
+       return false
+}