4.4 JavaScript Console

优质
小牛编辑
122浏览
2023-12-01

JavaScript运行环境

Ethereum实现了可以在交互式(控制台)或非交互式(脚本)模式下使用的JavaScript运行环境(JSRE)。 Ethereum的Javascript控制台支持完整的web3 JavaScript Dapp APIadmin API

交互使用:JSRE REPL控制台

ethereum CLI可执行的geth具有JavaScript控制台(读取、计算、打印和循环(REPL)展现了JSRE),可以使用consoleattach子命令启动。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解释器上执行脚本文件,consoleattach子命令接受--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实现了setTimeoutsetInterval。除此之外,控制台还提供admin.sleep(seconds)和“blocktime sleep”方式admin.sleepBlocks(number)。由于ethereum.js使用bignumer.js库(MIT Expat License),它会被自动加载的

计时器

除了JS的全部功能(根据ECMA5)之外,ethereum JSRE还增加了各种定时器。它实现了setIntervalclearIntervalsetTimeoutclearTimeout,你可以在浏览器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