以太坊学习路线——(三)Solidity常⽤IDE搭建、合约编译、 这篇博客演⽰的基本操作系统环境是CentOS 7,参考书籍:以太坊开发实战——以太坊关键技术与案例分析 第七、九章(吴寿鹤、冯翔、刘涛、周⼴益 著)。
⼀、常⽤IDE
2.IntelliJ IDEA也提供了solidity的插件如下:(点击安装即可)
但是安装完毕后,是不能直接⼿动建⽴solidity项⽬的,需要建⽴⼀个java项⽬或者其他项⽬,然后右键项⽬名,在弹出的选项中选择New,然后点击New Solidity File选项,会弹出下⾯的对话框,输⼊你的合约⽂件名,并选择Smart contract。
此时可以编写合约⽂件了,但还不能编译合约,所以需要先下载solidity的编译器:命令⾏可执⾏⽂件名为solcjs。
然后将编译器连接到IntelliJ idea中,在设置中到External Tools,可以看到如下图右侧区域,这是我已经创建的外部⼯具
如果你没有创建过则为空,点击“+”添加外部⼯具:
Name:solidity
Program:/usr/local/node/lib/node_modules/solc/solcjs(注意:这是你安装的solc可执⾏⽂件路径,注意核实)
Arguments:--abi --bin $FileName$ -o $OutputPath$(--abi表⽰⽣成相关应⽤⼆进制接⼝、--bin表⽰⽣成⼆进制⽂件、$OutputPath$表⽰这些⽣成的⽂件的存储路径)
Working directory:$FileDir$(代表在当前路径)
然后编写你的合约⽂件,要编译时,右键你的合约⽂件,选择External Tools -> solidity就开始编译你的合约⽂件了。如下图,左侧为编译输出⽂件⽬录,右侧为合约代码,下⾯是编译输出结果。
⼆、编辑并编译合约
1.编写合约
编写Storage.sol合约⽂件如下:
pragma solidity >=0.4.21 <0.6.0;
contract Storage {
uint256 public storedData;
function set(uint256 data) public {
storedData = data;
}
function get() public returns (uint256) {
return storedData;
}
}
2.命令⾏编译合约
由于solcjs的comandline选项与solc不兼容,⽽⼯具(如geth)希望solc的⾏为不适⽤于solcjs。我直接下载了solc的可执⾏⽂件然后执⾏下⾯的命令:
//把⽂件所属改为root,也可以不改,因为我是以root⽤户使⽤
$ chown root solc-static-linux
//把⽂件名改为solc
$ mv solc-static-linux solc
//把你的solc可执⾏⽂件添加到/usr/bin/,就可以在任何⽬录运⾏该程序
$ cp ./solc /usr/bin/
大家小事//查看命令⾏参数说明⽂档
$ solc --help
//然后就可以开始运⾏编译solidity⽂件了
[root@localhost code]# solc --optimize --abi --bin Storage.sol -o ./out
Compiler run successful. Artifact(s) can be found in directory ./out.
//编译成功后可以看到⽣成的两个⽬标⽂件
out/
├── Storage.abi
└── Storage.bin
其中bin⽂件是合约被编译后的⼆进制内容,abi(Application Binary Interface,“应⽤⼆进制接⼝”)⽂件,可理解为合约接⼝说明。当合约被编译后,那么它的abi也就确定了。编译后的abi⽂件内容如下:
[
{
"constant":true,
"inputs":[],
"name":"storedData",
"outputs":[{"name":"","type":"uint256"}],
"payable":false,
"stateMutability":"view",
"type":"function"
},
{
"constant":false,
网络市场营销
"inputs":[{"name":"data","type":"uint256"}],
"name":"set","outputs":[],
中国导医网"payable":false,
"stateMutability":"nonpayable",
"type":"function"
戴西},
{
"constant":true,
"inputs":[],
"name":"get",
"outputs":[{"name":"","type":"uint256"}],
"payable":false,
"stateMutability":"view",
"type":"function"
}
]
可以看到这个合约abi解析后是⼀个数组,⾥⾯包含了三个对象,后两个对象对应了合约中的set⽅法和get⽅法,⽽第⼀个则对应了状态变量storedData,在solidity实现底层同样是以⽅法对待了。其中相关关键字解释如下: type:⽅法类型,包括function、constructor、fallback,默认为function。
name:⽅法名。
inputs:⽅法参数,它是⼀个对应数组,数组⾥的每个对象都是⼀个参数说明。name(参数名)、type(参数类型)。
outputs:outputs是⼀个数组,数组内的参数可以参考上⾯的inputs,这两个数组的格式是⼀样的。
constant:布尔值,如果为true指明⽅法,则不会修改合约的状态变量。
payable:布尔值,标明是否可以接收ether。
三、部署合约
1.
2.部署
(1).
(2).命令⾏⽅式部署
打开终端到solidity⽂件同⼀路径下执⾏:
$ echo "var storageOutput=`solc --optimize --combined-json abi,bin,interface Storage.sol`" > storage.js
在geth控制台加载⽣成的storage.js:
> loadScript('/opt/idea-IU-191.6183.87/code/storage.js')
true
> storageOutput
{
contracts: {
Storage.sol:Storage: {
abi: "[{\"constant\":true,\"inputs\":[],\"name\":\"storedData\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"fun bin: "608060405234801561001057600080fd5b5060b88061001f6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80 }
},
version: "0.5.7+commit.6da8b019.Linux.g++"
在storageOutput对象中存储了⼀个map对象,在acts["Storage.sol:Storage"]中有两个key,分别定义了
合约地ABI和编译后的⼆进制代码。下⾯分别获取这两个对象并分别赋值给两个变量,将使⽤ABI、bin来部署和调⽤智能合约。
> var storageContractAbi = acts['Storage.sol:Storage'].abi
undefined
> var storageContract = act(JSON.parse(storageContractAbi))
undefined
> var storageBinCode = "0x" + acts['Storage.sol:Storage'].bin
undefined
在正式开始部署之前,需要先解锁账户:
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x8c7ae59ab7e5d510ae3f09a9544978f50315b5f5
Passphrase:
true
然后开始部署,使⽤act的new⽅法向⽹络中发送部署合约的交易,返回⼀个web3js合约实例地址
storageInstance.
> var deployTransationObject = {from: eth.accounts[0], data: storageBinCode, gas: 1000000};
像素种子
undefined
> var storageInstance = w(deployTransationObject)
undefined
企业国有产权转让管理暂行办法