1.学习目标
- 了解智能合约
- 简单环境搭建
- 能够利用solidity编写Hello World合约
- 合约部署
- 和合约互动
2.使用solidity语言撰写智能合约
Ethereum上的智能合约需要使用solidity语言来撰写。solidity是一种类似Javsscript的语言,而且围绕着solidity的各种开发工具链,都是使用属于Javascript生态系的npm来提供的。但solidity在语法上比较像Java或C#,因为和Javascript不同,solidity与Java或C#同属于强类型语言,、在定义函数时同样需要指定回传的类型、同样也需要先编译才能执行。这些特性都是Javascript所不具备的。
3.开发前的准备
我们将使用当前最活跃的智能合约开发框架truffle为基础来开发。ENS(Ethereum Name Service)也是采用truffle框架。其他选择还有embark等。
开发过程中,我们将使用testrpc工具在电脑上模拟智能合约所需的以太坊内存块链测试环境。
testrpc中也包含了Javascript版本的Ethereum虚拟机(Ethereum Virtual Machine),因此可以完整地执行智能合约。
代码编辑器使用Atom,搭配solidity插件来开发。Atom是Github为开发者设计的基于Chromium的编辑器,支持NodeJS写的插件,内置Git,使用MIT协议开源发布。solidity插件除了支持语法高亮之外,也会透过Solium检查并提示基本的语法错误,相当方便。其他编辑器应该也有类似的插件可选择。
4.Ubuntu环境下Atom编辑器安装及使用
sudo add-apt-repository ppa:webupd8team/atom
sudo apt-get update
sudo apt-get install atom
安装插件linter-solidity、autocomplete-solidity、linter-solium以方便solidity代码编写。
5.安装所需工具
首先安装Node.js
安装nvm
cd ~
mkdir .nvm
cd .nvm
git clone https://github.com/creationix/nvm
等待下载完毕后source ~/.nvm/nvm/nvm.sh
添加到~/.profile
之类的文件中
vim ~/.profile
并在文件末尾添加source ~/.nvm/nvm/nvm.sh
source ~/.profile
nvm --version
检查安装是否正确
安装node
nvm install node
node --version
安装npm
git clone --recursive git://github.com/isaacs/npm.git
cd npm/bin
node npm-cli.js install npm -g
npm --version
安装ethereumjs-testrpc和truffle
npm install -g ethereumjs-testrpc truffle
sily@lyg-sily:~$ npm install -g ethereumjs-testrpc truffle
/home/sily/.nvm/nvm/versions/node/v9.3.0/bin/testrpc -> /home/sily/.nvm/nvm/versions/node/v9.3.0/lib/node_modules/ethereumjs-testrpc/build/cli.node.js
/home/sily/.nvm/nvm/versions/node/v9.3.0/bin/truffle -> /home/sily/.nvm/nvm/versions/node/v9.3.0/lib/node_modules/truffle/build/cli.bundled.js
+ ethereumjs-testrpc@6.0.3
+ truffle@4.0.4
added 343 packages in 115.81s
启动testrpc
安装好后随时可以使用testrpc
命令来启动以太坊测试环境。
sily@lyg-sily:~$ testrpc
EthereumJS TestRPC v6.0.3 (ganache-core: 2.0.2)
Available Accounts
==================
(0) 0x7e1897cec8e1a098384d17e85a9cd348ccb92b4a
(1) 0x6c96c6cb16442ab83aea0eb1bc3a183e28a922fe
(2) 0x163f0e06082c5cd14ff56658b186a30b0f6e7d9f
(3) 0x0e9558b2cb935ab26484c3d6783fbf2fe70041c8
(4) 0xa2233f08bbb7e3a826cc4c2cede22caf3a6922e6
(5) 0x3b1317510218f98946e0fb72b1a0685ac00bcbc4
(6) 0xca33f56a03e5ae86e25655f4dd7de88be12ec184
(7) 0xfb56aed85dd00908f1e0729ed80d06f456898588
(8) 0x6cfe240b49a28986057016ef2ecd9d6711f6b632
(9) 0x0e866473d6776edc39935dd5d00425b6ab2a423a
Private Keys
==================
(0) 3ae87bfaeabf103ce723b78525ab1278b2c7652b93b99a0131321adaa7000537
(1) 2f23eaef51f941b7af171a56acbd7524554ad529236b6abb6920935218f5df58
(2) 9b5b5d42786e74364e80b45ecf1a2b7201db7eafe12684f71006fbe3368e6dfe
(3) 33181b42772371fad50f29b8377f7a3de72000397f9b021677e329bede7bfcc7
(4) 3f5f366d89ab9263b92f35368840d24d562af043db8a5ad773dc8cc8f122662d
(5) 29933e3e79129da23da3cc0f5cecb03c583c3ad6c4c1ad8a39d68386fe92d91b
(6) 7e9bd47a6120bb9a240a96ce80866b98646f07cb98197bdffec389805575144b
(7) 0c7144621371a04e4ee733d06482b0a23ed775af17172e75e26f2b8915814e35
(8) 60ab702bdad5a348645f65fb0678cafec891c534964982d97b96f4a57abd78ef
(9) 8ff45f1ccb23bec8a317a6e218b3b50290646317b5c809c797e1522bcef9d031
HD Wallet
==================
Mnemonic: vapor high liberty evoke pledge bronze critic stomach neck figure recipe mind
Base HD Path: m/44'/60'/0'/0/{account_index}
Listening on localhost:8545
可以看到testrpc
启动后自动建立了10个账号(Accounts),与每个账号对应的私钥(Private Key)。每个账号中都有100个测试用的以太币(Ether)。要注意testrpc
仅运行在内存中,因此每次重开时都会回到全新的状态。
一切就绪,我们可以开始建立第一个智能合约项目了。
6.建立项目
开启另一个终端,输入以下命令以建立项目:
sily@lyg-sily:~$ mkdir SmartContractDemo
sily@lyg-sily:~$ cd SmartContractDemo/
sily@lyg-sily:~/SmartContractDemo$ mkdir HelloWorld
sily@lyg-sily:~/SmartContractDemo$ cd HelloWorld/
sily@lyg-sily:~/SmartContractDemo/HelloWorld$ truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!
Commands:
Compile: truffle compile
Migrate: truffle migrate
Test contracts: truffle test
sily@lyg-sily:~/SmartContractDemo/HelloWorld$ ls
contracts migrations test truffle-config.js truffle.js
sily@lyg-sily:~/SmartContractDemo/HelloWorld$
目录结构
/contracts
:存放智能合约原始代码的地方,可以看到里面有个Migrations.sol
文件,我们的HelloWorld.sol
文件就存放在这里。
/migrations
:这是Truffle
用来部署智能合约的功能,待会儿我们会修改2_deploy_contracts.js
来部署HelloWorld.sol
。
/test
:测试智能合约的代码放在这里,支持js
与sol
测试。
truffle.js
:Truffle
的设置文档。
7.新建HelloWorld合约
在contracts
文件夹下新建HelloWorld.sol
文件,当然也可以直接在HelloWorld
路径下面直接执行truffle create contract HelloWorld
命令来创建HelloWorld.sol
。
sily@lyg-sily:~/SmartContractDemo/HelloWorld$ ls
contracts migrations test truffle-config.js truffle.js
sily@lyg-sily:~/SmartContractDemo/HelloWorld$ truffle create contract HelloWorld
sily@lyg-sily:~/SmartContractDemo/HelloWorld$ cd contracts/
sily@lyg-sily:~/SmartContractDemo/HelloWorld/contracts$ ls
HelloWorld.sol Migrations.sol
sily@lyg-sily:~/SmartContractDemo/HelloWorld/contracts$
HelloWorld.sol
的文件内容如下:
pragma solidity ^0.4.4;
contract HelloWorld {
function sayHello() returns (string) {
return ("Hello World");
}
}
代码说明
pragma solidity ^0.4.4;
第一行表明目前使用的solidity
版本,不同版本的solidity
可能会编译出不同的bytecode
。^
代表兼容solidity 0.4.4~0.4.9
的版本。
contract HelloWorld {
...
}
contract
关键字类似于其他语言中较常见的class
。因为solidity
是专为智能合约(Contract)设计的语言,声明contract
后即内置了开发智能合约所需的功能。也可以把这句理解为
function sayHello() returns (string) {
return (