"github.com/vapor/protocol/vm/vmutil"
)
-func GenesisArguments(c *Config) []byte {
+func FederationProgrom(c *Config) []byte {
pubKeys := chainkd.XPubKeys(c.Federation.Xpubs)
fedpegScript, err := vmutil.P2SPMultiSigProgram(pubKeys, c.Federation.Quorum)
if err != nil {
- log.Panicf("fail on decode genesis arguments for federation")
+ log.Panicf("Failed generate federation scirpt for federation")
}
scriptHash := crypto.Sha256(fedpegScript)
log.Panicf("fail on decode genesis tx output control program")
}
- coinbaseInput := GenesisArguments(CommonConfig)
+ coinbaseInput := FederationProgrom(CommonConfig)
txData := types.TxData{
Version: 1,
}
// NewCrossChainInput creates a new CrossChainInput.
-func NewCrossChainInput(mainchainOutputID *Hash, value *AssetAmount, ordinal uint64) *CrossChainInput {
+func NewCrossChainInput(mainchainOutputID *Hash, value *AssetAmount, prog *Program, ordinal uint64) *CrossChainInput {
return &CrossChainInput{
MainchainOutputId: mainchainOutputID,
Value: value,
Ordinal: ordinal,
+ ControlProgram: prog,
}
}
}
prevout := bc.NewCrossChainOutput(src, prog, 0) // ordinal doesn't matter
outputID := bc.EntryID(prevout)
- crossIn := bc.NewCrossChainInput(&outputID, &inp.AssetAmount, uint64(i))
+ crossIn := bc.NewCrossChainInput(&outputID, &inp.AssetAmount, prog, uint64(i))
crossIn.WitnessArguments = inp.Arguments
crossInID := addEntry(crossIn)
muxSources[i] = &bc.ValueSource{
package validation
import (
+ "bytes"
"fmt"
"math"
+ "github.com/vapor/config"
"github.com/vapor/consensus"
"github.com/vapor/consensus/segwit"
"github.com/vapor/errors"
return nil
}
+func checkFedaration(tx *bc.Tx) error {
+ for _, id := range tx.InputIDs {
+ switch inp := tx.Entries[id].(type) {
+ case *bc.CrossChainInput:
+ fedProg := config.FederationProgrom(config.CommonConfig)
+ if !bytes.Equal(inp.ControlProgram.Code, fedProg) {
+ return errors.New("The federal controlProgram is incorrect")
+ }
+ default:
+ continue
+ }
+ }
+ return nil
+}
+
func checkStandardTx(tx *bc.Tx, blockHeight uint64) error {
for _, id := range tx.InputIDs {
if blockHeight >= ruleAA && id.IsZero() {
}
}
+ if err := checkFedaration(tx); err != nil {
+ return err
+ }
+
for _, id := range tx.GasInputIDs {
spend, err := tx.Spend(id)
if err != nil {