智能合约学习笔记
1. 安装testrpc、truffle
$ npm install -g ganache-cli truffle
2. 启动testrpc
$ testrpc
3. 创建智能合约项目
3.1 初始化项目
新开一个终端窗口,通过以下命令建立项目:
ted@MacBook-Pro ~ mkdir SmartContact
ted@MacBook-Pro ~ cd SmartContact
ted@MacBook-Pro ~/SmartContact mkdir HelloWorld
ted@MacBook-Pro ~/SmartContact cd HelloWorld
ted@MacBook-Pro ~/SmartContact/HelloWorld truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!
Commands:
Compile: truffle compile
Migrate: truffle migrate
Test contracts: truffle test
ted@MacBook-Pro ~/SmartContact/HelloWorld ls
contracts migrations test truffle-config.js truffle.js
需要对目录结构做一个解释说明:
/contracts
: 存放智能合约原始代码的地方,可以看到里面已经有一个sol文件。
/migrations
: 这是 Truffle
用来部署智能合约的功能。
/test
: 测试智能合约的代码。
truffle.js
: Truffle
的设置文件。
3.2 创建HelloWorld合约
在contracts
文件夹中创建HelloWorld.sol
文件,内容如下:
pragma solidity ^0.4.4;
contract HelloWorld {
function sayHello() internal pure returns (string) {
retrun ("Hello World");
}
}
3.3 编译
在项目的目录下执行truffle compile
命令,将sol
文件编译成Ethereum bytecode
ted@MacBook-Pro ~/SmartContract/HelloWorld truffle compile
Compiling ./contracts/HelloWorld.sol...
Compiling ./contracts/Migrations.sol...
Writing artifacts to ./build/contracts
3.4 部署
在migrations
文件夹中已经存在一个配置文件,1_initial_migration.js
,仿照这个文件新建一个2_deploy_contracts.js
,内容如下:
var HelloWorld = artifacts.require("HelloWorld");
module.exports = function(deployer) {
deployer.deploy(HelloWorld);
};
在命令行中执行truffle migrate
开始部署,可能会遇到以下问题:
问题1:no-network-specified-cannot-determine-current network
解决办法是在`HelloWorld/truffle.js·文件中添加以下内容:
module.exports = { // See <http://truffleframework.com/docs/advanced/configuration> // to customize your Truffle configuration! networks: { development: { host: "127.0.0.1", port: 8545, network_id: "*" // Match any network id } } };
如果没有问题,顺利执行之后,智能合约即可部署成功
ted@MacBook-Pro ~/SmartContract/HelloWorld truffle migrate
Using network 'development'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0x3bcee88795e7c924e37cafbc8d45ac4c1366027046b0a862c1eedaef7f52b766
Migrations: 0xf2922d5da87b0b1db38fa3b97f7f14c8f7addf8a
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying HelloWorld...
... 0xda4bed7b7f31caaec9648419fd3cbe92e080c42929e6afdcfd4b113ccd64cbd9
HelloWorld: 0x58e311f91cae06f7e7d1e86fb8252d5f58c3f5c0
Saving artifacts...
ted@MacBook-Pro ~/SmartContract/HelloWorld
于此同时testrpc
的窗口也有一些内容输出:
3.5 调用合约
通过命令truffle console
进入truffle控制台,即可使用Javascript
调用刚才部署的合约。
ted@MacBook-Pro ~/SmartContract/HelloWorld truffle console
truffle(development)> HelloWorld.deployed().then(instance => contract = instance)
TruffleContract {
//此处省略很多输出内容
//调用sayHello 方法
truffle(development)> contract.sayHello.call()
'Hello World & Ted'
需要解释一段代码
HelloWorld.deployed().then(instance => contract = instance)
·truffle console中预载了
truffle-contract`函数库,以方便操作部署到区块链上的合约。
这边使用HelloWorld.deployed().then
语句来取得HelloWorld
合约的Instance
(实例),并存到contract
变量中,以方便后续的调用。
上面用的是Javascript ES6+
的语法,这句也可以写成:
HelloWorld.deployed().then(instance => {
contract = instance
});
还可以用ES5的写法:
HelloWorld.deployed().then(function(instance) {
hello = instance;
});
这里直接呼叫contract.sayHello()
也会得到一样的结果。truffle-contract
提供使用call()
来读取只读(read only)的数据,这样就不需提供gas
。因此如果遇到的操作需要向区块链写入数据,我们就不能用call
语句了。
最后在truffle console
中输入.exit
即可退出控制台回到终端页面。
本作品由TedXiong采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。