4.4 JavaScript Console
JavaScript运行环境
Ethereum实现了可以在交互式(控制台)或非交互式(脚本)模式下使用的JavaScript运行环境(JSRE)。 Ethereum的Javascript控制台支持完整的web3 JavaScript Dapp API和admin API。
交互使用:JSRE REPL控制台
该ethereum CLI
可执行的geth
具有JavaScript控制台(读取、计算、打印和循环(REPL)展现了JSRE),可以使用console
或attach
子命令启动。console
子命令启动geth节点,然后打开控制台。attach
子命令将无法启动geth节点,而是在运行的geth实例上打开控制台。
$ geth console
$ geth attach
如果geth节点正在运行非默认的ipc端点,或者您想通过rpc接口进行连接,则附加节点将接受端点。
$ geth attach ipc:/some/custom/path
$ geth attach rpc:http://191.168.1.1:8545
请注意,由于安全原因,默认情况下,geth节点不启动rpc服务,并且通过此接口不提供所有功能。当启动geth节点时带--rpcapi
参数,或者使用admin.startRPC
启动,这些默认值可以被覆盖。
假如你需要Log信息,执行:
$ geth --verbosity 5 console 2>> /tmp/eth.log
或者关闭Log,以免让Log信息占领你的控制台
$ geth console 2>> /dev/null
或
$ geth --verbosity 0 console
注意:由于数据库只能由一个进程访问,如果您有一个geth实例已经运行,那么你无法再运行geth console
。
非交互式使用:JSRE脚本模式
还可以在JavaScript解释器上执行脚本文件,console
和attach
子命令接受--exec
参数作为一个javascript的声明。
$ geth --exec "eth.blockNumber" attach
这将打印正在运行的geth实例的当前块号。
或使用更复杂的形式执行脚本:
$ geth --exec 'loadScript("/tmp/checkbalances.js")' attach
$ geth --jspath "/tmp" --exec 'loadScript("checkbalances.js")' attach
这里是一个示例脚本
使用--jspath <path/to/my/js/root>
为您的js脚本设置一个libdir。参数loadScript()
没有绝对路径,是相对此目录的路径。 您可以通过输入exit
或简单地使用快捷键CTRL-C
将控制台完全退出。
警告
go-ethereum JSRE使用了具有一些限制的Otto JS VM:
- “
use strict
”会被解析,但什么都不做。 - 正则表达式引擎(re2 / regexp)与ECMA5规范不完全兼容。
请注意,Otto的其他已知限制(即缺乏定时器)被考虑到。Ethereum JSRE实现了setTimeout
和setInterval
。除此之外,控制台还提供admin.sleep(seconds)
和“blocktime sleep”方式admin.sleepBlocks(number)
。由于ethereum.js使用bignumer.js库(MIT Expat License),它会被自动加载的
计时器
除了JS的全部功能(根据ECMA5)之外,ethereum JSRE还增加了各种定时器。它实现了setInterval
,clearInterval
,setTimeout
,clearTimeout
,你可以在浏览器window中使用。它还提供了admin.sleep(seconds)
,基于块的定时器的实现。admin.sleepBlocks(n)
表示一直休眠,直到添加的新块的数量等于或大于n,也可看做是“等待n个确认”。
除了官方DApp API接口之外,go ethereum节点还支持额外的管理API。这些API是使用JSON-RPC提供的,并遵循DApp API中使用的相同约定。go ethereum软件包中含有一个支持所有额外API的控制台客户端。
怎样做
可以为go ethereum后台程序指定API设置,这些API由使用--${interface}api
命令行参数的接口提供。通过界面提供通过 go ethereum守护程序的命令行参数提供的API集合。这儿的${interface}
可以是http接口的rpc
,或是unix上的Unix套接字的ipc
,Windows上命名管道。
例如,geth --ipcapi "admin,eth,miner" --rpcapi "eth,web3"
会
- 通过IPC接口启用admin,官方DApp和miner API
- 通过RPC接口启用eth和web3 API
请注意,通过rpc
接口提供的API将允许每个接触此接口的人访问此API(例如DApp)。所以请谨慎决定启用哪个API。默认情况下,geth通过ipc
接口启用所有API,通过rpc
接口只启用db,eth,net和web3 API。
想知道一个接口提供的modules transaction中可以使用哪个API,例如通过ipc
,unix
系统上的接口:
echo '{"jsonrpc":"2.0","method":"modules","params":[],"id":1}' | nc -U $datadir/geth.ipc
将给出所有启用的模块,包括版本号:
{
"id":1,
"jsonrpc":"2.0",
"result":{
"admin":"1.0",
"db":"1.0",
"debug":"1.0",
"eth":"1.0",
"miner":"1.0",
"net":"1.0",
"personal":"1.0",
"shh":"1.0",
"txpool":"1.0",
"web3":"1.0"
}
}
综合
这些额外的API遵循与官方DApp API相同的约定。Web3可以被扩展并被用于使用这些附加的API。 不同的功能分为多个较小的逻辑分组的API集合。示例是针对JavaScript控制台的,但是可以很容易地将其转换为rpc请求。
2个示例:
- Console:
miner.start()
- IPC:
echo '{"jsonrpc":"2.0","method":"miner_start","params":[],"id":1}' | nc -U $datadir/geth.ipc
- RPC:
curl -X POST --data '{"jsonrpc":"2.0","method":"miner_start","params":[],"id":74}' localhost:8545
以线程的数量为参数:
- Console:
miner.start(4)
- IPC:
echo '{"jsonrpc":"2.0","method":"miner_start","params":[4],"id":1}' | nc -U $datadir/geth.ipc
- RPC:
curl -X POST --data '{"jsonrpc":"2.0","method":"miner_start","params":[4],"id":74}' localhost:8545
为翻译,参见:https://ethereum.gitbooks.io/frontier-guide/content/jsre.html