node block PoW, sign and verify
arnaucube arnaucube@gmail.com
Sun, 07 Apr 2019 15:57:01 +0200
3 files changed,
39 insertions(+),
18 deletions(-)
M
core/block.go
→
core/block.go
@@ -1,6 +1,7 @@
package core import ( + "crypto/ecdsa" "encoding/json" "time" )@@ -80,13 +81,24 @@ blockCopy.IncrementNonce()
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) {
M
node/node.go
→
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 @@ err := block.CalculatePoW(node.Bc.Difficulty)
if err != nil { return nil, err } - sig, err := node.Sign(block.Bytes()) + sig, err := node.SignBlock(block) if err != nil { return nil, err }
M
node/node_test.go
→
node/node_test.go
@@ -51,23 +51,28 @@ addr1 := core.Address(core.HashBytes([]byte("addr1")))
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)) +}