安装Atom,安装插件 linter-solidity,autocomplete-solidity和linter-solium。
需要在开发机上安装好node.js,再用一下命令安装所需的工具:
npm install -g ethereumjs-testrpc truffle
使用testrpc命令来启动以太坊测试环境
开启另一个终端窗口,建立项目
mkdir SmartContract
cd SmartContract
mkdir helloWorld
cd HelloWord
truffle init
atom ./ # 用Atom编辑器打开项目
简单的合约内容
pragma solidity ^0.4.21;
contract HelloWorld {
function sayHello() returns (string) {
return ("Hello World");
}
}
将合约原始码编译成Etherem bytecode
truffle compile
truffle框架中提供了方便部署合约的脚本,打开migrations/2_deploy_contracts.js文件(脚本使用JavaScript编写),将内容修改如下:
var HelloWorld = artifacts.require("HelloWorld");
module.exports = function (deployer) {
deployer.deploy(HelloWorld);
};
执行truffle migrate命令
truffle migrate
出现如下的报错:
Error: No network specified. Cannot determine current network.
原因是truffle.js里没有配置链接合约发布时的环境地址,修改如下配置:
module.exports = {
networks: {
development: {
host: "localhost",
port:8545,
network_id:"*" // 匹配任何network id
}
}
};
重新执行truffle migrate
truffle提供命令行工具,执行truffle console命令行,可以用JavaScript来和刚刚部署的合约互动。
truffle console
> let contract
> HelloWorld.deployed().then(instance => contract = instance)
truffle console中预载了truffle-contract函数库,以方便操作部署到区块链上的合约。使用了HelloWorld.deployed().then语句来取得HelloWorld合约的Instance(实例),并存到contrct变量中,以方便后续的调用。
> contract.sayHello.call()
最后通过contract.sayHello.call()成功打印出"Hello World",这里直接调用contract.sayHello()也会得到一样的结果。truffle-contract提供使用call()来读取只读(read only)的数据,这样就不需提供gas。因此如果遇到的操作需要向区块链写入数据,我们就不能用call语句了。
在HelloWorld.sol中加入一个需要传入参数的echo方法,并回传输入的参数。
function echo(string name) constant returns (string) {
return name;
}
为echo方法添加一个constant声明,表示调用这个方法并不会改变区块链的状态,如此的话,通过truffle-contract来调用此方法时,会自动调用call来呼叫,也不需要额外提供gas。
由于更新了合约内容,需要重新编译一次,将编译结果部署到testrpc上,再通过truffle console执行查看结果。
truffle migrate --reset
truffle console
> let contract
> HelloWorld.deployed().then(instance => contract = instance)
> contract.echo("my contract is awesome")
Truffle会告诉你现在网络上的合约都已经是最新的,但事实上刚刚程序中新增的方法并没有更新到内存块链上。要更新内存块链上已部署的程序,需要改写migrations中的脚本,但现在还不到介绍migration的时候。还好我们开发用的内存块链是怎么修改都没关系的testrpc,可以使用truffle migrate --reset命令直接在testrpc上部署一次。