OSDN Git Service

change crossin tx multi sign to single (#593)
authorwyjDoraemon <46176410+wyjDoraemon@users.noreply.github.com>
Wed, 18 Aug 2021 09:34:18 +0000 (04:34 -0500)
committerGitHub <noreply@github.com>
Wed, 18 Aug 2021 09:34:18 +0000 (17:34 +0800)
* change crossin tx multi sign to single

* opt

api/transact.go
blockchain/txbuilder/actions.go
config/config.go
config/genesis.go
consensus/general.go
node/node.go
protocol/validation/tx.go

index 26719d3..eff58a3 100644 (file)
@@ -62,6 +62,7 @@ func (a *API) buildSingle(ctx context.Context, req *BuildRequest) (*txbuilder.Te
        }
 
        maxTime := time.Now().Add(req.TTL.Duration)
        }
 
        maxTime := time.Now().Add(req.TTL.Duration)
+       ctx = context.WithValue(ctx, "block_height", a.wallet.Chain.BestBlockHeight())
        tpl, err := txbuilder.Build(ctx, req.Tx, actions, maxTime, req.TimeRange)
        if errors.Root(err) == txbuilder.ErrAction {
                // append each of the inner errors contained in the data.
        tpl, err := txbuilder.Build(ctx, req.Tx, actions, maxTime, req.TimeRange)
        if errors.Root(err) == txbuilder.ErrAction {
                // append each of the inner errors contained in the data.
index c41d7dc..69158f1 100644 (file)
@@ -295,7 +295,11 @@ func (c *crossInAction) Build(ctx context.Context, builder *TemplateBuilder) err
        // arguments will be set when materializeWitnesses
        txin := types.NewCrossChainInput(nil, c.SourceID, *c.AssetId, c.Amount, c.SourcePos, c.VMVersion, c.RawDefinitionByte, c.IssuanceProgram)
        tplIn := &SigningInstruction{}
        // arguments will be set when materializeWitnesses
        txin := types.NewCrossChainInput(nil, c.SourceID, *c.AssetId, c.Amount, c.SourcePos, c.VMVersion, c.RawDefinitionByte, c.IssuanceProgram)
        tplIn := &SigningInstruction{}
+       blockHeight := ctx.Value("block_height").(uint64)
        fed := cfg.CommonConfig.Federation
        fed := cfg.CommonConfig.Federation
+       if blockHeight > consensus.CrossInForkHeight {
+               fed = cfg.SingleFederationConfig()
+       }
 
        if !common.IsOpenFederationIssueAsset(c.RawDefinitionByte) {
                tplIn.AddRawWitnessKeys(fed.Xpubs, cfg.FedAddressPath, fed.Quorum)
 
        if !common.IsOpenFederationIssueAsset(c.RawDefinitionByte) {
                tplIn.AddRawWitnessKeys(fed.Xpubs, cfg.FedAddressPath, fed.Quorum)
index 905f747..a4c8ca5 100644 (file)
@@ -271,6 +271,16 @@ func DefaultFederationConfig() *FederationConfig {
        }
 }
 
        }
 }
 
+// Default configurable federation parameters.
+func SingleFederationConfig() *FederationConfig {
+       return &FederationConfig{
+               Xpubs: []chainkd.XPub{
+                       xpub("0f810c52bcd0d44482d63ef6131712b32e08b2a20c5daf134072b870a789623a726eb61e4021caa7158fbc6ca99827485c7f60010913a12a810ef7b71b03dacd"),
+               },
+               Quorum: 1,
+       }
+}
+
 // Default configurable crosschain parameters.
 func DefaultCrossChainConfig() *CrossChainConfig {
        return &CrossChainConfig{}
 // Default configurable crosschain parameters.
 func DefaultCrossChainConfig() *CrossChainConfig {
        return &CrossChainConfig{}
index 9e36bc6..699daea 100644 (file)
@@ -33,8 +33,12 @@ func FederationPMultiSigScript(c *Config) []byte {
        return program
 }
 
        return program
 }
 
-func FederationWScript(c *Config) []byte {
+func FederationWScript(c *Config, height uint64) []byte {
        script := FederationPMultiSigScript(c)
        script := FederationPMultiSigScript(c)
+       if height > consensus.CrossInForkHeight {
+               script = FederationPMultiSigScript(&Config{Federation: SingleFederationConfig()})
+       }
+
        scriptHash := crypto.Sha256(script)
        wscript, err := vmutil.P2WSHProgram(scriptHash)
        if err != nil {
        scriptHash := crypto.Sha256(script)
        wscript, err := vmutil.P2WSHProgram(scriptHash)
        if err != nil {
@@ -50,7 +54,7 @@ func GenesisTx() *types.Tx {
                log.Panicf("fail on decode genesis tx output control program")
        }
 
                log.Panicf("fail on decode genesis tx output control program")
        }
 
-       coinbaseInput := FederationWScript(CommonConfig)
+       coinbaseInput := FederationWScript(CommonConfig, 0)
 
        txData := types.TxData{
                Version: 1,
 
        txData := types.TxData{
                Version: 1,
index 9b1da10..ec6c6cf 100644 (file)
@@ -14,6 +14,8 @@ const (
        PayToWitnessPubKeyHashDataSize = 20
        PayToWitnessScriptHashDataSize = 32
 
        PayToWitnessPubKeyHashDataSize = 20
        PayToWitnessScriptHashDataSize = 32
 
+       CrossInForkHeight = 128957600
+
        _ = iota
        SoftFork001
 )
        _ = iota
        SoftFork001
 )
index 1835e34..87d7456 100644 (file)
@@ -71,7 +71,7 @@ func NewNode(config *cfg.Config) *Node {
                "pubkey":             config.PrivateKey().XPub(),
                "fed_xpubs":          config.Federation.Xpubs,
                "fed_quorum":         config.Federation.Quorum,
                "pubkey":             config.PrivateKey().XPub(),
                "fed_xpubs":          config.Federation.Xpubs,
                "fed_quorum":         config.Federation.Quorum,
-               "fed_controlprogram": hex.EncodeToString(cfg.FederationWScript(config)),
+               "fed_controlprogram": hex.EncodeToString(cfg.FederationWScript(config, 0)),
        }).Info()
 
        // Get store
        }).Info()
 
        // Get store
@@ -228,7 +228,7 @@ func initNodeConfig(config *cfg.Config) error {
 
 // find whether config xpubs equal genesis block xpubs
 func checkConfig(chain *protocol.Chain, config *cfg.Config) error {
 
 // find whether config xpubs equal genesis block xpubs
 func checkConfig(chain *protocol.Chain, config *cfg.Config) error {
-       fedpegScript := cfg.FederationWScript(config)
+       fedpegScript := cfg.FederationWScript(config, 0)
        genesisBlock, err := chain.GetBlockByHeight(0)
        if err != nil {
                return err
        genesisBlock, err := chain.GetBlockByHeight(0)
        if err != nil {
                return err
index 44287e9..a9613b5 100644 (file)
@@ -281,7 +281,7 @@ func checkValid(vs *validationState, e bc.Entry) (err error) {
                }
 
                if !common.IsOpenFederationIssueAsset(e.RawDefinitionByte) {
                }
 
                if !common.IsOpenFederationIssueAsset(e.RawDefinitionByte) {
-                       prog.Code = config.FederationWScript(config.CommonConfig)
+                       prog.Code = config.FederationWScript(config.CommonConfig, vs.block.Height)
                }
 
                if _, err := vm.Verify(NewTxVMContext(vs, e, prog, e.WitnessArguments), consensus.ActiveNetParams.DefaultGasCredit); err != nil {
                }
 
                if _, err := vm.Verify(NewTxVMContext(vs, e, prog, e.WitnessArguments), consensus.ActiveNetParams.DefaultGasCredit); err != nil {