From 157aea278361c0acd7210b40e68c660442da66fb Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Thu, 23 May 2019 06:11:56 +0800 Subject: [PATCH] merfe --- asset/builder.go | 34 +++--------------------- consensus/{ => federation}/federation.go | 45 ++++++++++++++++++++++++++++---- node/node.go | 7 ++--- 3 files changed, 47 insertions(+), 39 deletions(-) rename consensus/{ => federation}/federation.go (53%) diff --git a/asset/builder.go b/asset/builder.go index a19c801a..8fef62fd 100644 --- a/asset/builder.go +++ b/asset/builder.go @@ -8,16 +8,12 @@ import ( log "github.com/sirupsen/logrus" - "github.com/vapor/blockchain/signers" "github.com/vapor/blockchain/txbuilder" - "github.com/vapor/consensus" - "github.com/vapor/crypto/ed25519" - "github.com/vapor/crypto/ed25519/chainkd" + "github.com/vapor/consensus/federation" chainjson "github.com/vapor/encoding/json" "github.com/vapor/errors" "github.com/vapor/protocol/bc" "github.com/vapor/protocol/bc/types" - "github.com/vapor/protocol/vm/vmutil" ) // DecodeCrossInAction convert input data to action struct @@ -80,30 +76,17 @@ func (a *crossInAction) Build(ctx context.Context, builder *txbuilder.TemplateBu a.reg.SaveExtAsset(asset, extAlias) } - assetSigner, err := signers.Create("asset", consensus.Federation().XPubs, consensus.Federation().Quorum, 1, signers.BIP0032) - if err != nil { - return err - } - - path := signers.GetBip0032Path(assetSigner, signers.AssetKeySpace) - derivedXPubs := chainkd.DeriveXPubs(assetSigner.XPubs, path) - derivedPKs := chainkd.XPubKeys(derivedXPubs) - pegInScript, err := buildPegInScript(derivedPKs, assetSigner.Quorum) - if err != nil { - return err - } - var sourceID bc.Hash if err := sourceID.UnmarshalText([]byte(a.SourceID)); err != nil { return errors.New("invalid sourceID format") } // arguments will be set when materializeWitnesses - txin := types.NewCrossChainInput(nil, sourceID, *a.AssetId, a.Amount, a.SourcePos, pegInScript, asset.RawDefinitionByte) + txin := types.NewCrossChainInput(nil, sourceID, *a.AssetId, a.Amount, a.SourcePos, federation.GetFederation().PegInScript, asset.RawDefinitionByte) log.Info("cross-chain input action built") builder.RestrictMinTime(time.Now()) tplIn := &txbuilder.SigningInstruction{} - tplIn.AddRawWitnessKeys(assetSigner.XPubs, path, assetSigner.Quorum) + tplIn.AddRawWitnessKeys(federation.GetFederation().XPubs, federation.GetFederation().Path, federation.GetFederation().Quorum) a.reg.db.Set(sourceKey, []byte("true")) return builder.AddInput(txin, tplIn) } @@ -111,14 +94,3 @@ func (a *crossInAction) Build(ctx context.Context, builder *txbuilder.TemplateBu func (a *crossInAction) ActionType() string { return "cross_chain_in" } - -func buildPegInScript(pubkeys []ed25519.PublicKey, nrequired int) (program []byte, err error) { - controlProg, err := vmutil.P2SPMultiSigProgram(pubkeys, nrequired) - if err != nil { - return nil, err - } - builder := vmutil.NewBuilder() - builder.AddRawBytes(controlProg) - prog, err := builder.Build() - return prog, err -} diff --git a/consensus/federation.go b/consensus/federation/federation.go similarity index 53% rename from consensus/federation.go rename to consensus/federation/federation.go index dbbdfbab..8672ee6c 100644 --- a/consensus/federation.go +++ b/consensus/federation/federation.go @@ -1,4 +1,4 @@ -package consensus +package federation import ( "encoding/json" @@ -6,7 +6,10 @@ import ( log "github.com/sirupsen/logrus" + "github.com/vapor/blockchain/signers" + "github.com/vapor/crypto/ed25519" "github.com/vapor/crypto/ed25519/chainkd" + "github.com/vapor/protocol/vm/vmutil" ) const fedCfgJson = ` @@ -24,11 +27,13 @@ const fedCfgJson = ` ` type federation struct { - XPubs []chainkd.XPub `json:"fed_xpubs"` - Quorum int `json:"fed_quorum"` + XPubs []chainkd.XPub `json:"fed_xpubs"` + Quorum int `json:"fed_quorum"` + Path [][]byte + PegInScript []byte } -func Federation() *federation { +func parseFedConfig() *federation { fed := &federation{} if err := json.Unmarshal([]byte(fedCfgJson), fed); err != nil { log.Fatalf("invalid federation config json") @@ -38,7 +43,7 @@ func Federation() *federation { } func CheckFedConfig() error { - fed := Federation() + fed := parseFedConfig() if len(fed.XPubs) <= 1 { return errors.New("federation should have more than 1 member") } @@ -48,3 +53,33 @@ func CheckFedConfig() error { return nil } + +func GetFederation() *federation { + fed := parseFedConfig() + assetSigner, err := signers.Create("asset", fed.XPubs, fed.Quorum, 1, signers.BIP0032) + if err != nil { + panic("fail to create federation assetSigner") + } + + fed.Path = signers.GetBip0032Path(assetSigner, signers.AssetKeySpace) + derivedXPubs := chainkd.DeriveXPubs(assetSigner.XPubs, fed.Path) + derivedPKs := chainkd.XPubKeys(derivedXPubs) + if pegInScript, err := buildPegInScript(derivedPKs, assetSigner.Quorum); err == nil { + fed.PegInScript = pegInScript + } else { + panic("fail to build peg-in script") + } + + return fed +} + +func buildPegInScript(pubkeys []ed25519.PublicKey, nrequired int) (program []byte, err error) { + controlProg, err := vmutil.P2SPMultiSigProgram(pubkeys, nrequired) + if err != nil { + return nil, err + } + builder := vmutil.NewBuilder() + builder.AddRawBytes(controlProg) + prog, err := builder.Build() + return prog, err +} diff --git a/node/node.go b/node/node.go index c74fd955..4673520e 100644 --- a/node/node.go +++ b/node/node.go @@ -22,6 +22,7 @@ import ( "github.com/vapor/blockchain/txfeed" cfg "github.com/vapor/config" "github.com/vapor/consensus" + "github.com/vapor/consensus/federation" "github.com/vapor/database" dbm "github.com/vapor/database/leveldb" "github.com/vapor/env" @@ -60,11 +61,11 @@ type Node struct { func NewNode(config *cfg.Config) *Node { ctx := context.Background() - if err := consensus.CheckFedConfig(); err == nil { + if err := federation.CheckFedConfig(); err == nil { log.WithFields(log.Fields{ "module": logModule, - "fed_xpubs": consensus.Federation().XPubs, - "fed_quorum": consensus.Federation().Quorum, + "fed_xpubs": federation.GetFederation().XPubs, + "fed_quorum": federation.GetFederation().Quorum, }).Info() } else { cmn.Exit("Error: " + err.Error()) -- 2.11.0