Added RPC "Call" for JS calls to contracts

pull/272/merge
obscuren 10 years ago
parent f75dcc7f4c
commit 84adf77bf3
  1. 3
      cmd/mist/assets/qml/main.qml
  2. 3
      javascript/javascript_runtime.go
  3. 11
      rpc/args.go
  4. 19
      rpc/packages.go
  5. 2
      vm/vm.go
  6. 28
      xeth/xeth.go

@ -45,8 +45,7 @@ ApplicationWindow {
mainSplit.setView(wallet.view, wallet.menuItem); mainSplit.setView(wallet.view, wallet.menuItem);
//newBrowserTab("http://etherian.io"); newBrowserTab("http://etherian.io");
newBrowserTab("file:///users/jeffrey/test.html");
// Command setup // Command setup
gui.sendCommand(0) gui.sendCommand(0)

@ -58,8 +58,7 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE {
re.Vm.Run(jsLib) re.Vm.Run(jsLib)
// Load extra javascript files // Load extra javascript files
re.LoadIntFile("string.js") re.LoadIntFile("bignumber.min.js")
re.LoadIntFile("big.js")
// Subscribe to events // Subscribe to events
mux := ethereum.EventMux() mux := ethereum.EventMux()

@ -28,11 +28,12 @@ func (obj *GetBlockArgs) requirements() error {
} }
type NewTxArgs struct { type NewTxArgs struct {
Recipient string `json:"recipient"` From string `json:"from"`
Value string `json:"value"` To string `json:"to"`
Gas string `json:"gas"` Value string `json:"value"`
GasPrice string `json:"gasprice"` Gas string `json:"gas"`
Data string `json:"data"` GasPrice string `json:"gasPrice"`
Data string `json:"data"`
} }
// type TxResponse struct { // type TxResponse struct {

@ -67,8 +67,17 @@ func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) error {
if err != nil { if err != nil {
return err return err
} }
result, _ := p.xeth.Transact( /* TODO specify account */ args.Recipient, args.Value, args.Gas, args.GasPrice, args.Data) result, _ := p.xeth.Transact( /* TODO specify account */ args.To, args.Value, args.Gas, args.GasPrice, args.Data)
fmt.Println("result:", result) *reply = result
return nil
}
func (p *EthereumApi) Call(args *NewTxArgs, reply *interface{}) error {
result, err := p.xeth.Call( /* TODO specify account */ args.To, args.Value, args.Gas, args.GasPrice, args.Data)
if err != nil {
return err
}
*reply = result *reply = result
return nil return nil
} }
@ -206,6 +215,12 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
return err return err
} }
return p.Transact(args, reply) return p.Transact(args, reply)
case "eth_call":
args, err := req.ToNewTxArgs()
if err != nil {
return err
}
return p.Call(args, reply)
case "web3_sha3": case "web3_sha3":
args, err := req.ToSha3Args() args, err := req.ToSha3Args()
if err != nil { if err != nil {

@ -634,6 +634,8 @@ func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.I
continue continue
} }
self.Printf(" ~> false")
case JUMPDEST: case JUMPDEST:
case PC: case PC:
stack.Push(big.NewInt(int64(pc))) stack.Push(big.NewInt(int64(pc)))

@ -204,6 +204,34 @@ func (self *XEth) PushTx(encodedTx string) (string, error) {
return toHex(tx.Hash()), nil return toHex(tx.Hash()), nil
} }
func (self *XEth) Call(toStr, valueStr, gasStr, gasPriceStr, dataStr string) (string, error) {
if len(gasStr) == 0 {
gasStr = "100000"
}
if len(gasPriceStr) == 0 {
gasPriceStr = "1"
}
var (
statedb = self.chainManager.TransState()
initiator = state.NewStateObject(self.eth.KeyManager().KeyPair().Address(), self.eth.Db())
block = self.chainManager.CurrentBlock()
to = statedb.GetOrNewStateObject(fromHex(toStr))
data = fromHex(dataStr)
gas = ethutil.Big(gasStr)
price = ethutil.Big(gasPriceStr)
value = ethutil.Big(valueStr)
)
vmenv := NewEnv(self.chainManager, statedb, block, value, initiator.Address())
res, err := vmenv.Call(initiator, to.Address(), data, gas, price, value)
if err != nil {
return "", err
}
return toHex(res), nil
}
func (self *XEth) Transact(toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) { func (self *XEth) Transact(toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) {
var ( var (

Loading…
Cancel
Save