README ¶
common
The common package contains the ethereum utility library.
Installation
As a subdirectory the main go-ethereum repository, you get it with
go get github.com/ethereum/go-ethereum
.
Usage
RLP (Recursive Linear Prefix) Encoding
RLP Encoding is an encoding scheme used by the Ethereum project. It encodes any native value or list to a string.
More in depth information about the encoding scheme see the Wiki article.
rlp := common.Encode("doge")
fmt.Printf("%q\n", rlp) // => "\0x83dog"
rlp = common.Encode([]interface{}{"dog", "cat"})
fmt.Printf("%q\n", rlp) // => "\0xc8\0x83dog\0x83cat"
decoded := common.Decode(rlp)
fmt.Println(decoded) // => ["dog" "cat"]
Patricia Trie
Patricie Tree is a merkle trie used 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 common/db.go
.
db := NewDatabase()
// db, root
trie := common.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 := common.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 := common.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 := common.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 := common.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 := common.NewValue([]interface{}{1,"2",[]interface{}{3}})
rlp := val.Encode()
// Store the rlp data
Store(rlp)
Documentation ¶
Overview ¶
Package common contains various helper functions.
Index ¶
- Constants
- Variables
- func AbsolutePath(Datadir string, filename string) string
- func AddressToICAP(a Address) (string, error)
- func AddressToIndirectICAP(a Address, instCode string) (string, error)
- 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 BytesToBig(data []byte) *big.Int
- func BytesToNumber(b []byte) uint64
- func CopyBytes(b []byte) (copiedBytes []byte)
- func CurrencyToString(num *big.Int) string
- func DefaultDataDir() string
- func EmptyHash(h Hash) bool
- func ExpandHomePath(p string) (path string)
- func FileExist(filePath string) bool
- 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 HomeDir() string
- func IsHex(str string) bool
- func IsHexAddress(s string) bool
- func LeftPadBytes(slice []byte, l int) []byte
- func LeftPadString(str string, l int) string
- func LoadJSON(file string, val interface{}) error
- func MakeName(name, version string) string
- func NumberToBytes(num interface{}, bits int) []byte
- func PP(value []byte) string
- func ParseData(data ...interface{}) (ret []byte)
- func PrintDepricationWarning(str string)
- 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 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
- type Address
- func (a Address) Big() *big.Int
- func (a Address) Bytes() []byte
- func (a Address) Hash() Hash
- func (a Address) Hex() string
- func (a Address) MarshalJSON() ([]byte, error)
- func (a *Address) Set(other Address)
- func (a *Address) SetBytes(b []byte)
- func (a *Address) SetString(s string)
- func (a Address) Str() string
- func (a *Address) UnmarshalJSON(data []byte) error
- type Hash
- func (h Hash) Big() *big.Int
- func (h Hash) Bytes() []byte
- func (h Hash) Generate(rand *rand.Rand, size int) reflect.Value
- func (h Hash) Hex() string
- func (h Hash) MarshalJSON() ([]byte, error)
- func (h *Hash) Set(other Hash)
- func (h *Hash) SetBytes(b []byte)
- func (h *Hash) SetString(s string)
- func (h Hash) Str() string
- func (h *Hash) UnmarshalJSON(input []byte) error
- type List
- type StorageSize
Constants ¶
const ( DefaultIPCSocket = "geth.ipc" // Default (relative) name of the IPC RPC socket DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server DefaultWSHost = "localhost" // Default host interface for the websocket RPC server DefaultWSPort = 8546 // Default TCP port for the websocket RPC server )
const ( HashLength = 32 AddressLength = 20 )
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) Big36 = big.NewInt(36) Big97 = big.NewInt(97) Big98 = big.NewInt(98) Big256 = big.NewInt(0xff) Big257 = big.NewInt(257) MaxBig = String2Big("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") )
Common big integers often used
var ( Base36Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ICAPLengthError = errors.New("Invalid ICAP length") ICAPEncodingError = errors.New("Invalid ICAP encoding") ICAPChecksumError = errors.New("Invalid ICAP checksum") ICAPCountryCodeError = errors.New("Invalid ICAP country code") ICAPAssetIdentError = errors.New("Invalid ICAP asset identifier") ICAPInstCodeError = errors.New("Invalid ICAP institution code") ICAPClientIdentError = errors.New("Invalid ICAP client identifier") )
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 AddressToICAP ¶ added in v1.3.1
func AddressToIndirectICAP ¶ added in v1.3.1
TODO: integrate with ICAP namereg when it's available
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 DefaultDataDir ¶
func DefaultDataDir() string
DefaultDataDir is the default data directory to use for the databases and other persistence requirements.
func ExpandHomePath ¶
func FirstBitSet ¶
func FormatData ¶
func HasHexPrefix ¶
func Hex2BytesFixed ¶
func IsHexAddress ¶ added in v1.4.0
IsHexAddress verifies whether a string can represent a valid hex-encoded Ethereum address or not.
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 PP ¶ added in v0.9.30
PP Pretty Prints a byte slice in the following format:
hex(value[:4])...(hex[len(value)-4:])
func PrintDepricationWarning ¶ added in v1.4.0
func PrintDepricationWarning(str string)
PrintDepricationWarning prinst the given string in a box using fmt.Println.
func Report ¶
func Report(extra ...interface{})
Report gives off a warning requesting the user to submit an issue to the github tracker.
func RightPadBytes ¶
func RightPadString ¶
func String2Big ¶
Types ¶
type Address ¶
type Address [AddressLength]byte
func BigToAddress ¶
func HexToAddress ¶
func ICAPToAddress ¶ added in v1.3.1
func StringToAddress ¶
func (Address) MarshalJSON ¶ added in v1.4.0
Serialize given address to JSON
func (*Address) SetBytes ¶
Sets the address to the value of b. If b is larger than len(a) it will panic
func (*Address) UnmarshalJSON ¶ added in v1.4.0
Parse address from raw json data
type Hash ¶
type Hash [HashLength]byte
func BytesToHash ¶
func StringToHash ¶
func (Hash) MarshalJSON ¶ added in v1.4.0
Serialize given hash to JSON
func (*Hash) UnmarshalJSON ¶ added in v1.4.0
UnmarshalJSON parses a hash in its hex from to a hash.
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 StorageSize ¶
type StorageSize float64
func (StorageSize) Int64 ¶
func (self StorageSize) Int64() int64
func (StorageSize) String ¶
func (self StorageSize) String() string