package blocks
|
|
|
|
import (
|
|
. "github.com/tendermint/tendermint/binary"
|
|
"github.com/tendermint/tendermint/merkle"
|
|
"io"
|
|
)
|
|
|
|
|
|
/* Block */
|
|
|
|
type Block struct {
|
|
Header
|
|
Validation
|
|
Data
|
|
// Checkpoint
|
|
}
|
|
|
|
func ReadBlock(r io.Reader) *Block {
|
|
return &Block{
|
|
Header: ReadHeader(r),
|
|
Validation: ReadValidation(r),
|
|
Data: ReadData(r),
|
|
}
|
|
}
|
|
|
|
func (self *Block) Validate() bool {
|
|
return false
|
|
}
|
|
|
|
func (self *Block) WriteTo(w io.Writer) (n int64, err error) {
|
|
n, err = WriteOnto(&self.Header, w, n, err)
|
|
n, err = WriteOnto(&self.Validation, w, n, err)
|
|
n, err = WriteOnto(&self.Data, w, n, err)
|
|
return
|
|
}
|
|
|
|
|
|
/* Block > Header */
|
|
|
|
type Header struct {
|
|
Name String
|
|
Height UInt64
|
|
Fees UInt64
|
|
Time UInt64
|
|
PrevHash ByteSlice
|
|
ValidationHash ByteSlice
|
|
DataHash ByteSlice
|
|
}
|
|
|
|
func ReadHeader(r io.Reader) Header {
|
|
return Header{
|
|
Name: ReadString(r),
|
|
Height: ReadUInt64(r),
|
|
Fees: ReadUInt64(r),
|
|
Time: ReadUInt64(r),
|
|
PrevHash: ReadByteSlice(r),
|
|
ValidationHash: ReadByteSlice(r),
|
|
DataHash: ReadByteSlice(r),
|
|
}
|
|
}
|
|
|
|
func (self *Header) WriteTo(w io.Writer) (n int64, err error) {
|
|
n, err = WriteOnto(self.Name, w, n, err)
|
|
n, err = WriteOnto(self.Height, w, n, err)
|
|
n, err = WriteOnto(self.Fees, w, n, err)
|
|
n, err = WriteOnto(self.Time, w, n, err)
|
|
n, err = WriteOnto(self.PrevHash, w, n, err)
|
|
n, err = WriteOnto(self.ValidationHash, w, n, err)
|
|
n, err = WriteOnto(self.DataHash, w, n, err)
|
|
return
|
|
}
|
|
|
|
|
|
/* Block > Validation */
|
|
|
|
type Validation struct {
|
|
Signatures []Signature
|
|
Adjustments []Adjustment
|
|
}
|
|
|
|
func ReadValidation(r io.Reader) Validation {
|
|
numSigs := int(ReadUInt64(r))
|
|
numAdjs := int(ReadUInt64(r))
|
|
sigs := make([]Signature, 0, numSigs)
|
|
for i:=0; i<numSigs; i++ {
|
|
sigs = append(sigs, ReadSignature(r))
|
|
}
|
|
adjs := make([]Adjustment, 0, numAdjs)
|
|
for i:=0; i<numSigs; i++ {
|
|
adjs = append(adjs, ReadAdjustment(r))
|
|
}
|
|
return Validation{
|
|
Signatures: sigs,
|
|
Adjustments: adjs,
|
|
}
|
|
}
|
|
|
|
func (self *Validation) WriteTo(w io.Writer) (n int64, err error) {
|
|
n, err = WriteOnto(UInt64(len(self.Signatures)), w, n, err)
|
|
n, err = WriteOnto(UInt64(len(self.Adjustments)), w, n, err)
|
|
for _, sig := range self.Signatures {
|
|
n, err = WriteOnto(sig, w, n, err)
|
|
}
|
|
for _, adj := range self.Adjustments {
|
|
n, err = WriteOnto(adj, w, n, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
/* Block > Data */
|
|
|
|
type Data struct {
|
|
Txs []Tx
|
|
}
|
|
|
|
func ReadData(r io.Reader) Data {
|
|
numTxs := int(ReadUInt64(r))
|
|
txs := make([]Tx, 0, numTxs)
|
|
for i:=0; i<numTxs; i++ {
|
|
txs = append(txs, ReadTx(r))
|
|
}
|
|
return Data{txs}
|
|
}
|
|
|
|
func (self *Data) WriteTo(w io.Writer) (n int64, err error) {
|
|
n, err = WriteOnto(UInt64(len(self.Txs)), w, n, err)
|
|
for _, tx := range self.Txs {
|
|
n, err = WriteOnto(tx, w, n, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (self *Data) MerkleHash() ByteSlice {
|
|
bs := make([]Binary, 0, len(self.Txs))
|
|
for i, tx := range self.Txs {
|
|
bs[i] = Binary(tx)
|
|
}
|
|
return merkle.HashFromBinarySlice(bs)
|
|
}
|