AssetDefinition map[string]interface{} `json:"asset_definition"`
}
-// TODO: also need to hard-code mapTx
func (a *crossInAction) Build(ctx context.Context, builder *txbuilder.TemplateBuilder) error {
var missing []string
if a.SourceID == "" {
fed := federation.GetFederation()
// arguments will be set when materializeWitnesses
- txin := types.NewCrossChainInput(nil, sourceID, *a.AssetId, a.Amount, a.SourcePos, fed.PegInScript, asset.RawDefinitionByte)
+ txin := types.NewCrossChainInput(nil, sourceID, *a.AssetId, a.Amount, a.SourcePos, fed.ControlProgram, asset.RawDefinitionByte)
log.Info("cross-chain input action built")
builder.RestrictMinTime(time.Now())
tplIn := &txbuilder.SigningInstruction{}
`
type federation struct {
- XPubs []chainkd.XPub `json:"fed_xpubs"`
- Quorum int `json:"fed_quorum"`
- Path [][]byte
- PegInScript []byte
+ XPubs []chainkd.XPub `json:"fed_xpubs"`
+ Quorum int `json:"fed_quorum"`
+ Path [][]byte
+ ControlProgram []byte
}
func parseFedConfig() *federation {
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
+ if controlProgram, err := buildPegInControlProgram(derivedPKs, assetSigner.Quorum); err == nil {
+ fed.ControlProgram = controlProgram
} else {
log.Fatalf("fail to build peg-in script: %v", err)
}
return fed
}
-func buildPegInScript(pubkeys []ed25519.PublicKey, nrequired int) (program []byte, err error) {
+func buildPegInControlProgram(pubkeys []ed25519.PublicKey, nrequired int) (program []byte, err error) {
controlProg, err := vmutil.P2SPMultiSigProgram(pubkeys, nrequired)
if err != nil {
return nil, err
if err := federation.CheckFedConfig(); err == nil {
fed := federation.GetFederation()
log.WithFields(log.Fields{
- "module": logModule,
- "fed_xpubs": fed.XPubs,
- "fed_quorum": fed.Quorum,
- "fed_peginscript": fed.PegInScript,
+ "module": logModule,
+ "fed_xpubs": fed.XPubs,
+ "fed_quorum": fed.Quorum,
+ "fed_controlprogram": fed.ControlProgram,
}).Info()
} else {
cmn.Exit("Error: " + err.Error())
log "github.com/sirupsen/logrus"
"github.com/vapor/consensus"
+ "github.com/vapor/consensus/federation"
"github.com/vapor/protocol/bc"
"github.com/vapor/protocol/vm"
"github.com/vapor/protocol/vm/vmutil"
spends = append(spends, spend)
case *CrossChainInput:
- prog := &bc.Program{VmVersion: inp.VMVersion, Code: inp.ControlProgram}
+ // hard code peg-in control program in consensus level, may need to
+ // deal with soft fork (federation members change) in the future
+ prog := &bc.Program{VmVersion: inp.VMVersion, Code: federation.GetFederation().ControlProgram}
src := &bc.ValueSource{
Ref: &inp.SourceID,
Value: &inp.AssetAmount,