OSDN Git Service

merfe
authorHAOYUatHZ <haoyu@protonmail.com>
Wed, 22 May 2019 22:11:56 +0000 (06:11 +0800)
committerHAOYUatHZ <haoyu@protonmail.com>
Wed, 22 May 2019 22:11:56 +0000 (06:11 +0800)
asset/builder.go
consensus/federation/federation.go [moved from consensus/federation.go with 53% similarity]
node/node.go

index a19c801..8fef62f 100644 (file)
@@ -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
-}
similarity index 53%
rename from consensus/federation.go
rename to consensus/federation/federation.go
index dbbdfba..8672ee6 100644 (file)
@@ -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
+}
index c74fd95..4673520 100644 (file)
@@ -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())