FIX – The method personal_unlockAccount does not exist/is not available

摘要 : 动手实践笔记,在自己搭建私有区块链并且开发Smart Contract的过程中遇到一些问题。记录一下,以便以后翻阅。
The method personal_unlockAccount does not exist/is not available

问题

在自己搭建私有区块链并且开发Smart Contract的过程中遇到一些问题。记录一下,以便以后翻阅。

我在Azure平台上搭建了一个基于Ethereum的私有区块链的环境。 具体步骤可以参考我之前的blog 如何在Azure上快速创建一个Ethereum Consortium Network模板. 在这基础上,编写好一个测试的smart contract。下一步就是去做 smart contract的deploy.

在deploy的过程中,遇到一个问题,deploy需要一个上手有ether的account 提供gas。 Account本身很好弄,可以创建一个新的,并且提供一些ether作为gas. 但是在unlock 这个新user的时候,遇到了下面的错误。

1
2
3
4
5
6
7
8
9
10
11
Error: The method personal_unlockAccount does not exist/is not available
at Object.InvalidResponse (c:\Projects\nanoeth\node_modules\web3\lib\web3\errors.js:38:16)
at RequestManager.send (c:\Projects\nanoeth\node_modules\web3\lib\web3\requestmanager.js:61:22)
at Personal.send [as unlockAccount] (c:\Projects\nanoeth\node_modules\web3\lib\web3\method.js:145:58)
at Object.<anonymous> (c:\Projects\nanoeth\index.js:27:23)
at Module._compile (module.js:649:14)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)

原因

出于安全的原因,Ethereum Consortim Network的模板在创建出来的以太网络不允许从远端执行personal.newAccount 或者 personal.unlockAccount的命令。这个命令可以登陆到transaction Node上在本地做。当然,这样也就非常不方便。毕竟我的开发环境并不在transaction node上。

解决方案

在查阅了很多文章之后,得到了启发。解决发放就是登陆到transaction node上修改$/start-private-blockchain.sh 配置文件中的内容。添加 –rpcapi “eth,net,web3,admin,personal” 的内容,从而开启 RPCAPI的personal的功能。

步骤

  1. 打开 MobaXterm, 并且登陆到Transaction Node上。SSH CONSOLE的连接字符串可以参考 ETHEREUM-RPC-ENDPOINT。这个连接字串大概看起来像是这样:
    ssh -p 3000 gethadmin@yourVM.southeastasia.cloudapp.azure.com
    如何在Azure Portal上找到ETHEREUM-RPC-ENDPOINT可以参考这个文章。

  2. 在 MobaXterm 的左侧导航栏上很方便的就能看到远端服务器上的文件。双击点开 start-private-blockchain.sh

    img

  3. MobaTextEditor会自动下载并且打开这个文件。找到下面这段内容

    1
    nohup geth --datadir $GETH_HOME -verbosity $VERBOSITY $BOOTNODE_URLS --maxpeers $MAX_PEERS --nat none --networkid $NETWORK_ID --identity $IDENTITY $MINE_OPTIONS $FAST_SYNC --rpc --rpcaddr "$IPADDR" --rpccorsdomain "*" >> $GETH_LOG_FILE_PATH 2>&1 &

    将这段配置修改为如下内容:

    1
    nohup geth –datadir $GETH_HOME -verbosity $VERBOSITY $BOOTNODE_URLS –maxpeers $MAX_PEERS –nat none –networkid $NETWORK_ID –identity $IDENTITY $MINE_OPTIONS $FAST_SYNC –rpc –rpcaddr "$IPADDR" –rpccorsdomain "*" –rpcapi "eth,net,web3,admin,personal" >> $GETH_LOG_FILE_PATH 2>&1 &
  4. 用MobaTextEditor 保存并且上传到服务器端。

  5. 在Azure Portal上重启Transaction Node, 使其生效。

参考文档

Sonic Guo