forked from cerc-io/plugeth
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
|
||||
}
|
||||
|
||||
/*
|
||||
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
@ -583,8 +583,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
|
||||
|
Loading…
Reference in New Issue
Block a user