OSDN Git Service

fix the bug (#372)
[bytom/vapor.git] / config / genesis.go
index 58ad266..a3b2f7e 100644 (file)
@@ -13,21 +13,35 @@ import (
        "github.com/vapor/protocol/vm/vmutil"
 )
 
-func GenesisArguments(c *Config) []byte {
-       pubKeys := chainkd.XPubKeys(c.Federation.Xpubs)
-       fedpegScript, err := vmutil.P2SPMultiSigProgram(pubKeys, c.Federation.Quorum)
+// FedAddressPath is used to derive federation root xpubs for signing cross-chain txs
+var FedAddressPath = [][]byte{
+       []byte{0x2C, 0x00, 0x00, 0x00},
+       []byte{0x99, 0x00, 0x00, 0x00},
+       []byte{0x01, 0x00, 0x00, 0x00},
+       []byte{0x00, 0x00, 0x00, 0x00},
+       []byte{0x01, 0x00, 0x00, 0x00},
+}
+
+func FederationPMultiSigScript(c *Config) []byte {
+       xpubs := c.Federation.Xpubs
+       derivedXPubs := chainkd.DeriveXPubs(xpubs, FedAddressPath)
+       program, err := vmutil.P2SPMultiSigProgram(chainkd.XPubKeys(derivedXPubs), c.Federation.Quorum)
        if err != nil {
-               log.Panicf("fail on decode genesis arguments for federation")
+               log.Panicf("fail to generate federation scirpt for federation: %v", err)
        }
 
-       scriptHash := crypto.Sha256(fedpegScript)
+       return program
+}
 
-       control, err := vmutil.P2WSHProgram(scriptHash)
+func FederationWScript(c *Config) []byte {
+       script := FederationPMultiSigScript(c)
+       scriptHash := crypto.Sha256(script)
+       wscript, err := vmutil.P2WSHProgram(scriptHash)
        if err != nil {
-               log.Panicf("Fail converts scriptHash to program on GenesisArguments: %v", err)
+               log.Panicf("Fail converts scriptHash to witness: %v", err)
        }
 
-       return control
+       return wscript
 }
 
 func GenesisTx() *types.Tx {
@@ -36,7 +50,7 @@ func GenesisTx() *types.Tx {
                log.Panicf("fail on decode genesis tx output control program")
        }
 
-       coinbaseInput := GenesisArguments(CommonConfig)
+       coinbaseInput := FederationWScript(CommonConfig)
 
        txData := types.TxData{
                Version: 1,
@@ -44,7 +58,7 @@ func GenesisTx() *types.Tx {
                        types.NewCoinbaseInput(coinbaseInput[:]),
                },
                Outputs: []*types.TxOutput{
-                       types.NewIntraChainOutput(*consensus.BTMAssetID, consensus.InitialBlockSubsidy, contract),
+                       types.NewIntraChainOutput(*consensus.BTMAssetID, consensus.BlockSubsidy(0), contract),
                },
        }
        return types.NewTx(txData)
@@ -70,7 +84,7 @@ func mainNetGenesisBlock() *types.Block {
                BlockHeader: types.BlockHeader{
                        Version:   1,
                        Height:    0,
-                       Timestamp: 1524549600000,
+                       Timestamp: 1563344560002,
                        BlockCommitment: types.BlockCommitment{
                                TransactionsMerkleRoot: merkleRoot,
                                TransactionStatusHash:  txStatusHash,
@@ -101,7 +115,7 @@ func testNetGenesisBlock() *types.Block {
                BlockHeader: types.BlockHeader{
                        Version:   1,
                        Height:    0,
-                       Timestamp: 1528945000000,
+                       Timestamp: 1563344560001,
                        BlockCommitment: types.BlockCommitment{
                                TransactionsMerkleRoot: merkleRoot,
                                TransactionStatusHash:  txStatusHash,
@@ -132,7 +146,7 @@ func soloNetGenesisBlock() *types.Block {
                BlockHeader: types.BlockHeader{
                        Version:   1,
                        Height:    0,
-                       Timestamp: 1528945000000,
+                       Timestamp: 1563344560000,
                        BlockCommitment: types.BlockCommitment{
                                TransactionsMerkleRoot: merkleRoot,
                                TransactionStatusHash:  txStatusHash,
@@ -146,9 +160,8 @@ func soloNetGenesisBlock() *types.Block {
 // GenesisBlock will return genesis block
 func GenesisBlock() *types.Block {
        return map[string]func() *types.Block{
-               "main":  mainNetGenesisBlock,
-               "test":  testNetGenesisBlock,
-               "solo":  soloNetGenesisBlock,
-               "vapor": soloNetGenesisBlock,
+               "main": mainNetGenesisBlock,
+               "test": testNetGenesisBlock,
+               "solo": soloNetGenesisBlock,
        }[consensus.ActiveNetParams.Name]()
 }