110 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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
 | |
| }
 |