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")
Web *WebConfig `mapstructure:"web"`
Websocket *WebsocketConfig `mapstructure:"ws"`
Federation *FederationConfig `mapstructure:"federation"`
+ CrossChain *CrossChainConfig `mapstructure:"cross_chain"`
}
// Default configurable parameters.
Web: DefaultWebConfig(),
Websocket: DefaultWebsocketConfig(),
Federation: DefaultFederationConfig(),
+ CrossChain: DefaultCrossChainConfig(),
}
}
Quorum int `json:"quorum"`
}
+type CrossChainConfig struct {
+ AssetWhitelist string `mapstructure:"asset_whitelist"`
+}
+
// Default configurable rpc's auth parameters.
func DefaultRPCAuthConfig() *RPCAuthConfig {
return &RPCAuthConfig{
}
}
+// Default configurable websocket parameters.
func DefaultWebsocketConfig() *WebsocketConfig {
return &WebsocketConfig{
MaxNumWebsockets: 25,
}
}
+// Default configurable federation parameters.
func DefaultFederationConfig() *FederationConfig {
return &FederationConfig{
Xpubs: []chainkd.XPub{
}
}
+// 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")
[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.
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))
--- /dev/null
+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
+}