OSDN Git Service

V0.1 cross chain input prog (#93)
authorwz <mars@bytom.io>
Wed, 29 May 2019 07:27:09 +0000 (15:27 +0800)
committerPaladz <yzhu101@uottawa.ca>
Wed, 29 May 2019 07:27:09 +0000 (15:27 +0800)
* add federation contract prog

* modify

* delete code

* add validate federation prog for crossinput

* fix

* fix

* fix

config/genesis.go
protocol/bc/crosschain_input.go
protocol/bc/types/map.go
protocol/validation/tx.go

index 58ad266..61ac41f 100644 (file)
@@ -13,11 +13,11 @@ import (
        "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)
@@ -36,7 +36,7 @@ func GenesisTx() *types.Tx {
                log.Panicf("fail on decode genesis tx output control program")
        }
 
-       coinbaseInput := GenesisArguments(CommonConfig)
+       coinbaseInput := FederationProgrom(CommonConfig)
 
        txData := types.TxData{
                Version: 1,
index 0ce867d..63515f2 100644 (file)
@@ -21,10 +21,11 @@ func (cci *CrossChainInput) SetDestination(id *Hash, val *AssetAmount, pos uint6
 }
 
 // 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,
        }
 }
index 4a795b5..8d6a86b 100644 (file)
@@ -135,7 +135,7 @@ func mapTx(tx *TxData) (headerID bc.Hash, hdr *bc.TxHeader, entryMap map[bc.Hash
                        }
                        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{
index a748855..14d1b87 100644 (file)
@@ -1,9 +1,11 @@
 package validation
 
 import (
+       "bytes"
        "fmt"
        "math"
 
+       "github.com/vapor/config"
        "github.com/vapor/consensus"
        "github.com/vapor/consensus/segwit"
        "github.com/vapor/errors"
@@ -471,6 +473,21 @@ func checkValidDest(vs *validationState, vd *bc.ValueDestination) error {
        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() {
@@ -478,6 +495,10 @@ func checkStandardTx(tx *bc.Tx, blockHeight uint64) error {
                }
        }
 
+       if err := checkFedaration(tx); err != nil {
+               return err
+       }
+
        for _, id := range tx.GasInputIDs {
                spend, err := tx.Spend(id)
                if err != nil {