README ¶
ethutil
The ethutil package contains the ethereum utility library.
Installation
go get github.com/ethereum/ethutil-go
Usage
RLP (Recursive Linear Prefix) Encoding
RLP Encoding is an encoding scheme utilized by the Ethereum project. It encodes any native value or list to string.
More in depth information about the Encoding scheme see the Wiki article.
rlp := ethutil.Encode("doge")
fmt.Printf("%q\n", rlp) // => "\0x83dog"
rlp = ethutil.Encode([]interface{}{"dog", "cat"})
fmt.Printf("%q\n", rlp) // => "\0xc8\0x83dog\0x83cat"
decoded := ethutil.Decode(rlp)
fmt.Println(decoded) // => ["dog" "cat"]
Patricia Trie
Patricie Tree is a merkle trie utilized by the Ethereum project.
More in depth information about the (modified) Patricia Trie can be found on the Wiki.
The patricia trie uses a db as backend and could be anything as long as
it satisfies the Database interface found in ethutil/db.go
.
db := NewDatabase()
// db, root
trie := ethutil.NewTrie(db, "")
trie.Put("puppy", "dog")
trie.Put("horse", "stallion")
trie.Put("do", "verb")
trie.Put("doge", "coin")
// Look up the key "do" in the trie
out := trie.Get("do")
fmt.Println(out) // => verb
trie.Delete("puppy")
The patricia trie, in combination with RLP, provides a robust, cryptographically authenticated data structure that can be used to store all (key, value) bindings.
// ... Create db/trie
// Note that RLP uses interface slices as list
value := ethutil.Encode([]interface{}{"one", 2, "three", []interface{}{42}})
// Store the RLP encoded value of the list
trie.Put("mykey", value)
Value
Value is a Generic Value which is used in combination with RLP data or
([])interface{}
structures. It may serve as a bridge between RLP data
and actual real values and takes care of all the type checking and
casting. Unlike Go's reflect.Value
it does not panic if it's unable to
cast to the requested value. It simple returns the base value of that
type (e.g. Slice()
returns []interface{}, Uint()
return 0, etc).
Creating a new Value
NewEmptyValue()
returns a new *Value with it's initial value set to a
[]interface{}
AppendList()
appends a list to the current value.
Append(v)
appends the value (v) to the current value/list.
val := ethutil.NewEmptyValue().Append(1).Append("2")
val.AppendList().Append(3)
Retrieving values
Get(i)
returns the i
item in the list.
Uint()
returns the value as an unsigned int64.
Slice()
returns the value as a interface slice.
Str()
returns the value as a string.
Bytes()
returns the value as a byte slice.
Len()
assumes current to be a slice and returns its length.
Byte()
returns the value as a single byte.
val := ethutil.NewValue([]interface{}{1,"2",[]interface{}{3}})
val.Get(0).Uint() // => 1
val.Get(1).Str() // => "2"
s := val.Get(2) // => Value([]interface{}{3})
s.Get(0).Uint() // => 3
Decoding
Decoding streams of RLP data is simplified
val := ethutil.NewValueFromBytes(rlpData)
val.Get(0).Uint()
Encoding
Encoding from Value to RLP is done with the Encode
method. The
underlying value can be anything RLP can encode (int, str, lists, bytes)
val := ethutil.NewValue([]interface{}{1,"2",[]interface{}{3}})
rlp := val.Encode()
// Store the rlp data
Store(rlp)
Documentation ¶
Index ¶
- Constants
- Variables
- func AbsolutePath(Datadir string, filename string) string
- func Big(num string) *big.Int
- func BigCopy(src *big.Int) *big.Int
- func BigD(data []byte) *big.Int
- func BigMax(x, y *big.Int) *big.Int
- func BigMin(x, y *big.Int) *big.Int
- func BigPow(a, b int) *big.Int
- func BigToBytes(num *big.Int, base int) []byte
- func BitTest(num *big.Int, i int) bool
- func ByteSliceToInterface(slice [][]byte) (ret []interface{})
- func Bytes2Big(data []byte) *big.Int
- func Bytes2Hex(d []byte) string
- func BytesToNumber(b []byte) uint64
- func Char(c []byte) int
- func CopyBytes(b []byte) (copiedBytes []byte)
- func CurrencyToString(num *big.Int) string
- func Decode(data []byte, pos uint64) (interface{}, uint64)
- func DecodeWithReader(reader *bytes.Buffer) interface{}
- func DefaultAssetPath() string
- func DefaultDataDir() string
- func DeleteFromByteSlice(s [][]byte, hash []byte) [][]byte
- func Encode(object interface{}) []byte
- func ExpandHomePath(p string) (path string)
- func FileExist(filePath string) bool
- func FindFileInArchive(fn string, files []*zip.File) (index int)
- func FirstBitSet(v *big.Int) int
- func FormatData(data string) []byte
- func FromHex(s string) []byte
- func HasHexPrefix(str string) bool
- func Hex2Bytes(str string) []byte
- func Hex2BytesFixed(str string, flen int) []byte
- func IsHex(str string) bool
- func IsWindows() bool
- func LeftPadBytes(slice []byte, l int) []byte
- func LeftPadString(str string, l int) string
- func MakeName(name, version string) string
- func NumberToBytes(num interface{}, bits int) []byte
- func ParseData(data ...interface{}) (ret []byte)
- func ReadFile(f *zip.File) ([]byte, error)
- func ReadVarInt(buff []byte) (ret uint64)
- func Report(extra ...interface{})
- func RightPadBytes(slice []byte, l int) []byte
- func RightPadString(str string, l int) string
- func Rlp(encoder RlpEncode) []byte
- func S256(x *big.Int) *big.Int
- func String2Big(num string) *big.Int
- func StringToByteFunc(str string, cb func(str string) []byte) (ret []byte)
- func ToAddress(slice []byte) (addr []byte)
- func ToHex(b []byte) string
- func U256(x *big.Int) *big.Int
- func WindonizePath(path string) string
- type Address
- type Bytes
- type ConfigManager
- type Database
- type ExtPackage
- type Hash
- type List
- type Manifest
- type RlpEncodable
- type RlpEncode
- type RlpEncodeDecode
- type RlpEncoder
- type StorageSize
- type Value
- func (self *Value) Add(other interface{}) *Value
- func (val *Value) Append(v interface{}) *Value
- func (val *Value) AppendList() *Value
- func (val *Value) BigInt() *big.Int
- func (val *Value) Byte() byte
- func (val *Value) Bytes() []byte
- func (val *Value) Cmp(o *Value) bool
- func (self *Value) Copy() *Value
- func (self *Value) DecodeRLP(s *rlp.Stream) error
- func (self *Value) DeepCmp(o *Value) bool
- func (self *Value) Div(other interface{}) *Value
- func (self *Value) EncodeRLP(w io.Writer) error
- func (val *Value) Err() error
- func (val *Value) Get(idx int) *Value
- func (val *Value) Int() int64
- func (val *Value) IsEmpty() bool
- func (self *Value) IsErr() bool
- func (val *Value) IsList() bool
- func (val *Value) IsNil() bool
- func (val *Value) IsSlice() bool
- func (val *Value) IsStr() bool
- func (val *Value) Len() int
- func (self *Value) Mul(other interface{}) *Value
- func (val *Value) NewIterator() *ValueIterator
- func (self *Value) Pow(other interface{}) *Value
- func (val *Value) Slice() []interface{}
- func (val *Value) SliceFrom(from int) *Value
- func (val *Value) SliceFromTo(from, to int) *Value
- func (val *Value) SliceTo(to int) *Value
- func (val *Value) Str() string
- func (val *Value) String() string
- func (self *Value) Sub(other interface{}) *Value
- func (val *Value) Type() reflect.Kind
- func (val *Value) Uint() uint64
- type ValueIterator
Constants ¶
const ( RlpEmptyList = 0x80 RlpEmptyStr = 0x40 )
Variables ¶
var ( Big1 = big.NewInt(1) Big2 = big.NewInt(2) Big3 = big.NewInt(3) Big0 = big.NewInt(0) BigTrue = Big1 BigFalse = Big0 Big32 = big.NewInt(32) Big256 = big.NewInt(0xff) Big257 = big.NewInt(257) )
Common big integers often used
var ( Douglas = BigPow(10, 42) Einstein = BigPow(10, 21) Ether = BigPow(10, 18) Finney = BigPow(10, 15) Szabo = BigPow(10, 12) Shannon = BigPow(10, 9) Babbage = BigPow(10, 6) Ada = BigPow(10, 3) Wei = big.NewInt(1) )
The different number of units
Functions ¶
func AbsolutePath ¶
func BigToBytes ¶
Big to bytes
Returns the bytes of a big integer with the size specified by **base** Attempts to pad the byte array with zeros.
func ByteSliceToInterface ¶
func ByteSliceToInterface(slice [][]byte) (ret []interface{})
func CurrencyToString ¶
Currency to string Returns a string representing a human readable format
func Decode ¶
TODO Use a bytes.Buffer instead of a raw byte slice. Cleaner code, and use draining instead of seeking the next bytes to read
func DecodeWithReader ¶
func DefaultAssetPath ¶
func DefaultAssetPath() string
func DefaultDataDir ¶
func DefaultDataDir() string
func DeleteFromByteSlice ¶
func ExpandHomePath ¶
func FindFileInArchive ¶
Find file in archive
Returns the index of the given file name if it exists. -1 if file not found
func FirstBitSet ¶
func FormatData ¶
func HasHexPrefix ¶
func Hex2BytesFixed ¶
func LeftPadBytes ¶
func LeftPadString ¶
func MakeName ¶
MakeName creates a node name that follows the ethereum convention for such names. It adds the operation system name and Go runtime version the name.
func ReadFile ¶
Read file
Read a given compressed file and returns the read bytes. Returns an error otherwise
func RightPadBytes ¶
func RightPadString ¶
func String2Big ¶
func WindonizePath ¶
Types ¶
type Address ¶
type Address [addressLength]byte
func BigToAddress ¶
func HexToAddress ¶
func StringToAddress ¶
func (*Address) SetBytes ¶
Sets the address to the value of b. If b is larger than len(a) it will panic
type ConfigManager ¶
type ConfigManager struct { ExecPath string Debug bool Diff bool DiffType string Paranoia bool VmType int // contains filtered or unexported fields }
Config struct
func ReadConfig ¶
func ReadConfig(ConfigFile string, Datadir string, EnvPrefix string) *ConfigManager
Read config
Initialize Config from Config File
func (*ConfigManager) Delete ¶
func (c *ConfigManager) Delete(key string)
func (*ConfigManager) Save ¶
func (c *ConfigManager) Save(key string, value interface{})
provides persistence for flags
type Database ¶
type Database interface { Put(key []byte, value []byte) Get(key []byte) ([]byte, error) Delete(key []byte) error LastKnownTD() []byte Close() Flush() error }
Database interface
type ExtPackage ¶
External package
External package contains the main html file and manifest
func OpenPackage ¶
func OpenPackage(fn string) (*ExtPackage, error)
Open package
Opens a prepared ethereum package Reads the manifest file and determines file contents and returns and the external package.
type Hash ¶
type Hash [hashLength]byte
func BytesToHash ¶
func StringToHash ¶
type List ¶
type List struct { Length int // contains filtered or unexported fields }
The list type is an anonymous slice handler which can be used for containing any slice type to use in an environment which does not support slice types (e.g., JavaScript, QML)
func NewList ¶
func NewList(t interface{}) *List
Initialise a new list. Panics if non-slice type is given.
func (*List) Append ¶
func (self *List) Append(v interface{})
Appends value at the end of the slice. Panics when incompatible value is given.
type Manifest ¶
Manifest object
The manifest object holds all the relevant information supplied with the the manifest specified in the package
type RlpEncodable ¶
type RlpEncodable interface {
RlpData() interface{}
}
type RlpEncodeDecode ¶
type RlpEncodeDecode interface { RlpEncode RlpValue() []interface{} }
type RlpEncoder ¶
type RlpEncoder struct {
// contains filtered or unexported fields
}
func NewRlpEncoder ¶
func NewRlpEncoder() *RlpEncoder
func (*RlpEncoder) EncodeData ¶
func (coder *RlpEncoder) EncodeData(rlpData interface{}) []byte
type StorageSize ¶
type StorageSize float64
func (StorageSize) Int64 ¶
func (self StorageSize) Int64() int64
func (StorageSize) String ¶
func (self StorageSize) String() string
type Value ¶
type Value struct{ Val interface{} }
Value can hold values of certain basic types and provides ways to convert between types without bothering to check whether the conversion is actually meaningful.
It currently supports the following types:
- int{,8,16,32,64}
- uint{,8,16,32,64}
- *big.Int
- []byte, string
- []interface{}
Value is useful whenever you feel that Go's types limit your ability to express yourself. In these situations, use Value and forget about this strong typing nonsense.
func EmptyValue ¶
func EmptyValue() *Value
func NewValueFromBytes ¶
NewValueFromBytes decodes RLP data. The contained value will be nil if data contains invalid RLP.
func (*Value) AppendList ¶
func (*Value) IsList ¶
Special list checking function. Something is considered a list if it's of type []interface{}. The list is usually used in conjunction with rlp decoded streams.
func (*Value) NewIterator ¶
func (val *Value) NewIterator() *ValueIterator
func (*Value) SliceFromTo ¶
type ValueIterator ¶
type ValueIterator struct {
// contains filtered or unexported fields
}
func (*ValueIterator) Idx ¶
func (it *ValueIterator) Idx() int
func (*ValueIterator) Len ¶
func (it *ValueIterator) Len() int
func (*ValueIterator) Next ¶
func (it *ValueIterator) Next() bool
func (*ValueIterator) Value ¶
func (it *ValueIterator) Value() *Value