仍旧可以拼接成一个多功能的命令串

时间:2022-01-20 06:30:40

上一篇文章介绍了以太坊的根本常识,我们了解了web3.js的挪用方法是通过以太坊RPC技术,本篇文章旨在研究如何开发、编译、运行与使用以太坊RPC接口。

关键字:以太坊,RPC,JSON-RPC,client,server,api,web3.js,api实例,Postman

以太坊JSON RPC API geth命令api相关

之前介绍过这些API都可以在geth console中挪用,而在实际应用中,纯洁完整的RPC的挪用方法,

geth --rpc --rpcapi "db,eth,net,web3,personal"

这个命令可以启动http的rpc处事,固然他们都是geth命令下的,仿照照旧可以拼接成一个多成果的命令串,可以了解一下上一篇介绍的geth的使用情况。下面介绍一下api相关的选项参数:

API AND CONSOLE OPTIONS: --rpc 启动HTTP-RPC处事(基于HTTP的) --rpcaddr value HTTP-RPC处事器监听地点(default: "localhost") --rpcport value HTTP-RPC处事器监听端口(default: 8545) --rpcapi value 指定需要挪用的HTTP-RPC API接口,默认只有eth,net,web3 --ws 启动WS-RPC处事(基于WebService的) --wsaddr value WS-RPC处事器监听地点(default: "localhost") --wsport value WS-RPC处事器监听端口(default: 8546) --wsapi value 指定需要挪用的WS-RPC API接口,默认只有eth,net,web3 --wsorigins value 指定接收websocket请求的来源 --ipcdisable 禁失IPC-RPC处事 --ipcpath 指定IPC socket/pipe文件目录(明确指定路径) --rpccorsdomain value 指定一个可以接收请求来源的以逗号间隔的域名列表(浏览器访谒的话,要强制指定该选项) --jspath loadScript JavaScript根目录用来加载脚本 (default: ".") --exec value 执行JavaScript声明 --preload value 指定一个可以预加载到控制台的JavaScript文件,此中包罗一个以逗号分隔断绝分手的列表

我们在执行以上启动rpc命令时可以同时指定网络,指定节点,指定端口,指定可接收域名,甚至可以同时打开一个console,这也并不孕育产生斗嘴。

geth --rpc --rpcaddr <ip> --rpcport <portnumber>

我们可以指定监听地点以及端口,如果不谢rpcaddr和rpcport的话,就是默认的:8545。

geth --rpc --rpccorsdomain "http://localhost:3000"

如果你要使用浏览器来访谒的话,就要强制指定rpccorsdomain选项,否则的话由于JavaScript挪用的同源限制,请求会掉败。

admin.startRPC(addr, port)

如果已进入geth console,也可以通过这条命令添加地点和端口。

Postman,HTTP请求api

Postman是一个可以用来测试各类http请求的客户端工具,它还有其他很多用途,但这里只用它来测试上面的HTTP-RPC处事。

仍旧可以拼接成一个多功能的命令串

看图措辞,我们指定了请求地点端口,指定了HTTP POST请求方法,设置好请求为原始Json文本,请求内容为:

{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}

是用来请求处事器当前web3客户端版本的,然后点击"Send",得到请求功效为:

{ "jsonrpc": "2.0", "id": 67, "result": "Geth/v0.0.1-stable-930fa051/linux-amd64/go1.9.2" } 以太坊Go源码挪用rpc

我们就以最常用的为例,它的参数要求为:

Parameters - DATA, 20 Bytes - address to check for balance. - QUANTITY|TAG - integer block number, or the string "latest", "earliest" or "pending", see the default block parameter

该api要求的参数:

第一个参数为需查抄余额的地点

第二个参数为整数区块号,或者是字符串“latest","earliest"以及"pending"指代某个特殊的区块。

在go-ethereum项目中查找到使用位置ethclient/ethclient.go:

func (ec *Client) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { var result hexutil.Big err := ec.c.CallContext(ctx, &result, "eth_getBalance", account, toBlockNumArg(blockNumber)) return (*big.Int)(&result), err } func (ec *Client) PendingBalanceAt(ctx context.Context, account common.Address) (*big.Int, error) { var result hexutil.Big err := ec.c.CallContext(ctx, &result, "eth_getBalance", account, "pending") return (*big.Int)(&result), err }

结合上面的RPC API和下面的go源码的挪用,可以看到在go语言中的挪用方法:要使用客户端指针类型变量挪用到上下文Call的要领,传入第一个参数为上下文实例,第二个参数为一个hexutil.Big类型的功效接收变量的指针,第三个参数为挪用的rpc的api接口名称,第四个和第五个为该api的参数,如上所述。

跟踪到ec.c.CallContext,CallContext要领是ec.c东西的。

// Client defines typed wrappers for the Ethereum RPC API. type Client struct { c *rpc.Client }

可以看到ethclient/ethclient.go文件中将原rpc/client.go的Client布局体进行了一层包裹,这样就可以区分出来属于ethclient的要领和底层rpc/client的要领。下面贴出原始的rpc.client的布局体界说:

// Client represents a connection to an RPC server. type Client struct { idCounter uint32 connectFunc func(ctx context.Context) (net.Conn, error) isHTTP bool // writeConn is only safe to access outside dispatch, with the // write lock held. The write lock is taken by sending on // requestOp and released by sending on sendDone. writeConn net.Conn // for dispatch close chan struct{} didQuit chan struct{} // closed when client quits reconnected chan net.Conn // where write/reconnect sends the new connection readErr chan error // errors from read readResp chan []*jsonrpcMessage // valid messages from read requestOp chan *requestOp // for registering response IDs sendDone chan error // signals write completion, releases write lock respWait map[string]*requestOp // active requests subs map[string]*ClientSubscription // active subscriptions }