diff options
author | obscuren <geffobscura@gmail.com> | 2014-05-15 03:34:30 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-05-15 03:34:30 +0800 |
commit | 6efdd21633c1d21f36080754a89ad82c0c244128 (patch) | |
tree | 873da7787044997e5590d35e32076ecb7a21dae4 /ethutil | |
parent | 283f4d8eb3e223f89fd613767e1c6c318ac2bb75 (diff) | |
parent | ad4ffdc9474aca48ab1d3d361797398f795a6d31 (diff) | |
download | go-tangerine-6efdd21633c1d21f36080754a89ad82c0c244128.tar go-tangerine-6efdd21633c1d21f36080754a89ad82c0c244128.tar.gz go-tangerine-6efdd21633c1d21f36080754a89ad82c0c244128.tar.bz2 go-tangerine-6efdd21633c1d21f36080754a89ad82c0c244128.tar.lz go-tangerine-6efdd21633c1d21f36080754a89ad82c0c244128.tar.xz go-tangerine-6efdd21633c1d21f36080754a89ad82c0c244128.tar.zst go-tangerine-6efdd21633c1d21f36080754a89ad82c0c244128.zip |
Merge branch 'release/poc5-rc6'
Diffstat (limited to 'ethutil')
-rw-r--r-- | ethutil/config.go | 2 | ||||
-rw-r--r-- | ethutil/db.go | 2 | ||||
-rw-r--r-- | ethutil/key.go | 19 | ||||
-rw-r--r-- | ethutil/keypair.go | 109 |
4 files changed, 111 insertions, 21 deletions
diff --git a/ethutil/config.go b/ethutil/config.go index 07dc85f08..b4bd9158e 100644 --- a/ethutil/config.go +++ b/ethutil/config.go @@ -50,7 +50,7 @@ func ReadConfig(base string) *config { } } - Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC4"} + Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC6"} Config.Log = NewLogger(LogFile|LogStd, LogLevelDebug) Config.SetClientString("/Ethereum(G)") } diff --git a/ethutil/db.go b/ethutil/db.go index abbf4a2b0..e02a80fca 100644 --- a/ethutil/db.go +++ b/ethutil/db.go @@ -4,7 +4,7 @@ package ethutil type Database interface { Put(key []byte, value []byte) Get(key []byte) ([]byte, error) - GetKeys() []*Key + //GetKeys() []*Key Delete(key []byte) error LastKnownTD() []byte Close() diff --git a/ethutil/key.go b/ethutil/key.go deleted file mode 100644 index ec195f213..000000000 --- a/ethutil/key.go +++ /dev/null @@ -1,19 +0,0 @@ -package ethutil - -type Key struct { - PrivateKey []byte - PublicKey []byte -} - -func NewKeyFromBytes(data []byte) *Key { - val := NewValueFromBytes(data) - return &Key{val.Get(0).Bytes(), val.Get(1).Bytes()} -} - -func (k *Key) Address() []byte { - return Sha3Bin(k.PublicKey[1:])[12:] -} - -func (k *Key) RlpEncode() []byte { - return EmptyValue().Append(k.PrivateKey).Append(k.PublicKey).Encode() -} diff --git a/ethutil/keypair.go b/ethutil/keypair.go new file mode 100644 index 000000000..cf5882e2c --- /dev/null +++ b/ethutil/keypair.go @@ -0,0 +1,109 @@ +package ethutil + +import ( + "github.com/obscuren/secp256k1-go" +) + +type KeyPair struct { + PrivateKey []byte + PublicKey []byte + + // The associated account + account *StateObject +} + +func NewKeyPairFromSec(seckey []byte) (*KeyPair, error) { + pubkey, err := secp256k1.GeneratePubKey(seckey) + if err != nil { + return nil, err + } + + return &KeyPair{PrivateKey: seckey, PublicKey: pubkey}, nil +} + +func NewKeyPairFromValue(val *Value) *KeyPair { + v, _ := NewKeyPairFromSec(val.Bytes()) + + return v +} + +func (k *KeyPair) Address() []byte { + return Sha3Bin(k.PublicKey[1:])[12:] +} + +func (k *KeyPair) RlpEncode() []byte { + return k.RlpValue().Encode() +} + +func (k *KeyPair) RlpValue() *Value { + return NewValue(k.PrivateKey) +} + +type KeyRing struct { + keys []*KeyPair +} + +func (k *KeyRing) Add(pair *KeyPair) { + k.keys = append(k.keys, pair) +} + +func (k *KeyRing) Get(i int) *KeyPair { + if len(k.keys) > i { + return k.keys[i] + } + + return nil +} + +func (k *KeyRing) Len() int { + return len(k.keys) +} + +func (k *KeyRing) NewKeyPair(sec []byte) (*KeyPair, error) { + keyPair, err := NewKeyPairFromSec(sec) + if err != nil { + return nil, err + } + + k.Add(keyPair) + Config.Db.Put([]byte("KeyRing"), k.RlpValue().Encode()) + + return keyPair, nil +} + +func (k *KeyRing) Reset() { + Config.Db.Put([]byte("KeyRing"), nil) + k.keys = nil +} + +func (k *KeyRing) RlpValue() *Value { + v := EmptyValue() + for _, keyPair := range k.keys { + v.Append(keyPair.RlpValue()) + } + + return v +} + +// The public "singleton" keyring +var keyRing *KeyRing + +func GetKeyRing() *KeyRing { + if keyRing == nil { + keyRing = &KeyRing{} + + data, _ := Config.Db.Get([]byte("KeyRing")) + it := NewValueFromBytes(data).NewIterator() + for it.Next() { + v := it.Value() + + key, err := NewKeyPairFromSec(v.Bytes()) + if err != nil { + panic(err) + } + keyRing.Add(key) + } + } + + return keyRing +} |