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
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)
}
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
-}
-package consensus
+package federation
import (
"encoding/json"
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 = `
`
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")
}
func CheckFedConfig() error {
- fed := Federation()
+ fed := parseFedConfig()
if len(fed.XPubs) <= 1 {
return errors.New("federation should have more than 1 member")
}
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
+}
"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"
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())