6 log "github.com/sirupsen/logrus"
8 "github.com/vapor/consensus"
9 "github.com/vapor/crypto/ed25519/chainkd"
10 "github.com/vapor/protocol/bc"
11 "github.com/vapor/protocol/bc/types"
12 "github.com/vapor/protocol/vm/vmutil"
15 func FederationProgrom(c *Config) []byte {
16 xpubs := c.Federation.Xpubs
17 fedpegScript, err := vmutil.P2SPMultiSigProgram(chainkd.XPubKeys(xpubs), c.Federation.Quorum)
19 log.Panicf("fail to generate federation scirpt for federation: %v", err)
25 func GenesisTx() *types.Tx {
26 contract, err := hex.DecodeString("00148c9d063ff74ee6d9ffa88d83aeb038068366c4c4")
28 log.Panicf("fail on decode genesis tx output control program")
31 coinbaseInput := FederationProgrom(CommonConfig)
33 txData := types.TxData{
35 Inputs: []*types.TxInput{
36 types.NewCoinbaseInput(coinbaseInput[:]),
38 Outputs: []*types.TxOutput{
39 types.NewIntraChainOutput(*consensus.BTMAssetID, consensus.BlockSubsidy(0), contract),
42 return types.NewTx(txData)
45 func mainNetGenesisBlock() *types.Block {
47 txStatus := bc.NewTransactionStatus()
48 if err := txStatus.SetStatus(0, false); err != nil {
49 log.Panicf(err.Error())
51 txStatusHash, err := types.TxStatusMerkleRoot(txStatus.VerifyStatus)
53 log.Panicf("fail on calc genesis tx status merkle root")
56 merkleRoot, err := types.TxMerkleRoot([]*bc.Tx{tx.Tx})
58 log.Panicf("fail on calc genesis tx merkel root")
61 block := &types.Block{
62 BlockHeader: types.BlockHeader{
65 Timestamp: 1561000000002,
66 BlockCommitment: types.BlockCommitment{
67 TransactionsMerkleRoot: merkleRoot,
68 TransactionStatusHash: txStatusHash,
71 Transactions: []*types.Tx{tx},
76 func testNetGenesisBlock() *types.Block {
78 txStatus := bc.NewTransactionStatus()
79 if err := txStatus.SetStatus(0, false); err != nil {
80 log.Panicf(err.Error())
82 txStatusHash, err := types.TxStatusMerkleRoot(txStatus.VerifyStatus)
84 log.Panicf("fail on calc genesis tx status merkle root")
87 merkleRoot, err := types.TxMerkleRoot([]*bc.Tx{tx.Tx})
89 log.Panicf("fail on calc genesis tx merkel root")
92 block := &types.Block{
93 BlockHeader: types.BlockHeader{
96 Timestamp: 1561000000001,
97 BlockCommitment: types.BlockCommitment{
98 TransactionsMerkleRoot: merkleRoot,
99 TransactionStatusHash: txStatusHash,
102 Transactions: []*types.Tx{tx},
107 func soloNetGenesisBlock() *types.Block {
109 txStatus := bc.NewTransactionStatus()
110 if err := txStatus.SetStatus(0, false); err != nil {
111 log.Panicf(err.Error())
113 txStatusHash, err := types.TxStatusMerkleRoot(txStatus.VerifyStatus)
115 log.Panicf("fail on calc genesis tx status merkle root")
118 merkleRoot, err := types.TxMerkleRoot([]*bc.Tx{tx.Tx})
120 log.Panicf("fail on calc genesis tx merkel root")
123 block := &types.Block{
124 BlockHeader: types.BlockHeader{
127 Timestamp: 1561000000000,
128 BlockCommitment: types.BlockCommitment{
129 TransactionsMerkleRoot: merkleRoot,
130 TransactionStatusHash: txStatusHash,
133 Transactions: []*types.Tx{tx},
138 // GenesisBlock will return genesis block
139 func GenesisBlock() *types.Block {
140 return map[string]func() *types.Block{
141 "main": mainNetGenesisBlock,
142 "test": testNetGenesisBlock,
143 "solo": soloNetGenesisBlock,
144 "vapor": soloNetGenesisBlock,
145 }[consensus.ActiveNetParams.Name]()