OSDN Git Service

refatcor(feaderation): use P2WSHProgram for federation program on sidechain (#233)
authorHAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com>
Sat, 29 Jun 2019 01:44:12 +0000 (09:44 +0800)
committerPaladz <yzhu101@uottawa.ca>
Sat, 29 Jun 2019 01:44:12 +0000 (09:44 +0800)
* fix

* rename

* fix

.gitignore
blockchain/txbuilder/actions.go
blockchain/txbuilder/signing_instruction.go
config/genesis.go
federation/synchron/mainchain_keeper.go
federation/util/script.go
node/node.go
protocol/validation/tx.go

index c6146a2..3d50b94 100644 (file)
@@ -21,11 +21,11 @@ _cgo_export.*
 _testmain.go
 
 cmd/fedd/fedd
-cmd/bytomd/bytomd
-cmd/bytomd/.bytomd
-cmd/bytomcli/bytomcli
-cmd/bytom/.bytom
-.bytomd
+cmd/vapord/vapord
+cmd/vapord/.vapord
+cmd/vaporcli/vaporcli
+cmd/vapor/.vapor
+.vapord
 
 target
 
@@ -45,8 +45,8 @@ profile.cov
 profile.tmp
 
 .DS_Store
-cmd/bytomd/bytomd_error/config.toml
-cmd/bytomd/bytomd_error/genesis.json
+cmd/vapord/vapord_error/config.toml
+cmd/vapord/vapord_error/genesis.json
 blockchain/pseudohsm/testdata/pseudo/UTC--2017-11-01T09-24-31.848287391Z--931de33f-e62e-4de7-8036-f82ad5efa77e
 blockchain/pseudohsm/testdata/pseudo/UTC--2017-11-01T09-24-31.953012475Z--36b63ec7-b585-4a0e-95ff-e3f71b4ccb8b
 blockchain/pseudohsm/UTC--2017-11-01T09-24-30.596579759Z--2178d885-aca6-4436-a865-e7e439e4bd9c
index e7320f5..1b72c7d 100644 (file)
@@ -8,7 +8,7 @@ import (
        "golang.org/x/crypto/sha3"
 
        "github.com/vapor/common"
-       "github.com/vapor/config"
+       cfg "github.com/vapor/config"
        "github.com/vapor/consensus"
        "github.com/vapor/encoding/json"
        "github.com/vapor/protocol/bc"
@@ -292,8 +292,9 @@ func (a *crossInAction) Build(ctx context.Context, builder *TemplateBuilder) err
        // arguments will be set when materializeWitnesses
        txin := types.NewCrossChainInput(nil, a.SourceID, *a.AssetId, a.Amount, a.SourcePos, a.VMVersion, a.RawDefinitionByte, a.IssuanceProgram)
        tplIn := &SigningInstruction{}
-       fed := config.CommonConfig.Federation
+       fed := cfg.CommonConfig.Federation
        tplIn.AddRawWitnessKeys(fed.Xpubs, nil, fed.Quorum)
+       tplIn.AddDataWitness(cfg.FederationPMultiSigScript(cfg.CommonConfig))
        return builder.AddInput(txin, tplIn)
 }
 
index e8786e2..bf04773 100644 (file)
@@ -8,6 +8,11 @@ import (
        "github.com/vapor/errors"
 )
 
+func (si *SigningInstruction) AddDataWitness(data chainjson.HexBytes) {
+       dw := DataWitness(data)
+       si.WitnessComponents = append(si.WitnessComponents, &dw)
+}
+
 // AddWitnessKeys adds a SignatureWitness with the given quorum and
 // list of keys derived by applying the derivation path to each of the
 // xpubs.
index 431cf8e..8cd5325 100644 (file)
@@ -6,20 +6,32 @@ import (
        log "github.com/sirupsen/logrus"
 
        "github.com/vapor/consensus"
+       "github.com/vapor/crypto"
        "github.com/vapor/crypto/ed25519/chainkd"
        "github.com/vapor/protocol/bc"
        "github.com/vapor/protocol/bc/types"
        "github.com/vapor/protocol/vm/vmutil"
 )
 
-func FederationProgrom(c *Config) []byte {
+func FederationPMultiSigScript(c *Config) []byte {
        xpubs := c.Federation.Xpubs
-       fedpegScript, err := vmutil.P2SPMultiSigProgram(chainkd.XPubKeys(xpubs), c.Federation.Quorum)
+       program, err := vmutil.P2SPMultiSigProgram(chainkd.XPubKeys(xpubs), c.Federation.Quorum)
        if err != nil {
                log.Panicf("fail to generate federation scirpt for federation: %v", err)
        }
 
-       return fedpegScript
+       return program
+}
+
+func FederationWScript(c *Config) []byte {
+       script := FederationPMultiSigScript(c)
+       scriptHash := crypto.Sha256(script)
+       wscript, err := vmutil.P2WSHProgram(scriptHash)
+       if err != nil {
+               log.Panicf("Fail converts scriptHash to witness: %v", err)
+       }
+
+       return wscript
 }
 
 func GenesisTx() *types.Tx {
@@ -28,7 +40,7 @@ func GenesisTx() *types.Tx {
                log.Panicf("fail on decode genesis tx output control program")
        }
 
-       coinbaseInput := FederationProgrom(CommonConfig)
+       coinbaseInput := FederationWScript(CommonConfig)
 
        txData := types.TxData{
                Version: 1,
index 3b4da04..0c1612c 100644 (file)
@@ -42,7 +42,7 @@ func NewMainchainKeeper(db *gorm.DB, assetStore *database.AssetStore, cfg *confi
                node:       service.NewNode(cfg.Mainchain.Upstream),
                chainName:  cfg.Mainchain.Name,
                assetStore: assetStore,
-               fedProg:    util.SegWitWrap(util.ParseFedProg(cfg.Warders, cfg.Quorum)),
+               fedProg:    util.ParseFedProg(cfg.Warders, cfg.Quorum),
        }
 }
 
index 670b980..76d498e 100644 (file)
@@ -11,16 +11,6 @@ import (
        "github.com/vapor/protocol/vm/vmutil"
 )
 
-func SegWitWrap(script []byte) []byte {
-       scriptHash := crypto.Sha256(script)
-       wscript, err := vmutil.P2WSHProgram(scriptHash)
-       if err != nil {
-               log.Panicf("Fail converts scriptHash to witness: %v", err)
-       }
-
-       return wscript
-}
-
 func ParseFedProg(warders []config.Warder, quorum int) []byte {
        SortWarders(warders)
 
@@ -29,12 +19,18 @@ func ParseFedProg(warders []config.Warder, quorum int) []byte {
                xpubs = append(xpubs, w.XPub)
        }
 
-       fedScript, err := vmutil.P2SPMultiSigProgram(chainkd.XPubKeys(xpubs), quorum)
+       scirpt, err := vmutil.P2SPMultiSigProgram(chainkd.XPubKeys(xpubs), quorum)
        if err != nil {
                log.Panicf("fail to generate federation scirpt for federation: %v", err)
        }
 
-       return fedScript
+       scriptHash := crypto.Sha256(scirpt)
+       wscript, err := vmutil.P2WSHProgram(scriptHash)
+       if err != nil {
+               log.Panicf("Fail converts scriptHash to witness: %v", err)
+       }
+
+       return wscript
 }
 
 type byPosition []config.Warder
index 8469de7..d82c155 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,
-               "fed_controlprogram": hex.EncodeToString(cfg.FederationProgrom(config)),
+               "fed_controlprogram": hex.EncodeToString(cfg.FederationWScript(config)),
        }).Info()
 
        initLogFile(config)
@@ -161,7 +161,7 @@ func NewNode(config *cfg.Config) *Node {
 
 // find whether config xpubs equal genesis block xpubs
 func checkConfig(chain *protocol.Chain, config *cfg.Config) error {
-       fedpegScript := cfg.FederationProgrom(config)
+       fedpegScript := cfg.FederationWScript(config)
        genesisBlock, err := chain.GetBlockByHeight(0)
        if err != nil {
                return err
index 1baf6c8..58bbfc5 100644 (file)
@@ -257,7 +257,7 @@ func checkValid(vs *validationState, e bc.Entry) (err error) {
                        return errors.New("incorrect asset_id while checking CrossChainInput")
                }
 
-               code := config.FederationProgrom(config.CommonConfig)
+               code := config.FederationWScript(config.CommonConfig)
                prog := &bc.Program{
                        VmVersion: e.ControlProgram.VmVersion,
                        Code:      code,