package config
import (
- "bytes"
- "crypto/sha256"
"encoding/hex"
log "github.com/sirupsen/logrus"
"github.com/vapor/consensus"
- "github.com/vapor/crypto/ed25519"
+ "github.com/vapor/crypto"
"github.com/vapor/crypto/ed25519/chainkd"
"github.com/vapor/protocol/bc"
"github.com/vapor/protocol/bc/types"
"github.com/vapor/protocol/vm/vmutil"
)
-func commitToArguments() (res *[32]byte) {
- var fedpegPubkeys []ed25519.PublicKey
- for _, xpub := range consensus.ActiveNetParams.FedpegXPubs {
- fedpegPubkeys = append(fedpegPubkeys, xpub.PublicKey())
+func FederationProgrom(c *Config) []byte {
+ pubKeys := chainkd.XPubKeys(c.Federation.Xpubs)
+ fedpegScript, err := vmutil.P2SPMultiSigProgram(pubKeys, c.Federation.Quorum)
+ if err != nil {
+ log.Panicf("Failed generate federation scirpt for federation")
}
- fedpegScript, _ := vmutil.P2SPMultiSigProgram(fedpegPubkeys, len(fedpegPubkeys))
- var buffer bytes.Buffer
- for _, address := range CommonConfig.Consensus.Dpos.Signers {
- redeemContract := address.ScriptAddress()
- buffer.Write(redeemContract)
+ scriptHash := crypto.Sha256(fedpegScript)
+
+ control, err := vmutil.P2WSHProgram(scriptHash)
+ if err != nil {
+ log.Panicf("Fail converts scriptHash to program on FederationProgrom: %v", err)
}
- hasher := sha256.New()
- hasher.Write(fedpegScript)
- hasher.Write(buffer.Bytes())
- resSlice := hasher.Sum(nil)
- res = new([32]byte)
- copy(res[:], resSlice)
- return
+ return control
}
-func genesisTx() *types.Tx {
-
+func GenesisTx() *types.Tx {
contract, err := hex.DecodeString("00148c9d063ff74ee6d9ffa88d83aeb038068366c4c4")
if err != nil {
log.Panicf("fail on decode genesis tx output control program")
}
- coinbaseInput := commitToArguments()
+ coinbaseInput := FederationProgrom(CommonConfig)
+
txData := types.TxData{
Version: 1,
Inputs: []*types.TxInput{
- // Any consensus-related values that are command-line set can be added here for anti-footgun
types.NewCoinbaseInput(coinbaseInput[:]),
- //types.NewCoinbaseInput([]byte("Information is power. -- Jan/11/2013. Computing is power. -- Apr/24/2018.")),
},
Outputs: []*types.TxOutput{
- types.NewTxOutput(*consensus.BTMAssetID, consensus.InitialBlockSubsidy, contract),
+ types.NewIntraChainOutput(*consensus.BTMAssetID, consensus.InitialBlockSubsidy, contract),
},
}
-
return types.NewTx(txData)
}
func mainNetGenesisBlock() *types.Block {
- tx := genesisTx()
+ tx := GenesisTx()
txStatus := bc.NewTransactionStatus()
if err := txStatus.SetStatus(0, false); err != nil {
log.Panicf(err.Error())
log.Panicf("fail on calc genesis tx merkel root")
}
- var xPrv chainkd.XPrv
- if CommonConfig.Consensus.Dpos.XPrv == "" {
- log.Panicf("Signer is empty")
- }
- xPrv.UnmarshalText([]byte(CommonConfig.Consensus.Dpos.XPrv))
- b, _ := xPrv.XPub().MarshalText()
-
block := &types.Block{
BlockHeader: types.BlockHeader{
Version: 1,
Height: 0,
- Timestamp: 1524549600,
+ Timestamp: 1524549600000,
BlockCommitment: types.BlockCommitment{
TransactionsMerkleRoot: merkleRoot,
TransactionStatusHash: txStatusHash,
},
- Coinbase: b,
},
Transactions: []*types.Tx{tx},
}
}
func testNetGenesisBlock() *types.Block {
- tx := genesisTx()
+ tx := GenesisTx()
txStatus := bc.NewTransactionStatus()
if err := txStatus.SetStatus(0, false); err != nil {
log.Panicf(err.Error())
log.Panicf("fail on calc genesis tx merkel root")
}
- var xPrv chainkd.XPrv
- if CommonConfig.Consensus.Dpos.XPrv == "" {
- log.Panicf("Signer is empty")
- }
- xPrv.UnmarshalText([]byte(CommonConfig.Consensus.Dpos.XPrv))
- b, _ := xPrv.XPub().MarshalText()
-
block := &types.Block{
BlockHeader: types.BlockHeader{
Version: 1,
Height: 0,
- Timestamp: 1528945000,
+ Timestamp: 1528945000000,
BlockCommitment: types.BlockCommitment{
TransactionsMerkleRoot: merkleRoot,
TransactionStatusHash: txStatusHash,
},
- Coinbase: b,
},
Transactions: []*types.Tx{tx},
}
}
func soloNetGenesisBlock() *types.Block {
- tx := genesisTx()
+ tx := GenesisTx()
txStatus := bc.NewTransactionStatus()
if err := txStatus.SetStatus(0, false); err != nil {
log.Panicf(err.Error())
log.Panicf("fail on calc genesis tx merkel root")
}
- var xPrv chainkd.XPrv
- if CommonConfig.Consensus.Dpos.XPrv == "" {
- log.Panicf("Signer is empty")
- }
- xPrv.UnmarshalText([]byte(CommonConfig.Consensus.Dpos.XPrv))
- b, _ := xPrv.XPub().MarshalText()
-
block := &types.Block{
BlockHeader: types.BlockHeader{
Version: 1,
Height: 0,
- Timestamp: 1528945000,
+ Timestamp: 1528945000000,
BlockCommitment: types.BlockCommitment{
TransactionsMerkleRoot: merkleRoot,
TransactionStatusHash: txStatusHash,
},
- Coinbase: b,
},
Transactions: []*types.Tx{tx},
}
// GenesisBlock will return genesis block
func GenesisBlock() *types.Block {
return map[string]func() *types.Block{
- "main": mainNetGenesisBlock,
- "test": testNetGenesisBlock,
- "solo": soloNetGenesisBlock,
+ "main": mainNetGenesisBlock,
+ "test": testNetGenesisBlock,
+ "solo": soloNetGenesisBlock,
+ "vapor": soloNetGenesisBlock,
}[consensus.ActiveNetParams.Name]()
}