mirror of
https://github.com/arnaucube/slowlorisdb.git
synced 2026-02-28 05:46:48 +01:00
node block PoW, sign and verify
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user