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
							 | 
						||
| 
								 | 
							
								}
							 |