From: HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com> Date: Sat, 29 Jun 2019 01:44:12 +0000 (+0800) Subject: refatcor(feaderation): use P2WSHProgram for federation program on sidechain (#233) X-Git-Tag: v1.0.5~185 X-Git-Url: http://git.osdn.net/view?p=bytom%2Fvapor.git;a=commitdiff_plain;h=5d074a5954520a5d385683a1fc254df70fa9d25c;hp=0af46f9b56a27c0c440c28291059c073dc7f3f4a refatcor(feaderation): use P2WSHProgram for federation program on sidechain (#233) * fix * rename * fix --- diff --git a/.gitignore b/.gitignore index c6146a2a..3d50b94b 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/blockchain/txbuilder/actions.go b/blockchain/txbuilder/actions.go index e7320f5c..1b72c7d8 100644 --- a/blockchain/txbuilder/actions.go +++ b/blockchain/txbuilder/actions.go @@ -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) } diff --git a/blockchain/txbuilder/signing_instruction.go b/blockchain/txbuilder/signing_instruction.go index e8786e2f..bf04773a 100644 --- a/blockchain/txbuilder/signing_instruction.go +++ b/blockchain/txbuilder/signing_instruction.go @@ -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. diff --git a/config/genesis.go b/config/genesis.go index 431cf8eb..8cd53259 100644 --- a/config/genesis.go +++ b/config/genesis.go @@ -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, diff --git a/federation/synchron/mainchain_keeper.go b/federation/synchron/mainchain_keeper.go index 3b4da044..0c1612c0 100644 --- a/federation/synchron/mainchain_keeper.go +++ b/federation/synchron/mainchain_keeper.go @@ -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), } } diff --git a/federation/util/script.go b/federation/util/script.go index 670b9802..76d498ee 100644 --- a/federation/util/script.go +++ b/federation/util/script.go @@ -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 diff --git a/node/node.go b/node/node.go index 8469de7f..d82c1558 100644 --- a/node/node.go +++ b/node/node.go @@ -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 diff --git a/protocol/validation/tx.go b/protocol/validation/tx.go index 1baf6c86..58bbfc58 100644 --- a/protocol/validation/tx.go +++ b/protocol/validation/tx.go @@ -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,