arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
slowlorisdb/core/block.go
core/block.goRaw
  1package core
  2
  3import (
  4	"crypto/ecdsa"
  5	"encoding/json"
  6	"time"
  7)
  8
  9type Input struct {
 10}
 11type Output struct {
 12}
 13
 14// Tx holds the data structure of a transaction
 15type Tx struct {
 16	From       Address
 17	To         Address
 18	InputCount uint64
 19	Inputs     []Input
 20	Outputs    []Output
 21}
 22
 23func NewTx(from, to Address, in []Input, out []Output) *Tx {
 24	tx := &Tx{
 25		From:       from,
 26		To:         to,
 27		InputCount: uint64(len(in)),
 28		Inputs:     in,
 29		Outputs:    out,
 30	}
 31	return tx
 32}
 33
 34// Block holds the data structure for the block
 35type Block struct {
 36	Height    uint64
 37	PrevHash  Hash
 38	NextHash  Hash
 39	Txs       []Tx
 40	Miner     Address
 41	Timestamp time.Time
 42	Nonce     uint64
 43	Hash      Hash
 44	Signature []byte
 45}
 46
 47func (block Block) Copy() *Block {
 48	return &Block{
 49		Height:    block.Height,
 50		PrevHash:  block.PrevHash,
 51		NextHash:  block.NextHash,
 52		Txs:       block.Txs,
 53		Miner:     block.Miner,
 54		Timestamp: block.Timestamp,
 55		Nonce:     block.Nonce,
 56		Hash:      block.Hash,
 57		Signature: block.Signature,
 58	}
 59}
 60
 61// Bytes outputs a byte array containing the data of the Block
 62func (blk Block) Bytes() []byte {
 63	b, _ := json.Marshal(blk)
 64	return b
 65}
 66
 67func (blk *Block) GetNonce() uint64 {
 68	return blk.Nonce
 69}
 70
 71func (blk *Block) IncrementNonce() {
 72	blk.Nonce++
 73}
 74func (block *Block) CalculatePoW(difficulty uint64) error {
 75	blockCopy := block.Copy()
 76	blockCopy.Hash = Hash{}
 77
 78	hash := HashBytes(blockCopy.Bytes())
 79	for !CheckPoW(hash, difficulty) {
 80		blockCopy.IncrementNonce()
 81		hash = HashBytes(blockCopy.Bytes())
 82	}
 83	block.Hash = hash
 84	block.Nonce = blockCopy.Nonce
 85	return nil
 86}
 87
 88func CheckBlockPoW(block *Block, difficulty uint64) bool {
 89	blockCopy := block.Copy()
 90	blockCopy.Hash = Hash{}
 91	blockCopy.Signature = []byte{}
 92	return CheckPoW(HashBytes(blockCopy.Bytes()), difficulty)
 93}
 94
 95func VerifyBlockSignature(pubK *ecdsa.PublicKey, block *Block) bool {
 96	sig, err := SignatureFromBytes(block.Signature)
 97	if err != nil {
 98		return false
 99	}
100
101	return VerifySignature(pubK, block.Hash[:], *sig)
102}
103
104func BlockFromBytes(b []byte) (*Block, error) {
105	var block *Block
106	err := json.Unmarshal(b, &block)
107	return block, err
108}