今年上半年开始接触基于区块链的以太坊智能合约编程。由于网络现有资料大多使用truffle2.0框架,而更新的truffle3.0在使用习惯上有较大改动,很多教程已经不太适合新手使用。这里在吸收了部分网络资源,及多次自我尝试后,较为详细总结了linux系统下利用truffle3.0+testrpc完成以太坊智能合约+DApp开发用到的环境搭建过程,并归纳了开发过程中遇到的一些问题及解决方案,合约编程语言为solidity。
如有问题欢迎与我交流,转载请注明出处。
环境搭建
(打开终端:同时按住Ctrl + Alt + T键)
1.安装git
sudo apt-get install git
* 如果在安装git时出现E:Package 'git' has no installation candidate错误提示,即可使用:sudo apt-get install git-core
* git --version 查看是否安装成功
2.安装nodejs
sudo apt-get install curl
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
* nodejs -v 查看是否安装成功
3.安装solc和solc-cli
sudo npm install -g solc solc-cli --save-dev
* solcjs --help查看是否安装成功
4.安装solc二进制包(使用geth要用到)
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
4.1 建立软链接(可不用)
5.安装testrpc
sudo npm install -g ethereumjs-testrpc
* testrpc安装失败,找不到script,解决方法可参考
http://blog.csdn.net/wo541075754/article/details/53155578
* testrpc 查看是否安装成功
6.安装truffle3.0
sudo npm install -g truffle
* truffle version 查看是否安装成功
7.安装Geth
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
Truffle3.0使用教程(按顺序)
窗口1:
mkdir myproject 新建子目录
cd myproject
truffle init webpack初始化项目
truffle compile 编译
窗口2:
testrpc 启动testrpc
窗口1:
truffle migrate (truffle2.0以上)部署项目
npm run build
truffle serve 启动服务
窗口3:
打开浏览器,访问http://localhost:8080/
*运行多次时可能报错,将后两个指令改为npm run dev
项目文档说明
app/:存放前端javascript文件和stylesheets文件,在开发Dapps时使用;
contracts/:智能合约文件的存放目录;
migrations/:存放部署脚本;
test/:存放智能合约测试文件
DApp开发总结(truffle3.0)
1.对于一个不会改写区块链状态的f()函数,使用instance.f.call();而对于一个会改写区块链状态的函数f(),使用instance.f()。底层在实现调用上,会使用不同gas计算方式。
2.报错invalid address
原因:未设置默认账户地址
解决方案:
Test.defaults({
from : "0x299127d72e28cb92d09f856aaedeb139d1e7e74a"
});
*Test是合约初始化变量
3.合约交互抽象层语法
MyContract.setProvider(someWeb3Provider);
MyContract.deployed().then(function(instance) {
return instance.someFunction();
}).then(function(result) {
});
4.DApp界面读写数据
4.1 整型
var test = parseInt(document.getElementById("test").value);
meta.write(test);
meta.read.call().then(function(value) {
var value_element = document.getElementById("value");
value_element.innerHTML = value.valueOf(); });
4.2 字符串
var test = document.getElementById("test").value;
meta.write(test);
meta.read.call().then(function(value) {
var value_element = document.getElementById("value");
value_element.innerHTML = web3.toAscii(value); });