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")
log "github.com/sirupsen/logrus"
"github.com/bytom/vapor/crypto/ed25519/chainkd"
- "github.com/bytom/vapor/protocol/bc"
)
var (
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(),
}
}
}
type FederationConfig struct {
- Xpubs []chainkd.XPub `json:"xpubs"`
- Quorum int `json:"quorum"`
- AssetWhitelist []*bc.AssetID `json:"asset_whitelist"`
+ Xpubs []chainkd.XPub `json:"xpubs"`
+ Quorum int `json:"quorum"`
+}
+
+type CrossChainConfig struct {
+ AssetWhitelist string `mapstructure:"asset_whitelist"`
}
// Default configurable rpc's auth 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")
"encoding/json"
"io/ioutil"
"os"
-
- "github.com/bytom/vapor/consensus"
- "github.com/bytom/vapor/protocol/bc"
- "github.com/bytom/vapor/protocol/bc/types"
)
func ExportFederationFile(fedFile string, config *Config) error {
return json.NewDecoder(file).Decode(config.Federation)
}
-
-type FederationAssetFilter struct {
- whitelist map[string]struct{}
-}
-
-func NewFederationAssetFilter(whitelist []*bc.AssetID) *FederationAssetFilter {
- f := &FederationAssetFilter{whitelist: make(map[string]struct{})}
- f.whitelist[consensus.BTMAssetID.String()] = struct{}{}
- for _, asset := range whitelist {
- f.whitelist[asset.String()] = struct{}{}
- }
- return f
-}
-
-func (f *FederationAssetFilter) IsDust(tx *types.Tx) bool {
- for _, input := range tx.Inputs {
- if input.TypedInput.(type) != types.CrossChainInput {
- continue
- }
-
- assetID := input.AssetID()
- if _, ok := f.whitelist[assetID.String()]; !ok {
- return true
- }
- }
-
- return false
-}
dispatcher := event.NewDispatcher()
movCore := mov.NewMovCore(config.DBBackend, config.DBDir(), consensus.ActiveNetParams.MovStartHeight)
- assetFilter := cfg.NewFederationAssetFilter(config.Federation.AssetWhitelist)
+ 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 {
--- /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{}
+}
+
+func NewAssetFilter(whitelist string) *assetFilter {
+ af := &assetFilter{whitelist: make(map[string]struct{})}
+ af.whitelist[consensus.BTMAssetID.String()] = struct{}{}
+ for _, asset := range strings.Split(whitelist, ",") {
+ af.whitelist[asset] = struct{}{}
+ }
+ return af
+}
+
+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
+}