aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ethchain/keypair.go74
1 files changed, 74 insertions, 0 deletions
diff --git a/ethchain/keypair.go b/ethchain/keypair.go
new file mode 100644
index 000000000..9fdc95972
--- /dev/null
+++ b/ethchain/keypair.go
@@ -0,0 +1,74 @@
+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
+}