From 10b252dd0517175117d8d4a8ef30b3689a10eda5 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Tue, 21 Oct 2014 13:24:48 +0200
Subject: WIP RPC interface

---
 rpc/packages.go | 311 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 311 insertions(+)
 create mode 100644 rpc/packages.go

(limited to 'rpc/packages.go')

diff --git a/rpc/packages.go b/rpc/packages.go
new file mode 100644
index 000000000..d8dae003f
--- /dev/null
+++ b/rpc/packages.go
@@ -0,0 +1,311 @@
+package rpc
+
+import (
+	"encoding/json"
+	"errors"
+	"math/big"
+	"strings"
+
+	"github.com/ethereum/eth-go/ethpipe"
+	"github.com/ethereum/eth-go/ethutil"
+)
+
+type EthereumApi struct {
+	pipe *ethpipe.JSPipe
+}
+
+type JsonArgs interface {
+	requirements() error
+}
+
+type BlockResponse struct {
+	JsonResponse
+}
+type GetBlockArgs struct {
+	BlockNumber int
+	Hash        string
+}
+
+type ErrorResponse struct {
+	Error     bool   `json:"error"`
+	ErrorText string `json:"errorText"`
+}
+
+type JsonResponse interface {
+}
+
+type SuccessRes struct {
+	Error  bool         `json:"error"`
+	Result JsonResponse `json:"result"`
+}
+
+func NewSuccessRes(object JsonResponse) string {
+	e := SuccessRes{Error: false, Result: object}
+	res, err := json.Marshal(e)
+	if err != nil {
+		// This should never happen
+		panic("Creating json error response failed, help")
+	}
+	success := string(res)
+	return success
+}
+
+func NewErrorResponse(msg string) error {
+	e := ErrorResponse{Error: true, ErrorText: msg}
+	res, err := json.Marshal(e)
+	if err != nil {
+		// This should never happen
+		panic("Creating json error response failed, help")
+	}
+	newErr := errors.New(string(res))
+	return newErr
+}
+
+func (b *GetBlockArgs) requirements() error {
+	if b.BlockNumber == 0 && b.Hash == "" {
+		return NewErrorResponse("GetBlock requires either a block 'number' or a block 'hash' as argument")
+	}
+	return nil
+}
+
+func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *string) error {
+	err := args.requirements()
+	if err != nil {
+		return err
+	}
+
+	block := p.pipe.BlockByHash(args.Hash)
+	*reply = NewSuccessRes(block)
+	return nil
+}
+
+type NewTxArgs struct {
+	Sec       string
+	Recipient string
+	Value     string
+	Gas       string
+	GasPrice  string
+	Init      string
+	Body      string
+}
+type TxResponse struct {
+	Hash string
+}
+
+func (a *NewTxArgs) requirements() error {
+	if a.Recipient == "" {
+		return NewErrorResponse("Transact requires a 'recipient' address as argument")
+	}
+	if a.Value == "" {
+		return NewErrorResponse("Transact requires a 'value' as argument")
+	}
+	if a.Gas == "" {
+		return NewErrorResponse("Transact requires a 'gas' value as argument")
+	}
+	if a.GasPrice == "" {
+		return NewErrorResponse("Transact requires a 'gasprice' value as argument")
+	}
+	return nil
+}
+
+func (a *NewTxArgs) requirementsContract() error {
+	if a.Value == "" {
+		return NewErrorResponse("Create requires a 'value' as argument")
+	}
+	if a.Gas == "" {
+		return NewErrorResponse("Create requires a 'gas' value as argument")
+	}
+	if a.GasPrice == "" {
+		return NewErrorResponse("Create requires a 'gasprice' value as argument")
+	}
+	if a.Body == "" {
+		return NewErrorResponse("Create requires a 'body' value as argument")
+	}
+	return nil
+}
+
+func (p *EthereumApi) Transact(args *NewTxArgs, reply *string) error {
+	err := args.requirements()
+	if err != nil {
+		return err
+	}
+	result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, args.Recipient, args.Value, args.Gas, args.GasPrice, args.Body)
+	*reply = NewSuccessRes(result)
+	return nil
+}
+
+func (p *EthereumApi) Create(args *NewTxArgs, reply *string) error {
+	err := args.requirementsContract()
+	if err != nil {
+		return err
+	}
+
+	result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, "", args.Value, args.Gas, args.GasPrice, args.Body)
+	*reply = NewSuccessRes(result)
+	return nil
+}
+
+type PushTxArgs struct {
+	Tx string
+}
+
+func (a *PushTxArgs) requirementsPushTx() error {
+	if a.Tx == "" {
+		return NewErrorResponse("PushTx requires a 'tx' as argument")
+	}
+	return nil
+}
+
+func (p *EthereumApi) PushTx(args *PushTxArgs, reply *string) error {
+	err := args.requirementsPushTx()
+	if err != nil {
+		return err
+	}
+	result, _ := p.pipe.PushTx(args.Tx)
+	*reply = NewSuccessRes(result)
+	return nil
+}
+
+func (p *EthereumApi) GetKey(args interface{}, reply *string) error {
+	*reply = NewSuccessRes(p.pipe.Key())
+	return nil
+}
+
+type GetStorageArgs struct {
+	Address string
+	Key     string
+}
+
+func (a *GetStorageArgs) requirements() error {
+	if a.Address == "" {
+		return NewErrorResponse("GetStorageAt requires an 'address' value as argument")
+	}
+	if a.Key == "" {
+		return NewErrorResponse("GetStorageAt requires an 'key' value as argument")
+	}
+	return nil
+}
+
+type GetStorageAtRes struct {
+	Key     string `json:"key"`
+	Value   string `json:"value"`
+	Address string `json:"address"`
+}
+
+func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *string) error {
+	err := args.requirements()
+	if err != nil {
+		return err
+	}
+
+	state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address))
+
+	var hx string
+	if strings.Index(args.Key, "0x") == 0 {
+		hx = string([]byte(args.Key)[2:])
+	} else {
+		// Convert the incoming string (which is a bigint) into hex
+		i, _ := new(big.Int).SetString(args.Key, 10)
+		hx = ethutil.Bytes2Hex(i.Bytes())
+	}
+	logger.Debugf("GetStorageAt(%s, %s)\n", args.Address, hx)
+	value := state.Storage(ethutil.Hex2Bytes(hx))
+	*reply = NewSuccessRes(GetStorageAtRes{Address: args.Address, Key: args.Key, Value: value.Str()})
+	return nil
+}
+
+type GetTxCountArgs struct {
+	Address string `json:"address"`
+}
+type GetTxCountRes struct {
+	Nonce int `json:"nonce"`
+}
+
+func (a *GetTxCountArgs) requirements() error {
+	if a.Address == "" {
+		return NewErrorResponse("GetTxCountAt requires an 'address' value as argument")
+	}
+	return nil
+}
+
+type GetPeerCountRes struct {
+	PeerCount int `json:"peerCount"`
+}
+
+func (p *EthereumApi) GetPeerCount(args *interface{}, reply *string) error {
+	*reply = NewSuccessRes(GetPeerCountRes{PeerCount: p.pipe.PeerCount()})
+	return nil
+}
+
+type GetListeningRes struct {
+	IsListening bool `json:"isListening"`
+}
+
+func (p *EthereumApi) GetIsListening(args *interface{}, reply *string) error {
+	*reply = NewSuccessRes(GetListeningRes{IsListening: p.pipe.IsListening()})
+	return nil
+}
+
+type GetCoinbaseRes struct {
+	Coinbase string `json:"coinbase"`
+}
+
+func (p *EthereumApi) GetCoinbase(args *interface{}, reply *string) error {
+	*reply = NewSuccessRes(GetCoinbaseRes{Coinbase: p.pipe.CoinBase()})
+	return nil
+}
+
+type GetMiningRes struct {
+	IsMining bool `json:"isMining"`
+}
+
+func (p *EthereumApi) GetIsMining(args *interface{}, reply *string) error {
+	*reply = NewSuccessRes(GetMiningRes{IsMining: p.pipe.IsMining()})
+	return nil
+}
+
+func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *string) error {
+	err := args.requirements()
+	if err != nil {
+		return err
+	}
+	state := p.pipe.TxCountAt(args.Address)
+	*reply = NewSuccessRes(GetTxCountRes{Nonce: state})
+	return nil
+}
+
+type GetBalanceArgs struct {
+	Address string
+}
+
+func (a *GetBalanceArgs) requirements() error {
+	if a.Address == "" {
+		return NewErrorResponse("GetBalanceAt requires an 'address' value as argument")
+	}
+	return nil
+}
+
+type BalanceRes struct {
+	Balance string `json:"balance"`
+	Address string `json:"address"`
+}
+
+func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *string) error {
+	err := args.requirements()
+	if err != nil {
+		return err
+	}
+	state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address))
+	*reply = NewSuccessRes(BalanceRes{Balance: state.Balance.String(), Address: args.Address})
+	return nil
+}
+
+type TestRes struct {
+	JsonResponse `json:"-"`
+	Answer       int `json:"answer"`
+}
+
+func (p *EthereumApi) Test(args *GetBlockArgs, reply *string) error {
+	*reply = NewSuccessRes(TestRes{Answer: 15})
+	return nil
+}
-- 
cgit v1.2.3


From 29b8a0bc5ffa7a674a06a211e1c8bdd1b6ed07b1 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Thu, 23 Oct 2014 01:01:26 +0200
Subject: Updated the VM & VM tests

* Stack Error shouldn't revert to previous state
* Updated VM Test tool
* Added Transfer method to VM Env
---
 rpc/packages.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'rpc/packages.go')

diff --git a/rpc/packages.go b/rpc/packages.go
index d8dae003f..3fba7ae4f 100644
--- a/rpc/packages.go
+++ b/rpc/packages.go
@@ -296,7 +296,7 @@ func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *string) error {
 		return err
 	}
 	state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address))
-	*reply = NewSuccessRes(BalanceRes{Balance: state.Balance.String(), Address: args.Address})
+	*reply = NewSuccessRes(BalanceRes{Balance: state.Balance().String(), Address: args.Address})
 	return nil
 }
 
-- 
cgit v1.2.3


From b1c247231b11f313ca0eedff75ea563926d23f68 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Fri, 31 Oct 2014 12:56:05 +0100
Subject: ethlog => logger

---
 rpc/packages.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'rpc/packages.go')

diff --git a/rpc/packages.go b/rpc/packages.go
index 07d3ddc9a..31500867c 100644
--- a/rpc/packages.go
+++ b/rpc/packages.go
@@ -208,7 +208,7 @@ func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *string) error {
 		i, _ := new(big.Int).SetString(args.Key, 10)
 		hx = ethutil.Bytes2Hex(i.Bytes())
 	}
-	logger.Debugf("GetStorageAt(%s, %s)\n", args.Address, hx)
+	jsonlogger.Debugf("GetStorageAt(%s, %s)\n", args.Address, hx)
 	value := state.Storage(ethutil.Hex2Bytes(hx))
 	*reply = NewSuccessRes(GetStorageAtRes{Address: args.Address, Key: args.Key, Value: value.Str()})
 	return nil
-- 
cgit v1.2.3


From 0ed1a8b50a9b9726cd57a2731d0405f6949c6188 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Fri, 31 Oct 2014 14:30:08 +0100
Subject: ethpipe => xeth (eXtended ETHereum)

---
 rpc/packages.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'rpc/packages.go')

diff --git a/rpc/packages.go b/rpc/packages.go
index 31500867c..5535e6e79 100644
--- a/rpc/packages.go
+++ b/rpc/packages.go
@@ -6,12 +6,12 @@ import (
 	"math/big"
 	"strings"
 
-	"github.com/ethereum/go-ethereum/ethpipe"
 	"github.com/ethereum/go-ethereum/ethutil"
+	"github.com/ethereum/go-ethereum/xeth"
 )
 
 type EthereumApi struct {
-	pipe *ethpipe.JSPipe
+	pipe *xeth.JSXEth
 }
 
 type JsonArgs interface {
-- 
cgit v1.2.3