Skip to content

Latest commit

 

History

History
115 lines (69 loc) · 3.47 KB

编写智能合约.md

File metadata and controls

115 lines (69 loc) · 3.47 KB

编写智能合约

工具

安装Atom,安装插件 linter-solidity,autocomplete-solidity和linter-solium。

环境

需要在开发机上安装好node.js,再用一下命令安装所需的工具:

npm install -g ethereumjs-testrpc truffle

启动testrpc

使用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上部署一次。