How to correctly send RPC call using Golang to get smart-contract owner?
up vote
1
down vote
favorite
Update
Since I'm not able to achieve this using the approach in this question, I created my own library to do the same thing (link). It doesn't rely on go-ethereum package but use the normal net/http
package to do JSON RPC request.
I still love to know what I did wrong in my approach below.
Definitions:
owner =public
variable in contract withaddress
type
contract = smart-contract that has owner
This is the curl request to get the owner of a contract. I managed to get the owner. (JSON RPC docs)
curl localhost:8545 -X POST
--header 'Content-type: application/json'
--data '"jsonrpc":"2.0", "method":"eth_call", "params":["to": "0x_MY_CONTRACT_ADDRESS", "data": "0x8da5cb5b", "latest"], "id":1'
"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000_OWNER"
But when I try to replicate it in Golang (code below), I got json: cannot unmarshal string into Go value of type main.response error. (go-ethereum code that I use)
package main
import (
"fmt"
"log"
"os"
"github.com/ethereum/go-ethereum/rpc"
)
func main()
client, err := rpc.DialHTTP(os.Getenv("RPC_SERVER"))
if err != nil
log.Fatal(err)
defer client.Close()
type request struct
To string `json:"to"`
Data string `json:"data"`
type response struct
Result string
req := request"0x_MY_CONTRACT_ADDRESS", "0x8da5cb5b"
var resp response
if err := client.Call(&resp, "eth_call", req, "latest"); err != nil
log.Fatal(err)
fmt.Printf("%vn", resp)
What did I miss here?
Expected result:
Address in string format. E.g. 0x3ab17372b25154400738C04B04f755321bB5a94b
P/S — I'm aware of abigen and I know it's better and easier to do this using abigen. But I'm trying to solve this specific issue without using abigen method.
go ethereum json-rpc smartcontracts go-ethereum
add a comment |
up vote
1
down vote
favorite
Update
Since I'm not able to achieve this using the approach in this question, I created my own library to do the same thing (link). It doesn't rely on go-ethereum package but use the normal net/http
package to do JSON RPC request.
I still love to know what I did wrong in my approach below.
Definitions:
owner =public
variable in contract withaddress
type
contract = smart-contract that has owner
This is the curl request to get the owner of a contract. I managed to get the owner. (JSON RPC docs)
curl localhost:8545 -X POST
--header 'Content-type: application/json'
--data '"jsonrpc":"2.0", "method":"eth_call", "params":["to": "0x_MY_CONTRACT_ADDRESS", "data": "0x8da5cb5b", "latest"], "id":1'
"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000_OWNER"
But when I try to replicate it in Golang (code below), I got json: cannot unmarshal string into Go value of type main.response error. (go-ethereum code that I use)
package main
import (
"fmt"
"log"
"os"
"github.com/ethereum/go-ethereum/rpc"
)
func main()
client, err := rpc.DialHTTP(os.Getenv("RPC_SERVER"))
if err != nil
log.Fatal(err)
defer client.Close()
type request struct
To string `json:"to"`
Data string `json:"data"`
type response struct
Result string
req := request"0x_MY_CONTRACT_ADDRESS", "0x8da5cb5b"
var resp response
if err := client.Call(&resp, "eth_call", req, "latest"); err != nil
log.Fatal(err)
fmt.Printf("%vn", resp)
What did I miss here?
Expected result:
Address in string format. E.g. 0x3ab17372b25154400738C04B04f755321bB5a94b
P/S — I'm aware of abigen and I know it's better and easier to do this using abigen. But I'm trying to solve this specific issue without using abigen method.
go ethereum json-rpc smartcontracts go-ethereum
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
Update
Since I'm not able to achieve this using the approach in this question, I created my own library to do the same thing (link). It doesn't rely on go-ethereum package but use the normal net/http
package to do JSON RPC request.
I still love to know what I did wrong in my approach below.
Definitions:
owner =public
variable in contract withaddress
type
contract = smart-contract that has owner
This is the curl request to get the owner of a contract. I managed to get the owner. (JSON RPC docs)
curl localhost:8545 -X POST
--header 'Content-type: application/json'
--data '"jsonrpc":"2.0", "method":"eth_call", "params":["to": "0x_MY_CONTRACT_ADDRESS", "data": "0x8da5cb5b", "latest"], "id":1'
"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000_OWNER"
But when I try to replicate it in Golang (code below), I got json: cannot unmarshal string into Go value of type main.response error. (go-ethereum code that I use)
package main
import (
"fmt"
"log"
"os"
"github.com/ethereum/go-ethereum/rpc"
)
func main()
client, err := rpc.DialHTTP(os.Getenv("RPC_SERVER"))
if err != nil
log.Fatal(err)
defer client.Close()
type request struct
To string `json:"to"`
Data string `json:"data"`
type response struct
Result string
req := request"0x_MY_CONTRACT_ADDRESS", "0x8da5cb5b"
var resp response
if err := client.Call(&resp, "eth_call", req, "latest"); err != nil
log.Fatal(err)
fmt.Printf("%vn", resp)
What did I miss here?
Expected result:
Address in string format. E.g. 0x3ab17372b25154400738C04B04f755321bB5a94b
P/S — I'm aware of abigen and I know it's better and easier to do this using abigen. But I'm trying to solve this specific issue without using abigen method.
go ethereum json-rpc smartcontracts go-ethereum
Update
Since I'm not able to achieve this using the approach in this question, I created my own library to do the same thing (link). It doesn't rely on go-ethereum package but use the normal net/http
package to do JSON RPC request.
I still love to know what I did wrong in my approach below.
Definitions:
owner =public
variable in contract withaddress
type
contract = smart-contract that has owner
This is the curl request to get the owner of a contract. I managed to get the owner. (JSON RPC docs)
curl localhost:8545 -X POST
--header 'Content-type: application/json'
--data '"jsonrpc":"2.0", "method":"eth_call", "params":["to": "0x_MY_CONTRACT_ADDRESS", "data": "0x8da5cb5b", "latest"], "id":1'
"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000_OWNER"
But when I try to replicate it in Golang (code below), I got json: cannot unmarshal string into Go value of type main.response error. (go-ethereum code that I use)
package main
import (
"fmt"
"log"
"os"
"github.com/ethereum/go-ethereum/rpc"
)
func main()
client, err := rpc.DialHTTP(os.Getenv("RPC_SERVER"))
if err != nil
log.Fatal(err)
defer client.Close()
type request struct
To string `json:"to"`
Data string `json:"data"`
type response struct
Result string
req := request"0x_MY_CONTRACT_ADDRESS", "0x8da5cb5b"
var resp response
if err := client.Call(&resp, "eth_call", req, "latest"); err != nil
log.Fatal(err)
fmt.Printf("%vn", resp)
What did I miss here?
Expected result:
Address in string format. E.g. 0x3ab17372b25154400738C04B04f755321bB5a94b
P/S — I'm aware of abigen and I know it's better and easier to do this using abigen. But I'm trying to solve this specific issue without using abigen method.
go ethereum json-rpc smartcontracts go-ethereum
go ethereum json-rpc smartcontracts go-ethereum
edited 2 days ago
asked 2 days ago
Zulhilmi Zainudin
3,21452750
3,21452750
add a comment |
add a comment |
4 Answers
4
active
oldest
votes
up vote
1
down vote
accepted
You can solve the problem best using the go-ethereum/ethclient:
package main
import (
"context"
"log"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main()
client, _ := ethclient.Dial("https://mainnet.infura.io")
defer client.Close()
contractAddr := common.HexToAddress("0xCc13Fc627EFfd6E35D2D2706Ea3C4D7396c610ea")
callMsg := ethereum.CallMsg
To: &contractAddr,
Data: common.FromHex("0x8da5cb5b"),
res, err := client.CallContract(context.Background(), callMsg, nil)
if err != nil
log.Fatalf("Error calling contract: %v", err)
log.Printf("Owner: %s", common.BytesToAddress(res).Hex())
Thanks. This is the closest solution. Appreciate your help!
– Zulhilmi Zainudin
16 hours ago
add a comment |
up vote
0
down vote
Your response struct doesn't show the data that the json of the response has
try this
type response struct
Jsonrpc string `json:"jsonrpc"`
ID int `json:"id"`
Result string `json:"result"`
Thank you for your help. Unfortunately, I still getjson: cannot unmarshal string into Go value of type main.response
error.
– Zulhilmi Zainudin
2 days ago
try tweaking the response. I didn't look at the library you are using it might strip off the jsonrpc or the id
– Vorsprung
2 days ago
I tried. I commented theJsonrpc
. It failed. Next I uncommentedJsonrpc
and commentedID
. It still failed.
– Zulhilmi Zainudin
2 days ago
add at lline 277 of go-ethereum client.go toprintf("%v",resp.Result)
just before it trips the error. See what it is returning
– Vorsprung
2 days ago
add a comment |
up vote
0
down vote
json: cannot unmarshal string into Go value of type main.response error. I got similar type error when i was unmarshaling a response. It was because the response was actually json string, i mean it had Quotation "
as first character. So to be sure you also encountered the same problem, please printf("%v",resp.Result)
before unmarshaling in here https://github.com/ethereum/go-ethereum/blob/1ff152f3a43e4adf030ac61eb5d8da345554fc5a/rpc/client.go#L278.
add a comment |
up vote
0
down vote
If you look at the client library code, you'll see that the JSON RPC response object is already disassembled and either an error is returned on failure, or the actual result parsed: https://github.com/ethereum/go-ethereum/blob/master/rpc/client.go#L277
The parser however already unwrapped the containing "result" field. Your type still wants to do an additional unwrap:
type response struct
Result string
Drop the outer struct, simply pass a string pointer to the client.Call
's first parameter.
Sorry @Péter Szilágyi, I'm not very clear. Can you show it in code? Thanks.
– Zulhilmi Zainudin
17 hours ago
add a comment |
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
You can solve the problem best using the go-ethereum/ethclient:
package main
import (
"context"
"log"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main()
client, _ := ethclient.Dial("https://mainnet.infura.io")
defer client.Close()
contractAddr := common.HexToAddress("0xCc13Fc627EFfd6E35D2D2706Ea3C4D7396c610ea")
callMsg := ethereum.CallMsg
To: &contractAddr,
Data: common.FromHex("0x8da5cb5b"),
res, err := client.CallContract(context.Background(), callMsg, nil)
if err != nil
log.Fatalf("Error calling contract: %v", err)
log.Printf("Owner: %s", common.BytesToAddress(res).Hex())
Thanks. This is the closest solution. Appreciate your help!
– Zulhilmi Zainudin
16 hours ago
add a comment |
up vote
1
down vote
accepted
You can solve the problem best using the go-ethereum/ethclient:
package main
import (
"context"
"log"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main()
client, _ := ethclient.Dial("https://mainnet.infura.io")
defer client.Close()
contractAddr := common.HexToAddress("0xCc13Fc627EFfd6E35D2D2706Ea3C4D7396c610ea")
callMsg := ethereum.CallMsg
To: &contractAddr,
Data: common.FromHex("0x8da5cb5b"),
res, err := client.CallContract(context.Background(), callMsg, nil)
if err != nil
log.Fatalf("Error calling contract: %v", err)
log.Printf("Owner: %s", common.BytesToAddress(res).Hex())
Thanks. This is the closest solution. Appreciate your help!
– Zulhilmi Zainudin
16 hours ago
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
You can solve the problem best using the go-ethereum/ethclient:
package main
import (
"context"
"log"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main()
client, _ := ethclient.Dial("https://mainnet.infura.io")
defer client.Close()
contractAddr := common.HexToAddress("0xCc13Fc627EFfd6E35D2D2706Ea3C4D7396c610ea")
callMsg := ethereum.CallMsg
To: &contractAddr,
Data: common.FromHex("0x8da5cb5b"),
res, err := client.CallContract(context.Background(), callMsg, nil)
if err != nil
log.Fatalf("Error calling contract: %v", err)
log.Printf("Owner: %s", common.BytesToAddress(res).Hex())
You can solve the problem best using the go-ethereum/ethclient:
package main
import (
"context"
"log"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main()
client, _ := ethclient.Dial("https://mainnet.infura.io")
defer client.Close()
contractAddr := common.HexToAddress("0xCc13Fc627EFfd6E35D2D2706Ea3C4D7396c610ea")
callMsg := ethereum.CallMsg
To: &contractAddr,
Data: common.FromHex("0x8da5cb5b"),
res, err := client.CallContract(context.Background(), callMsg, nil)
if err != nil
log.Fatalf("Error calling contract: %v", err)
log.Printf("Owner: %s", common.BytesToAddress(res).Hex())
edited 16 hours ago
answered 17 hours ago
user10595796
286
286
Thanks. This is the closest solution. Appreciate your help!
– Zulhilmi Zainudin
16 hours ago
add a comment |
Thanks. This is the closest solution. Appreciate your help!
– Zulhilmi Zainudin
16 hours ago
Thanks. This is the closest solution. Appreciate your help!
– Zulhilmi Zainudin
16 hours ago
Thanks. This is the closest solution. Appreciate your help!
– Zulhilmi Zainudin
16 hours ago
add a comment |
up vote
0
down vote
Your response struct doesn't show the data that the json of the response has
try this
type response struct
Jsonrpc string `json:"jsonrpc"`
ID int `json:"id"`
Result string `json:"result"`
Thank you for your help. Unfortunately, I still getjson: cannot unmarshal string into Go value of type main.response
error.
– Zulhilmi Zainudin
2 days ago
try tweaking the response. I didn't look at the library you are using it might strip off the jsonrpc or the id
– Vorsprung
2 days ago
I tried. I commented theJsonrpc
. It failed. Next I uncommentedJsonrpc
and commentedID
. It still failed.
– Zulhilmi Zainudin
2 days ago
add at lline 277 of go-ethereum client.go toprintf("%v",resp.Result)
just before it trips the error. See what it is returning
– Vorsprung
2 days ago
add a comment |
up vote
0
down vote
Your response struct doesn't show the data that the json of the response has
try this
type response struct
Jsonrpc string `json:"jsonrpc"`
ID int `json:"id"`
Result string `json:"result"`
Thank you for your help. Unfortunately, I still getjson: cannot unmarshal string into Go value of type main.response
error.
– Zulhilmi Zainudin
2 days ago
try tweaking the response. I didn't look at the library you are using it might strip off the jsonrpc or the id
– Vorsprung
2 days ago
I tried. I commented theJsonrpc
. It failed. Next I uncommentedJsonrpc
and commentedID
. It still failed.
– Zulhilmi Zainudin
2 days ago
add at lline 277 of go-ethereum client.go toprintf("%v",resp.Result)
just before it trips the error. See what it is returning
– Vorsprung
2 days ago
add a comment |
up vote
0
down vote
up vote
0
down vote
Your response struct doesn't show the data that the json of the response has
try this
type response struct
Jsonrpc string `json:"jsonrpc"`
ID int `json:"id"`
Result string `json:"result"`
Your response struct doesn't show the data that the json of the response has
try this
type response struct
Jsonrpc string `json:"jsonrpc"`
ID int `json:"id"`
Result string `json:"result"`
answered 2 days ago
Vorsprung
21.1k31940
21.1k31940
Thank you for your help. Unfortunately, I still getjson: cannot unmarshal string into Go value of type main.response
error.
– Zulhilmi Zainudin
2 days ago
try tweaking the response. I didn't look at the library you are using it might strip off the jsonrpc or the id
– Vorsprung
2 days ago
I tried. I commented theJsonrpc
. It failed. Next I uncommentedJsonrpc
and commentedID
. It still failed.
– Zulhilmi Zainudin
2 days ago
add at lline 277 of go-ethereum client.go toprintf("%v",resp.Result)
just before it trips the error. See what it is returning
– Vorsprung
2 days ago
add a comment |
Thank you for your help. Unfortunately, I still getjson: cannot unmarshal string into Go value of type main.response
error.
– Zulhilmi Zainudin
2 days ago
try tweaking the response. I didn't look at the library you are using it might strip off the jsonrpc or the id
– Vorsprung
2 days ago
I tried. I commented theJsonrpc
. It failed. Next I uncommentedJsonrpc
and commentedID
. It still failed.
– Zulhilmi Zainudin
2 days ago
add at lline 277 of go-ethereum client.go toprintf("%v",resp.Result)
just before it trips the error. See what it is returning
– Vorsprung
2 days ago
Thank you for your help. Unfortunately, I still get
json: cannot unmarshal string into Go value of type main.response
error.– Zulhilmi Zainudin
2 days ago
Thank you for your help. Unfortunately, I still get
json: cannot unmarshal string into Go value of type main.response
error.– Zulhilmi Zainudin
2 days ago
try tweaking the response. I didn't look at the library you are using it might strip off the jsonrpc or the id
– Vorsprung
2 days ago
try tweaking the response. I didn't look at the library you are using it might strip off the jsonrpc or the id
– Vorsprung
2 days ago
I tried. I commented the
Jsonrpc
. It failed. Next I uncommented Jsonrpc
and commented ID
. It still failed.– Zulhilmi Zainudin
2 days ago
I tried. I commented the
Jsonrpc
. It failed. Next I uncommented Jsonrpc
and commented ID
. It still failed.– Zulhilmi Zainudin
2 days ago
add at lline 277 of go-ethereum client.go to
printf("%v",resp.Result)
just before it trips the error. See what it is returning– Vorsprung
2 days ago
add at lline 277 of go-ethereum client.go to
printf("%v",resp.Result)
just before it trips the error. See what it is returning– Vorsprung
2 days ago
add a comment |
up vote
0
down vote
json: cannot unmarshal string into Go value of type main.response error. I got similar type error when i was unmarshaling a response. It was because the response was actually json string, i mean it had Quotation "
as first character. So to be sure you also encountered the same problem, please printf("%v",resp.Result)
before unmarshaling in here https://github.com/ethereum/go-ethereum/blob/1ff152f3a43e4adf030ac61eb5d8da345554fc5a/rpc/client.go#L278.
add a comment |
up vote
0
down vote
json: cannot unmarshal string into Go value of type main.response error. I got similar type error when i was unmarshaling a response. It was because the response was actually json string, i mean it had Quotation "
as first character. So to be sure you also encountered the same problem, please printf("%v",resp.Result)
before unmarshaling in here https://github.com/ethereum/go-ethereum/blob/1ff152f3a43e4adf030ac61eb5d8da345554fc5a/rpc/client.go#L278.
add a comment |
up vote
0
down vote
up vote
0
down vote
json: cannot unmarshal string into Go value of type main.response error. I got similar type error when i was unmarshaling a response. It was because the response was actually json string, i mean it had Quotation "
as first character. So to be sure you also encountered the same problem, please printf("%v",resp.Result)
before unmarshaling in here https://github.com/ethereum/go-ethereum/blob/1ff152f3a43e4adf030ac61eb5d8da345554fc5a/rpc/client.go#L278.
json: cannot unmarshal string into Go value of type main.response error. I got similar type error when i was unmarshaling a response. It was because the response was actually json string, i mean it had Quotation "
as first character. So to be sure you also encountered the same problem, please printf("%v",resp.Result)
before unmarshaling in here https://github.com/ethereum/go-ethereum/blob/1ff152f3a43e4adf030ac61eb5d8da345554fc5a/rpc/client.go#L278.
answered 2 days ago
nightfury1204
57826
57826
add a comment |
add a comment |
up vote
0
down vote
If you look at the client library code, you'll see that the JSON RPC response object is already disassembled and either an error is returned on failure, or the actual result parsed: https://github.com/ethereum/go-ethereum/blob/master/rpc/client.go#L277
The parser however already unwrapped the containing "result" field. Your type still wants to do an additional unwrap:
type response struct
Result string
Drop the outer struct, simply pass a string pointer to the client.Call
's first parameter.
Sorry @Péter Szilágyi, I'm not very clear. Can you show it in code? Thanks.
– Zulhilmi Zainudin
17 hours ago
add a comment |
up vote
0
down vote
If you look at the client library code, you'll see that the JSON RPC response object is already disassembled and either an error is returned on failure, or the actual result parsed: https://github.com/ethereum/go-ethereum/blob/master/rpc/client.go#L277
The parser however already unwrapped the containing "result" field. Your type still wants to do an additional unwrap:
type response struct
Result string
Drop the outer struct, simply pass a string pointer to the client.Call
's first parameter.
Sorry @Péter Szilágyi, I'm not very clear. Can you show it in code? Thanks.
– Zulhilmi Zainudin
17 hours ago
add a comment |
up vote
0
down vote
up vote
0
down vote
If you look at the client library code, you'll see that the JSON RPC response object is already disassembled and either an error is returned on failure, or the actual result parsed: https://github.com/ethereum/go-ethereum/blob/master/rpc/client.go#L277
The parser however already unwrapped the containing "result" field. Your type still wants to do an additional unwrap:
type response struct
Result string
Drop the outer struct, simply pass a string pointer to the client.Call
's first parameter.
If you look at the client library code, you'll see that the JSON RPC response object is already disassembled and either an error is returned on failure, or the actual result parsed: https://github.com/ethereum/go-ethereum/blob/master/rpc/client.go#L277
The parser however already unwrapped the containing "result" field. Your type still wants to do an additional unwrap:
type response struct
Result string
Drop the outer struct, simply pass a string pointer to the client.Call
's first parameter.
answered 19 hours ago
Péter Szilágyi
1112
1112
Sorry @Péter Szilágyi, I'm not very clear. Can you show it in code? Thanks.
– Zulhilmi Zainudin
17 hours ago
add a comment |
Sorry @Péter Szilágyi, I'm not very clear. Can you show it in code? Thanks.
– Zulhilmi Zainudin
17 hours ago
Sorry @Péter Szilágyi, I'm not very clear. Can you show it in code? Thanks.
– Zulhilmi Zainudin
17 hours ago
Sorry @Péter Szilágyi, I'm not very clear. Can you show it in code? Thanks.
– Zulhilmi Zainudin
17 hours ago
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53237759%2fhow-to-correctly-send-rpc-call-using-golang-to-get-smart-contract-owner%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password