genesis block should be fixed

pull/146/head
Minh Doan 6 years ago committed by Minh Doan
parent 7ba2041ca5
commit 276d314dd1
  1. 17
      blockchain/block.go
  2. 2
      blockchain/blockchain.go
  3. 2
      blockchain/blockchain_test.go
  4. 1
      consensus/consensus_leader.go
  5. 2
      node/node_handler.go

@ -12,6 +12,11 @@ import (
"github.com/harmony-one/harmony/utils" "github.com/harmony-one/harmony/utils"
) )
const (
// TimeStampForGenesisBlock is the constant timestamp for the genesis block.
TimeStampForGenesisBlock = 0
)
// Block is a block in the blockchain that contains block headers, transactions and signature etc. // Block is a block in the blockchain that contains block headers, transactions and signature etc.
type Block struct { type Block struct {
// Header // Header
@ -115,14 +120,18 @@ func (b *Block) CalculateBlockHash() []byte {
} }
// NewBlock creates and returns a new block. // NewBlock creates and returns a new block.
func NewBlock(transactions []*Transaction, prevBlockHash [32]byte, shardID uint32) *Block { func NewBlock(transactions []*Transaction, prevBlockHash [32]byte, shardID uint32, isGenesisBlock bool) *Block {
numTxs := int32(len(transactions)) numTxs := int32(len(transactions))
var txIDs [][32]byte var txIDs [][32]byte
for _, tx := range transactions { for _, tx := range transactions {
txIDs = append(txIDs, tx.ID) txIDs = append(txIDs, tx.ID)
} }
block := &Block{Timestamp: time.Now().Unix(), PrevBlockHash: prevBlockHash, NumTransactions: numTxs, TransactionIds: txIDs, Transactions: transactions, ShardID: shardID, Hash: [32]byte{}} timestamp := time.Now().Unix()
if isGenesisBlock {
timestamp = TimeStampForGenesisBlock
}
block := &Block{Timestamp: timestamp, PrevBlockHash: prevBlockHash, NumTransactions: numTxs, TransactionIds: txIDs, Transactions: transactions, ShardID: shardID, Hash: [32]byte{}}
copy(block.Hash[:], block.CalculateBlockHash()[:]) copy(block.Hash[:], block.CalculateBlockHash()[:])
return block return block
@ -130,7 +139,7 @@ func NewBlock(transactions []*Transaction, prevBlockHash [32]byte, shardID uint3
// NewGenesisBlock creates and returns genesis Block. // NewGenesisBlock creates and returns genesis Block.
func NewGenesisBlock(coinbase *Transaction, shardID uint32) *Block { func NewGenesisBlock(coinbase *Transaction, shardID uint32) *Block {
return NewBlock([]*Transaction{coinbase}, [32]byte{}, shardID) return NewBlock([]*Transaction{coinbase}, [32]byte{}, shardID, true)
} }
// NewStateBlock creates and returns a state Block based on utxo pool. // NewStateBlock creates and returns a state Block based on utxo pool.
@ -157,7 +166,7 @@ func NewStateBlock(utxoPool *UTXOPool, numBlocks, numTxs int32) *Block {
stateTransactions = append(stateTransactions, stateTransaction) stateTransactions = append(stateTransactions, stateTransaction)
} }
} }
newBlock := NewBlock(stateTransactions, [32]byte{}, utxoPool.ShardID) newBlock := NewBlock(stateTransactions, [32]byte{}, utxoPool.ShardID, false)
newBlock.State = &State{NumBlocks: numBlocks, NumTransactions: numTxs} newBlock.State = &State{NumBlocks: numBlocks, NumTransactions: numTxs}
return newBlock return newBlock
} }

@ -195,7 +195,7 @@ func (bc *Blockchain) NewUTXOTransaction(priKey kyber.Scalar, from, to [20]byte,
func (bc *Blockchain) AddNewUserTransfer(utxoPool *UTXOPool, priKey kyber.Scalar, from, to [20]byte, amount int, shardID uint32) bool { func (bc *Blockchain) AddNewUserTransfer(utxoPool *UTXOPool, priKey kyber.Scalar, from, to [20]byte, amount int, shardID uint32) bool {
tx := bc.NewUTXOTransaction(priKey, from, to, amount, shardID) tx := bc.NewUTXOTransaction(priKey, from, to, amount, shardID)
if tx != nil { if tx != nil {
newBlock := NewBlock([]*Transaction{tx}, bc.Blocks[len(bc.Blocks)-1].Hash, shardID) newBlock := NewBlock([]*Transaction{tx}, bc.Blocks[len(bc.Blocks)-1].Hash, shardID, false)
if bc.VerifyNewBlockAndUpdate(utxoPool, newBlock) { if bc.VerifyNewBlockAndUpdate(utxoPool, newBlock) {
return true return true
} }

@ -84,7 +84,7 @@ func TestVerifyNewBlock(t *testing.T) {
if tx == nil { if tx == nil {
t.Error("failed to create a new transaction.") t.Error("failed to create a new transaction.")
} }
newBlock := NewBlock([]*Transaction{tx}, bc.Blocks[len(bc.Blocks)-1].Hash, 0) newBlock := NewBlock([]*Transaction{tx}, bc.Blocks[len(bc.Blocks)-1].Hash, 0, false)
if !bc.VerifyNewBlockAndUpdate(utxoPool, newBlock) { if !bc.VerifyNewBlockAndUpdate(utxoPool, newBlock) {
t.Error("failed to add a new valid block.") t.Error("failed to add a new valid block.")

@ -124,6 +124,7 @@ func (consensus *Consensus) ProcessMessageLeader(message []byte) {
} }
// processStartConsensusMessage is the handler for message which triggers consensus process. // processStartConsensusMessage is the handler for message which triggers consensus process.
// TODO(minh): clean-up. this function is never called.
func (consensus *Consensus) processStartConsensusMessage(payload []byte) { func (consensus *Consensus) processStartConsensusMessage(payload []byte) {
// TODO: remove these method after testnet // TODO: remove these method after testnet
tx := blockchain.NewCoinbaseTX([20]byte{0}, "y", 0) tx := blockchain.NewCoinbaseTX([20]byte{0}, "y", 0)

@ -310,7 +310,7 @@ func (node *Node) WaitForConsensusReady(readySignal chan struct{}) {
node.transactionInConsensus = selectedTxs node.transactionInConsensus = selectedTxs
node.CrossTxsInConsensus = crossShardTxAndProofs node.CrossTxsInConsensus = crossShardTxAndProofs
newBlock = blockchain.NewBlock(selectedTxs, node.blockchain.GetLatestBlock().Hash, node.Consensus.ShardID) newBlock = blockchain.NewBlock(selectedTxs, node.blockchain.GetLatestBlock().Hash, node.Consensus.ShardID, false)
break break
} }
} }

Loading…
Cancel
Save