一、什么是智能合约
智能合约是存储在区块链上的一段代码,它们可以被区块链上的交易所触发,触发后,这段代码可以从区块链上读取数据或者向区块链上写入数据。
二、什么是Browser-solidity
Browser-solidity是一个官方提供的一个基于浏览器的合约编译器,非常好用,而且build版本会紧跟最新的Solidity的build版本。但由于网络原因以及GFW的存在,有可能会另一部分人访问很慢,进而影响开发效率。
Browser-solidity的地址:https://ethereum.github.io/browser-solidity
Browser-solidity工作区域介绍:
1.当前的solidity版本,如上图截图所示为0.4.9,这个默认用的是当前最新的release版本;新版本的solidify版本还有切换都是是在setting菜单下。
2.点击下拉框,可以选择不同的版本,包括还未成熟的最新构建版本,或者是之前的版本等。
3.点击create,会在内存中将该智能合约创建一个实例,即将下面的web3 deploy代码部署在虚拟的内存中。
4.bytecode是源代码的编译产物,这个也是最终会被放到区块链上的标识。任何在网络里的人都可以读到这段bytecode.
5.interface 是智能合约除了bytecode之外的另一个核心,他是该智能合约和外界沟通的核心
6.web3.deploy 代码,是可以直接部署在geth网络上的一段部署代码,在上一章中,我们已经试过了,只要复制黏贴这段代码,就可以直接在一个区块链私有链上进行部署,并且调用他。
7.from 代表合约由那个账户生成,那个账户生成,则生成所需的gas就需要该账户承担,默认为eth.accounts[0],因为所有的挖矿所得的以太币也默认都存入该账户中区。 data: 代表的就是bytecode gas: 代表的是为了部署该合约最多准备的gas数量,当然实际上可能用不了这么多gas,具体消耗以实际使用量为准,这里只是设定一个最大量。
8.最后这段是一个典型的javascript的异步调用的写法,将上面的new方法的结果传递给下一个方法 function(e,contract) 在下一个方法中处理如果挖矿成功的显示结果。
三、编辑源码
部署在Geth上的源代码如下:
3.1源码分析
pragma solidity ^0.4.0;
contract Demo {
function g(uint a) returns (uint b) {
return a*a*2;
}
}
第一行代码是必须的,否则编译器将不知道该如何选择编译器,以及编译器版本。
第二行:
Solidity中Contract和面向对象语言中的类很相像。有带持久数据的变量,以及能改变这些变量的function. 在不同的Contract实例中调用一个function,将会执行一个在EVM(以太坊虚拟机)中的function调用。
由此可见,Solidity中的智能合约和传统面向对象语言中的类很相像,因此有构造函数,有继承,有变量,有function,也有抽象类等等传统概念。
由Solidity所写的智能合约,经过编译后就会由EVM来部署执行
Solidity语言是一种类JS的语言,因此很多编码规范和JS很相似
第三行:
function f(uint a) returns (uint b)
{
...
}
上面说过,contract中包含了变量&方法(function)。function f(uint a) returns (uint b) 代表定义了一个名为f的方法,输入变量为uint a, 输出为uint b
uint 代表无状态的整型数字,即大于0的整数
uint = uint256, 最大值为2的256次方,这个数字对于绝大多数的数学运算是足够得了。
相对于uint来说还有带负数的整数类型,即int, int=int256, 取值范围从 负2的128次方到正2的128次方
Function的核心代码:
function f(uint a) returns (uint b)
{
return uint result = a * a*2;
}
这是一段很平常的js代码,值得注意的是以下两点
Solidity是一个类型语言,因此每个变量都需要定义他的类型,uint/int/string/var
关于编码风格 uint result = a * 8;, solidity 鼓励在操作符中有一个空格。如下:
x = 1;
y = 2;
long_variable = 3;
3.2这个时候在这个地址的左侧,复制黏贴上述的代码,然后就可以看到右侧编译好的代码:
1.这个时候点击红色 Create按钮,会在内存中将该智能合约创建一个实例,即将下面的web3 deploy代码部署在虚拟的内存中。
2.Trasaction/Execution Cost: 这个代表Create一个合约所消耗的成本,单位为Gas。Gas和Ether币有一个兑换关系,兑换比例由Oracle决定
3.这里可以看到我们的合约名称browser/first.sol:demo, 注册在了一个地址上面。这个代表该合约已经被挖矿出来了。
4.第三个就是我们上方的合约代码,g(n) {return 2*n * n}
5.这个时候我们输入3,然后点击f按钮,我们可以看到结果18,符合预期,执行f()这个function消耗的Gas Cost是21693+229
四、部署合约
4.1我们在命令行中,首先unlock(cc0),因为部署合约需要消耗gas,也就是以太币。而之前说过由于保护机制,不解锁账户,是不会允许任何以太币流出的。
4.2然后我们复制黏贴下面代码到geth 命令行中。
4.3等待片刻,会发现合约被部署到挖矿挖出来的区块中了, 按下回车代表成功
4.4此时输入合约部署的实例a_demotypes, 可以看到a_demotypes的详情。
4.5也可以调用a_demotypes的方法g, 输入任何数字,会返回n*n*2,如输入3,返回18