|
@ -0,0 +1,244 @@ |
|
|
|
|
|
package blocks |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
|
. "github.com/tendermint/tendermint/binary" |
|
|
|
|
|
"github.com/tendermint/tendermint/merkle" |
|
|
|
|
|
"io" |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
/* BlockData */ |
|
|
|
|
|
|
|
|
|
|
|
type BlockData struct { |
|
|
|
|
|
Txs []Tx |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *BlockData) WriteTo(w io.Writer) (n int64, err error) { |
|
|
|
|
|
var n_ int64 |
|
|
|
|
|
for _, tx := range self.Txs { |
|
|
|
|
|
n_, err = tx.WriteTo(w) |
|
|
|
|
|
n += n_ |
|
|
|
|
|
if err != nil { return } |
|
|
|
|
|
} |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *BlockData) Hash() ByteSlice { |
|
|
|
|
|
bs := make([]Binary, 0, len(self.Txs)) |
|
|
|
|
|
for i, tx := range self.Txs { |
|
|
|
|
|
bs[i] = Binary(tx) |
|
|
|
|
|
} |
|
|
|
|
|
return merkle.HashFromBinarySlice(bs) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *BlockData) AddTx(tx Tx) { |
|
|
|
|
|
self.Txs = append(self.Txs, tx) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func NewBlockData() *BlockData { |
|
|
|
|
|
return &BlockData{} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
|
|
|
|
|
|
|
Tx wire format: |
|
|
|
|
|
|
|
|
|
|
|
|T|L...|MMM...|A...|SSS...| |
|
|
|
|
|
|
|
|
|
|
|
T type of the tx (1 byte) |
|
|
|
|
|
L length of M, varint encoded (1+ bytes) |
|
|
|
|
|
M Tx bytes (L bytes) |
|
|
|
|
|
A account number, varint encoded (1+ bytes) |
|
|
|
|
|
S signature of all prior bytes (32 bytes) |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
type Tx interface { |
|
|
|
|
|
Binary |
|
|
|
|
|
Type() Byte |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const ( |
|
|
|
|
|
TX_TYPE_SEND = Byte(0x00) |
|
|
|
|
|
TX_TYPE_BOND = Byte(0x11) |
|
|
|
|
|
TX_TYPE_UNBOND = Byte(0x12) |
|
|
|
|
|
TX_TYPE_NAME = Byte(0x20) |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
/* SendTx < Tx */ |
|
|
|
|
|
|
|
|
|
|
|
type SendTx struct { |
|
|
|
|
|
Signature |
|
|
|
|
|
Fee UInt64 |
|
|
|
|
|
To AccountId |
|
|
|
|
|
Amount UInt64 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *SendTx) Type() Byte { |
|
|
|
|
|
return TX_TYPE_SEND |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *SendTx) ByteSize() int { |
|
|
|
|
|
return 1 + |
|
|
|
|
|
self.Signature.ByteSize() + |
|
|
|
|
|
self.Fee.ByteSize() + |
|
|
|
|
|
self.To.ByteSize() + |
|
|
|
|
|
self.Amount.ByteSize() |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *SendTx) Equals(other Binary) bool { |
|
|
|
|
|
if o, ok := other.(*SendTx); ok { |
|
|
|
|
|
return self.Signature.Equals(&o.Signature) && |
|
|
|
|
|
self.Fee.Equals(o.Fee) && |
|
|
|
|
|
self.To.Equals(o.To) && |
|
|
|
|
|
self.Amount.Equals(o.Amount) |
|
|
|
|
|
} else { |
|
|
|
|
|
return false |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *SendTx) 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.To.WriteTo(w) |
|
|
|
|
|
n += n_; if err != nil { return n, err } |
|
|
|
|
|
n_, err = self.Amount.WriteTo(w) |
|
|
|
|
|
n += n_; return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* BondTx < Tx */ |
|
|
|
|
|
|
|
|
|
|
|
type BondTx struct { |
|
|
|
|
|
Signature |
|
|
|
|
|
Fee UInt64 |
|
|
|
|
|
UnbondTo AccountId |
|
|
|
|
|
Amount UInt64 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *BondTx) Type() Byte { |
|
|
|
|
|
return TX_TYPE_BOND |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *BondTx) ByteSize() int { |
|
|
|
|
|
return 1 + |
|
|
|
|
|
self.Signature.ByteSize() + |
|
|
|
|
|
self.Fee.ByteSize() + |
|
|
|
|
|
self.UnbondTo.ByteSize() + |
|
|
|
|
|
self.Amount.ByteSize() |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *BondTx) Equals(other Binary) bool { |
|
|
|
|
|
if o, ok := other.(*BondTx); ok { |
|
|
|
|
|
return self.Signature.Equals(&o.Signature) && |
|
|
|
|
|
self.Fee.Equals(o.Fee) && |
|
|
|
|
|
self.UnbondTo.Equals(o.UnbondTo) && |
|
|
|
|
|
self.Amount.Equals(o.Amount) |
|
|
|
|
|
} else { |
|
|
|
|
|
return false |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *BondTx) 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_; return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* UnbondTx < Tx */ |
|
|
|
|
|
|
|
|
|
|
|
type UnbondTx struct { |
|
|
|
|
|
Signature |
|
|
|
|
|
Fee UInt64 |
|
|
|
|
|
Amount UInt64 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *UnbondTx) Type() Byte { |
|
|
|
|
|
return TX_TYPE_UNBOND |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *UnbondTx) ByteSize() int { |
|
|
|
|
|
return 1 + |
|
|
|
|
|
self.Signature.ByteSize() + |
|
|
|
|
|
self.Fee.ByteSize() + |
|
|
|
|
|
self.Amount.ByteSize() |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *UnbondTx) Equals(other Binary) bool { |
|
|
|
|
|
if o, ok := other.(*UnbondTx); ok { |
|
|
|
|
|
return self.Signature.Equals(&o.Signature) && |
|
|
|
|
|
self.Fee.Equals(o.Fee) && |
|
|
|
|
|
self.Amount.Equals(o.Amount) |
|
|
|
|
|
} else { |
|
|
|
|
|
return false |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *UnbondTx) 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_; return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* NameTx < Tx */ |
|
|
|
|
|
|
|
|
|
|
|
type NameTx struct { |
|
|
|
|
|
Signature |
|
|
|
|
|
Fee UInt64 |
|
|
|
|
|
Name String |
|
|
|
|
|
PubKey ByteSlice |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *NameTx) Type() Byte { |
|
|
|
|
|
return TX_TYPE_NAME |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *NameTx) ByteSize() int { |
|
|
|
|
|
return 1 + |
|
|
|
|
|
self.Signature.ByteSize() + |
|
|
|
|
|
self.Fee.ByteSize() + |
|
|
|
|
|
self.Name.ByteSize() + |
|
|
|
|
|
self.PubKey.ByteSize() |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *NameTx) Equals(other Binary) bool { |
|
|
|
|
|
if o, ok := other.(*NameTx); ok { |
|
|
|
|
|
return self.Signature.Equals(&o.Signature) && |
|
|
|
|
|
self.Fee.Equals(o.Fee) && |
|
|
|
|
|
self.Name.Equals(o.Name) && |
|
|
|
|
|
self.PubKey.Equals(o.PubKey) |
|
|
|
|
|
} else { |
|
|
|
|
|
return false |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (self *NameTx) 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.Name.WriteTo(w) |
|
|
|
|
|
n += n_; if err != nil { return n, err } |
|
|
|
|
|
n_, err = self.PubKey.WriteTo(w) |
|
|
|
|
|
n += n_; return |
|
|
|
|
|
} |