75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | package ethchain | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"github.com/ethereum/eth-go/ethutil" | ||
|  | 	"math/big" | ||
|  | ) | ||
|  | 
 | ||
|  | type KeyPair struct { | ||
|  | 	PrivateKey []byte | ||
|  | 	PublicKey  []byte | ||
|  | 
 | ||
|  | 	// The associated account | ||
|  | 	account *Account | ||
|  | 	state   *State | ||
|  | } | ||
|  | 
 | ||
|  | func NewKeyPairFromValue(val *ethutil.Value) *KeyPair { | ||
|  | 	keyPair := &KeyPair{PrivateKey: val.Get(0).Bytes(), PublicKey: val.Get(1).Bytes()} | ||
|  | 
 | ||
|  | 	return keyPair | ||
|  | } | ||
|  | 
 | ||
|  | func (k *KeyPair) Address() []byte { | ||
|  | 	return ethutil.Sha3Bin(k.PublicKey[1:])[12:] | ||
|  | } | ||
|  | 
 | ||
|  | func (k *KeyPair) Account() *Account { | ||
|  | 	if k.account == nil { | ||
|  | 		k.account = k.state.GetAccount(k.Address()) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return k.account | ||
|  | } | ||
|  | 
 | ||
|  | // Create transaction, creates a new and signed transaction, ready for processing | ||
|  | func (k *KeyPair) CreateTx(receiver []byte, value *big.Int, data []string) *Transaction { | ||
|  | 	tx := NewTransaction(receiver, value, data) | ||
|  | 	tx.Nonce = k.account.Nonce | ||
|  | 
 | ||
|  | 	// Sign the transaction with the private key in this key chain | ||
|  | 	tx.Sign(k.PrivateKey) | ||
|  | 
 | ||
|  | 	return tx | ||
|  | } | ||
|  | 
 | ||
|  | func (k *KeyPair) RlpEncode() []byte { | ||
|  | 	return ethutil.EmptyValue().Append(k.PrivateKey).Append(k.PublicKey).Encode() | ||
|  | } | ||
|  | 
 | ||
|  | type KeyRing struct { | ||
|  | 	keys []*KeyPair | ||
|  | } | ||
|  | 
 | ||
|  | func (k *KeyRing) Add(pair *KeyPair) { | ||
|  | 	k.keys = append(k.keys, pair) | ||
|  | } | ||
|  | 
 | ||
|  | // The public "singleton" keyring | ||
|  | var keyRing *KeyRing | ||
|  | 
 | ||
|  | func GetKeyRing(state *State) *KeyRing { | ||
|  | 	if keyRing == nil { | ||
|  | 		keyRing = &KeyRing{} | ||
|  | 
 | ||
|  | 		data, _ := ethutil.Config.Db.Get([]byte("KeyRing")) | ||
|  | 		it := ethutil.NewValueFromBytes(data).NewIterator() | ||
|  | 		for it.Next() { | ||
|  | 			v := it.Value() | ||
|  | 			keyRing.Add(NewKeyPairFromValue(v)) | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return keyRing | ||
|  | } |