在CENTOS7上玩转Ethereum区块链(5): 实验一--在两台主机上分别部署eth rpc与truffle合约服务

1. 登录eth-host,在防火墙上放开8545端口后,然后启动testrpc服务。

firewall-cmd --zone=public --add-port=8545/tcp --permanent
systemctl restart firewalld
testrpc

启动后界面如下


2. 回到tru-host主机,进入t01目录,在console执行truffle命令

truffle compile
truffle migrate
compile执行完成后,目录下增加了build目录。


从上图可以看出,compile之后把contract(合约)中的三个sol脚本(solidity开发的脚本)编译到build目录中。好奇心驱使我们去看看build后的文件有啥不同…以ConvertLib为例,编译前后的比较如下图。


可见:

(1)  compile的过程就是把sol脚本转换成json格式的脚本

(2)  compile将sol中定义的函数体转换成了binary格式,方便EVM解读执行;

(3)  截止目前,貌似尚未与eth网络搭上边,networks编号为空。

但执行migrate的时候报错,意思是在localhost上未找到rpc服务(对应的是8545端口)。当然找不到咯,因为本实验就是想让truffle调用另一台主机上的eth rpc服务嘛。编辑下truffle.js文件,将其中localhost改为eth-host即可。

vim truffle.js


(4)再次执行truffle migrate执行成功。

truffle migrate


(5)运行合约服务

npm run dev
服务显示成功启动。是不是觉得太顺畅了反倒有点不安心了呢?

(6) 在页面上测试合约执行

在tru-host主机上打开浏览器输入 http://localhost:8080(知道为啥需要安装GNOME桌面了吧!)

结果提示错误。:(



(7)根据错误提示“There was an error fetching your accounts.”查找报错的脚本…

find . -name “*.js” | xargs grep -ril “fetching your accounts”
查到报错的脚本是:./app/javascripts/app.js

vim ./app/javascripts/app.js
查看端口情况,发现最后几行写着“localhost:8545”,修改成”eth-host:8545”

然后重新执行(5)、(6)步,最后成功现实了合约页面。


最后,终于成功了。有点小激动有木有?

 最后总结下本次实验:

(1)  实现了把eth rpc服务与truffle合约服务分开到两个不同的主机上部署;

(2) compile的过程实际是把sol文件编译成json,此刻与eth rpc网络无关;但migrate过程是依赖于eth rpc网络的,在migrate过程中会将rpc网络的信息写入build目录下的json脚本中。



(3)  在部署过程中遇到的问题,要耐心定位脚本然后分析问题解决问题,这个过程非常增长经验值;

(4)  在解决问题中发现node_modules目录下很多目录都有README.md文件,该文件中写了不少有关模块的调用与设计的说明,该说明也是非常难得的学习资料。比如,这段文字,有木有让你发现点什么…

Set a provider (HttpProvider)

```js
if (typeof web3 !== 'undefined') {
  web3 = new Web3(web3.currentProvider);
} else {
  // set the provider you want from Web3.providers
  web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
```

Set a provider (HttpProvider using [HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication))

```js
web3.setProvider(new web3.providers.HttpProvider('http://host.url', 0, BasicAuthUsername, BasicAuthPassword));
```

There you go, now you can use it:

```js
var coinbase = web3.eth.coinbase;
var balance = web3.eth.getBalance(coinbase);
```

好,今天先到这里。日后有机会再来研究上述代码...

Have a good weekend and a happy 10.1 !  :D

猜你喜欢

转载自blog.csdn.net/xc70203/article/details/78136957
今日推荐