diff --git a/blocks/account.go b/blocks/account.go index 2bc7bc9b..b4f2dd3d 100644 --- a/blocks/account.go +++ b/blocks/account.go @@ -5,49 +5,49 @@ import ( "io" ) -type AccountId interface { - Binary - Type() Byte +type AccountId struct { + Type Byte + Number UInt64 + PubKey ByteSlice } const ( - ACCOUNT_TYPE_NUMBER = Byte(0x00) - ACCOUNT_TYPE_PUBKEY = Byte(0x01) + ACCOUNT_TYPE_NUMBER = Byte(0x01) + ACCOUNT_TYPE_PUBKEY = Byte(0x02) + ACCOUNT_TYPE_BOTH = Byte(0x03) ) func ReadAccountId(r io.Reader) AccountId { - return nil + switch t := ReadByte(r); t { + case ACCOUNT_TYPE_NUMBER: + return AccountId{t, ReadUInt64(r), nil} + case ACCOUNT_TYPE_PUBKEY: + return AccountId{t, 0, ReadByteSlice(r)} + case ACCOUNT_TYPE_BOTH: + return AccountId{t, ReadUInt64(r), ReadByteSlice(r)} + default: + panicf("Unknown AccountId type %x", t) + return AccountId{} + } } -/* AccountNumber < AccountId */ - -type AccountNumber uint64 - -func (self AccountNumber) Type() Byte { - return ACCOUNT_TYPE_NUMBER -} - -func (self AccountNumber) WriteTo(w io.Writer) (n int64, err error) { +func (self *AccountId) WriteTo(w io.Writer) (n int64, err error) { var n_ int64 - n_, err = self.Type().WriteTo(w) + n_, err = self.Type.WriteTo(w) n += n_; if err != nil { return n, err } - n_, err = UInt64(self).WriteTo(w) - n += n_; return + if self.Type == ACCOUNT_TYPE_NUMBER || + self.Type == ACCOUNT_TYPE_BOTH { + n_, err = self.Number.WriteTo(w) + n += n_; if err != nil { return n, err } + } + if self.Type == ACCOUNT_TYPE_PUBKEY || + self.Type == ACCOUNT_TYPE_BOTH { + n_, err = self.PubKey.WriteTo(w) + n += n_; if err != nil { return n, err } + } + return } - -/* AccountPubKey < AccountId */ - -type AccountPubKey []byte - -func (self AccountPubKey) Type() Byte { - return ACCOUNT_TYPE_PUBKEY -} - -func (self AccountPubKey) WriteTo(w io.Writer) (n int64, err error) { - var n_ int64 - n_, err = self.Type().WriteTo(w) - n += n_; if err != nil { return n, err } - n_, err = ByteSlice(self).WriteTo(w) - n += n_; return +func AccountNumber(n UInt64) AccountId { + return AccountId{ACCOUNT_TYPE_NUMBER, n, nil} } diff --git a/blocks/adjustment.go b/blocks/adjustment.go index 0d337316..a7fe705c 100644 --- a/blocks/adjustment.go +++ b/blocks/adjustment.go @@ -24,21 +24,48 @@ const ( ADJ_TYPE_BOND = Byte(0x01) ADJ_TYPE_UNBOND = Byte(0x02) ADJ_TYPE_TIMEOUT = Byte(0x03) - ADJ_TYPE_GUILTOUT = Byte(0x04) + ADJ_TYPE_DUPEOUT = Byte(0x04) ) func ReadAdjustment(r io.Reader) Adjustment { - return nil + switch t := ReadByte(r); t { + case ADJ_TYPE_BOND: + return &Bond{ + Fee: ReadUInt64(r), + UnbondTo: ReadAccountId(r), + Amount: ReadUInt64(r), + Signature: ReadSignature(r), + } + case ADJ_TYPE_UNBOND: + return &Unbond{ + Fee: ReadUInt64(r), + Amount: ReadUInt64(r), + Signature: ReadSignature(r), + } + case ADJ_TYPE_TIMEOUT: + return &Timeout{ + Account: ReadAccountId(r), + Penalty: ReadUInt64(r), + } + case ADJ_TYPE_DUPEOUT: + return &Dupeout{ + VoteA: ReadVote(r), + VoteB: ReadVote(r), + } + default: + panicf("Unknown Adjustment type %x", t) + return nil + } } /* Bond < Adjustment */ type Bond struct { - Signature Fee UInt64 UnbondTo AccountId Amount UInt64 + Signature } func (self *Bond) Type() Byte { @@ -49,13 +76,13 @@ func (self *Bond) WriteTo(w io.Writer) (n int64, err error) { var n_ int64 n_, err = self.Type().WriteTo(w) n += n_; if err != nil { return n, err } - n_, err = self.Signature.WriteTo(w) - n += n_; if err != nil { return n, err } n_, err = self.Fee.WriteTo(w) n += n_; if err != nil { return n, err } n_, err = self.UnbondTo.WriteTo(w) n += n_; if err != nil { return n, err } n_, err = self.Amount.WriteTo(w) + n += n_; if err != nil { return n, err } + n_, err = self.Signature.WriteTo(w) n += n_; return } @@ -63,9 +90,9 @@ func (self *Bond) WriteTo(w io.Writer) (n int64, err error) { /* Unbond < Adjustment */ type Unbond struct { - Signature Fee UInt64 Amount UInt64 + Signature } func (self *Unbond) Type() Byte { @@ -76,11 +103,11 @@ func (self *Unbond) WriteTo(w io.Writer) (n int64, err error) { var n_ int64 n_, err = self.Type().WriteTo(w) n += n_; if err != nil { return n, err } - n_, err = self.Signature.WriteTo(w) - n += n_; if err != nil { return n, err } n_, err = self.Fee.WriteTo(w) n += n_; if err != nil { return n, err } n_, err = self.Amount.WriteTo(w) + n += n_; if err != nil { return n, err } + n_, err = self.Signature.WriteTo(w) n += n_; return } @@ -120,10 +147,8 @@ func (self *Dupeout) Type() Byte { func (self *Dupeout) WriteTo(w io.Writer) (n int64, err error) { var n_ int64 - n_, err = self.Type().WriteTo(w) + n_, err = self.VoteA.WriteTo(w) n += n_; if err != nil { return n, err } - n_, err = self.Account.WriteTo(w) - n += n_; if err != nil { return n, err } - n_, err = self.Penalty.WriteTo(w) + n_, err = self.VoteB.WriteTo(w) n += n_; return } diff --git a/blocks/block.go b/blocks/block.go index f7138435..ad649fb9 100644 --- a/blocks/block.go +++ b/blocks/block.go @@ -2,6 +2,7 @@ package blocks import ( . "github.com/tendermint/tendermint/binary" + "github.com/tendermint/tendermint/merkle" "io" ) @@ -16,7 +17,11 @@ type Block struct { } func ReadBlock(r io.Reader) *Block { - return nil + return &Block{ + Header: ReadHeader(r), + Validation: ReadValidation(r), + Data: ReadData(r), + } } func (self *Block) Validate() bool { @@ -36,8 +41,16 @@ type Header struct { DataHash ByteSlice } -func ReadHeader(r io.Reader) *Header { - return nil +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) { @@ -62,14 +75,43 @@ func (self *Header) WriteTo(w io.Writer) (n int64, err error) { /* Block > Validation */ type Validation struct { - Signatures []*Signature + Signatures []Signature Adjustments []Adjustment } -func ReadValidation(r io.Reader) *Validation { - return nil +func ReadValidation(r io.Reader) Validation { + numSigs := int(ReadUInt64(r)) + numAdjs := int(ReadUInt64(r)) + sigs := make([]Signature, 0, numSigs) + for i:=0; i Data */ @@ -77,16 +119,22 @@ type Data struct { Txs []Tx } -func ReadData(r io.Reader) *Data { - return nil +func ReadData(r io.Reader) Data { + numTxs := int(ReadUInt64(r)) + txs := make([]Tx, 0, numTxs) + for i:=0; i