From 01963a8f413af3151955edc97de5be59d45f159a Mon Sep 17 00:00:00 2001 From: arnaucube Date: Sun, 7 Apr 2019 15:57:01 +0200 Subject: [PATCH] node block PoW, sign and verify --- core/block.go | 12 ++++++++++++ node/node.go | 6 +++++- node/node_test.go | 39 ++++++++++++++++++++++----------------- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/core/block.go b/core/block.go index 068e373..2d8a655 100644 --- a/core/block.go +++ b/core/block.go @@ -1,6 +1,7 @@ package core import ( + "crypto/ecdsa" "encoding/json" "time" ) @@ -80,15 +81,26 @@ func (block *Block) CalculatePoW(difficulty uint64) error { hash = HashBytes(blockCopy.Bytes()) } block.Hash = hash + block.Nonce = blockCopy.Nonce return nil } func CheckBlockPoW(block *Block, difficulty uint64) bool { blockCopy := block.Copy() blockCopy.Hash = Hash{} + blockCopy.Signature = []byte{} return CheckPoW(HashBytes(blockCopy.Bytes()), difficulty) } +func VerifyBlockSignature(pubK *ecdsa.PublicKey, block *Block) bool { + sig, err := SignatureFromBytes(block.Signature) + if err != nil { + return false + } + + return VerifySignature(pubK, block.Hash[:], *sig) +} + func BlockFromBytes(b []byte) (*Block, error) { var block *Block err := json.Unmarshal(b, &block) diff --git a/node/node.go b/node/node.go index 8fbc9ca..2610348 100644 --- a/node/node.go +++ b/node/node.go @@ -35,6 +35,10 @@ func (node *Node) Sign(m []byte) (*core.Signature, error) { return core.Sign(node.PrivK, m) } +func (node *Node) SignBlock(block *core.Block) (*core.Signature, error) { + return core.Sign(node.PrivK, block.Hash[:]) +} + func (node *Node) AddToPendingTxs(tx core.Tx) { node.PendingTxs = append(node.PendingTxs, tx) } @@ -45,7 +49,7 @@ func (node *Node) BlockFromPendingTxs() (*core.Block, error) { if err != nil { return nil, err } - sig, err := node.Sign(block.Bytes()) + sig, err := node.SignBlock(block) if err != nil { return nil, err } diff --git a/node/node_test.go b/node/node_test.go index 7eec9ec..db4d53c 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -51,23 +51,28 @@ func TestBlockFromPendingTxs(t *testing.T) { tx := core.NewTx(addr0, addr1, []core.Input{}, []core.Output{}) node.AddToPendingTxs(*tx) block, err := node.BlockFromPendingTxs() + assert.Nil(t, err) assert.True(t, core.CheckBlockPoW(block, node.Bc.Difficulty)) - // TODO add VerifyBlockSignature + assert.True(t, core.VerifyBlockSignature(&node.PrivK.PublicKey, block)) } -// func TestBlockFromPendingTxsIteration(t *testing.T) { -// dir, err := ioutil.TempDir("", "db") -// assert.Nil(t, err) -// db, err := db.New(dir) -// assert.Nil(t, err) -// -// node, err := NewNode(db, uint64(1)) -// assert.Nil(t, err) -// -// addr0 := core.Address(core.HashBytes([]byte("addr0"))) -// addr1 := core.Address(core.HashBytes([]byte("addr1"))) -// for i := 0; i < 10; i++ { -// tx := core.NewTx(addr0, addr1, []core.Input{}, []core.Output{}) -// -// } -// } +func TestBlockFromPendingTxsIteration(t *testing.T) { + dir, err := ioutil.TempDir("", "db") + assert.Nil(t, err) + db, err := db.New(dir) + assert.Nil(t, err) + + node, err := NewNode(db, uint64(1)) + assert.Nil(t, err) + + addr0 := core.Address(core.HashBytes([]byte("addr0"))) + addr1 := core.Address(core.HashBytes([]byte("addr1"))) + for i := 0; i < 10; i++ { + tx := core.NewTx(addr0, addr1, []core.Input{}, []core.Output{}) + node.AddToPendingTxs(*tx) + } + block, err := node.BlockFromPendingTxs() + assert.Nil(t, err) + assert.True(t, core.CheckBlockPoW(block, node.Bc.Difficulty)) + assert.True(t, core.VerifyBlockSignature(&node.PrivK.PublicKey, block)) +}