Merge branch 'develop' of github.com:ethereum/eth-go into develop
This commit is contained in:
commit
ff2cf2dacd
|
@ -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
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
func (db *LDBDatabase) GetKeys() []*ethutil.Key {
|
func (db *LDBDatabase) GetKeys() []*ethutil.Key {
|
||||||
data, _ := db.Get([]byte("KeyRing"))
|
data, _ := db.Get([]byte("KeyRing"))
|
||||||
|
|
||||||
return []*ethutil.Key{ethutil.NewKeyFromBytes(data)}
|
return []*ethutil.Key{ethutil.NewKeyFromBytes(data)}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
func (db *LDBDatabase) Close() {
|
func (db *LDBDatabase) Close() {
|
||||||
// Close the leveldb database
|
// Close the leveldb database
|
||||||
|
|
|
@ -26,11 +26,13 @@ func (db *MemDatabase) Get(key []byte) ([]byte, error) {
|
||||||
return db.db[string(key)], nil
|
return db.db[string(key)], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
func (db *MemDatabase) GetKeys() []*ethutil.Key {
|
func (db *MemDatabase) GetKeys() []*ethutil.Key {
|
||||||
data, _ := db.Get([]byte("KeyRing"))
|
data, _ := db.Get([]byte("KeyRing"))
|
||||||
|
|
||||||
return []*ethutil.Key{ethutil.NewKeyFromBytes(data)}
|
return []*ethutil.Key{ethutil.NewKeyFromBytes(data)}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
func (db *MemDatabase) Delete(key []byte) error {
|
func (db *MemDatabase) Delete(key []byte) error {
|
||||||
delete(db.db, string(key))
|
delete(db.db, string(key))
|
||||||
|
|
|
@ -39,10 +39,7 @@ func (lib *PEthereum) GetBlock(hexHash string) *PBlock {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lib *PEthereum) GetKey() *PKey {
|
func (lib *PEthereum) GetKey() *PKey {
|
||||||
keyPair, err := ethchain.NewKeyPairFromSec(ethutil.Config.Db.GetKeys()[0].PrivateKey)
|
keyPair := ethutil.GetKeyRing().Get(0)
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return NewPKey(keyPair)
|
return NewPKey(keyPair)
|
||||||
}
|
}
|
||||||
|
@ -90,7 +87,7 @@ func (lib *PEthereum) IsContract(address string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lib *PEthereum) SecretToAddress(key string) string {
|
func (lib *PEthereum) SecretToAddress(key string) string {
|
||||||
pair, err := ethchain.NewKeyPairFromSec(ethutil.FromHex(key))
|
pair, err := ethutil.NewKeyPairFromSec(ethutil.FromHex(key))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
@ -115,12 +112,12 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, in
|
||||||
hash = ethutil.FromHex(recipient)
|
hash = ethutil.FromHex(recipient)
|
||||||
}
|
}
|
||||||
|
|
||||||
var keyPair *ethchain.KeyPair
|
var keyPair *ethutil.KeyPair
|
||||||
var err error
|
var err error
|
||||||
if key[0:2] == "0x" {
|
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 {
|
} else {
|
||||||
keyPair, err = ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key)))
|
keyPair, err = ethutil.NewKeyPairFromSec([]byte(ethutil.FromHex(key)))
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -39,7 +39,7 @@ type PKey struct {
|
||||||
PublicKey string `json:"publicKey"`
|
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)}
|
return &PKey{ethutil.Hex(key.Address()), ethutil.Hex(key.PrivateKey), ethutil.Hex(key.PublicKey)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ package ethutil
|
||||||
type Database interface {
|
type Database interface {
|
||||||
Put(key []byte, value []byte)
|
Put(key []byte, value []byte)
|
||||||
Get(key []byte) ([]byte, error)
|
Get(key []byte) ([]byte, error)
|
||||||
GetKeys() []*Key
|
//GetKeys() []*Key
|
||||||
Delete(key []byte) error
|
Delete(key []byte) error
|
||||||
LastKnownTD() []byte
|
LastKnownTD() []byte
|
||||||
Close()
|
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()
|
|
||||||
}
|
|
|
@ -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
|
@ -583,8 +583,8 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
|
||||||
p.port = uint16(c.Get(4).Uint())
|
p.port = uint16(c.Get(4).Uint())
|
||||||
|
|
||||||
// Self connect detection
|
// Self connect detection
|
||||||
key := ethutil.Config.Db.GetKeys()[0]
|
keyPair := ethutil.GetKeyRing().Get(0)
|
||||||
if bytes.Compare(key.PublicKey, p.pubkey) == 0 {
|
if bytes.Compare(keyPair.PublicKey, p.pubkey) == 0 {
|
||||||
p.Stop()
|
p.Stop()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in New Issue