Moved keyring to ethutil & removed old methods. Implements #20
This commit is contained in:
		@@ -1,87 +0,0 @@
 | 
			
		||||
package ethchain
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/ethereum/eth-go/ethutil"
 | 
			
		||||
	"github.com/obscuren/secp256k1-go"
 | 
			
		||||
	"math/big"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type KeyPair struct {
 | 
			
		||||
	PrivateKey []byte
 | 
			
		||||
	PublicKey  []byte
 | 
			
		||||
 | 
			
		||||
	// The associated account
 | 
			
		||||
	account *StateObject
 | 
			
		||||
	state   *State
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 *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() *StateObject {
 | 
			
		||||
	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 {
 | 
			
		||||
	/* TODO
 | 
			
		||||
	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
 | 
			
		||||
	*/
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
}
 | 
			
		||||
@@ -54,11 +54,13 @@ func (db *LDBDatabase) LastKnownTD() []byte {
 | 
			
		||||
	return data
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
func (db *LDBDatabase) GetKeys() []*ethutil.Key {
 | 
			
		||||
	data, _ := db.Get([]byte("KeyRing"))
 | 
			
		||||
 | 
			
		||||
	return []*ethutil.Key{ethutil.NewKeyFromBytes(data)}
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
func (db *LDBDatabase) Close() {
 | 
			
		||||
	// Close the leveldb database
 | 
			
		||||
 
 | 
			
		||||
@@ -26,11 +26,13 @@ func (db *MemDatabase) Get(key []byte) ([]byte, error) {
 | 
			
		||||
	return db.db[string(key)], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
func (db *MemDatabase) GetKeys() []*ethutil.Key {
 | 
			
		||||
	data, _ := db.Get([]byte("KeyRing"))
 | 
			
		||||
 | 
			
		||||
	return []*ethutil.Key{ethutil.NewKeyFromBytes(data)}
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
func (db *MemDatabase) Delete(key []byte) error {
 | 
			
		||||
	delete(db.db, string(key))
 | 
			
		||||
 
 | 
			
		||||
@@ -39,10 +39,7 @@ func (lib *PEthereum) GetBlock(hexHash string) *PBlock {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lib *PEthereum) GetKey() *PKey {
 | 
			
		||||
	keyPair, err := ethchain.NewKeyPairFromSec(ethutil.Config.Db.GetKeys()[0].PrivateKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	keyPair := ethutil.GetKeyRing().Get(0)
 | 
			
		||||
 | 
			
		||||
	return NewPKey(keyPair)
 | 
			
		||||
}
 | 
			
		||||
@@ -90,7 +87,7 @@ func (lib *PEthereum) IsContract(address string) bool {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lib *PEthereum) SecretToAddress(key string) string {
 | 
			
		||||
	pair, err := ethchain.NewKeyPairFromSec(ethutil.FromHex(key))
 | 
			
		||||
	pair, err := ethutil.NewKeyPairFromSec(ethutil.FromHex(key))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
@@ -115,12 +112,12 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, in
 | 
			
		||||
		hash = ethutil.FromHex(recipient)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var keyPair *ethchain.KeyPair
 | 
			
		||||
	var keyPair *ethutil.KeyPair
 | 
			
		||||
	var err error
 | 
			
		||||
	if key[0:2] == "0x" {
 | 
			
		||||
		keyPair, err = ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key[0:2])))
 | 
			
		||||
		keyPair, err = ethutil.NewKeyPairFromSec([]byte(ethutil.FromHex(key[0:2])))
 | 
			
		||||
	} else {
 | 
			
		||||
		keyPair, err = ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key)))
 | 
			
		||||
		keyPair, err = ethutil.NewKeyPairFromSec([]byte(ethutil.FromHex(key)))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ type PKey struct {
 | 
			
		||||
	PublicKey  string `json:"publicKey"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPKey(key *ethchain.KeyPair) *PKey {
 | 
			
		||||
func NewPKey(key *ethutil.KeyPair) *PKey {
 | 
			
		||||
	return &PKey{ethutil.Hex(key.Address()), ethutil.Hex(key.PrivateKey), ethutil.Hex(key.PublicKey)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										109
									
								
								ethutil/keypair.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								ethutil/keypair.go
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								peer.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								peer.go
									
									
									
									
									
								
							@@ -581,8 +581,8 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
 | 
			
		||||
		p.port = uint16(c.Get(4).Uint())
 | 
			
		||||
 | 
			
		||||
		// Self connect detection
 | 
			
		||||
		key := ethutil.Config.Db.GetKeys()[0]
 | 
			
		||||
		if bytes.Compare(key.PublicKey, p.pubkey) == 0 {
 | 
			
		||||
		keyPair := ethutil.GetKeyRing().Get(0)
 | 
			
		||||
		if bytes.Compare(keyPair.PublicKey, p.pubkey) == 0 {
 | 
			
		||||
			p.Stop()
 | 
			
		||||
 | 
			
		||||
			return
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user