package core
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
type Input struct {
|
|
}
|
|
type Output struct {
|
|
}
|
|
|
|
// Tx holds the data structure of a transaction
|
|
type Tx struct {
|
|
From Address
|
|
To Address
|
|
InputCount uint64
|
|
Inputs []Input
|
|
Outputs []Output
|
|
}
|
|
|
|
func NewTx(from, to Address, in []Input, out []Output) *Tx {
|
|
tx := &Tx{
|
|
From: from,
|
|
To: to,
|
|
InputCount: uint64(len(in)),
|
|
Inputs: in,
|
|
Outputs: out,
|
|
}
|
|
return tx
|
|
}
|
|
|
|
// Block holds the data structure for the block
|
|
type Block struct {
|
|
Height uint64
|
|
PrevHash Hash
|
|
NextHash Hash
|
|
Txs []Tx
|
|
Miner Address
|
|
Timestamp time.Time
|
|
Nonce uint64
|
|
Hash Hash
|
|
Signature []byte
|
|
}
|
|
|
|
// Bytes outputs a byte array containing the data of the Block
|
|
func (blk Block) Bytes() []byte {
|
|
b, _ := json.Marshal(blk)
|
|
return b
|
|
}
|
|
|
|
func (blk *Block) GetNonce() uint64 {
|
|
return blk.Nonce
|
|
}
|
|
|
|
func (blk *Block) IncrementNonce() {
|
|
blk.Nonce++
|
|
}
|
|
func (block *Block) CalculatePoW(difficulty int) error {
|
|
hash := HashBytes(block.Bytes())
|
|
for !CheckPoW(hash, difficulty) {
|
|
block.IncrementNonce()
|
|
hash = HashBytes(block.Bytes())
|
|
}
|
|
block.Hash = hash
|
|
return nil
|
|
}
|
|
|
|
func BlockFromBytes(b []byte) (*Block, error) {
|
|
var block *Block
|
|
err := json.Unmarshal(b, &block)
|
|
return block, err
|
|
}
|