2021-05-30 18:19 | 出处: 邹刚
【以太坊智能合约编程】
【solidity傻瓜代码3】
pragma solidity >=0.4.22 <0.6.0;
contract Counter {
uint counter;
function count() public {
counter = counter + 1;
}
}
第一句: pragma,contract,unit,function等等解释见前文。
第二句:contract Counter。定义计数器合约。 counter(计数器)。
合约就是由函数和数据构成。
函数就是各种功能的实现。
这里就是实现一个计数器的功能。
counter = counter + 1;
这就是自己不断的给自己加一的计数器。比如跳绳,比如读秒,比如点钞机数钱等等。
function count() public {
counter = counter + 1;
}
注意:count和counter是两个东西。
count()是函数的名字。功能是计数器加一。
counter是一个uint的数据。记录所计的数。
所以再说一遍:合约就是由函数和数据构成。
Solidity 是一门编译型语言,代码被编译为以太坊虚拟机字节码之后,再部署到以太坊网络。用人话来说就是。至今为止,我们学的Solidity代码都是人类的语言(很像英语),计算机根本无法识别。所以需要下面的工具编译(compile)。(就是把sol代码翻译成电脑可以执行的语言)
https://remix.ethereum.org/
Remix 就是用来开发、编译、部署智能合约的IDE(集成开发环境)(简单说就是写代码的地方),它还是一个基于浏览器的Web IDE (在360浏览器就可以写sol代码) 。
创建文件会自动加一个.sol
sol表示这是solidity文件
代码拷贝到右边。如下图所示。
注意:合约的部署(Deploy)是要消耗以太坊的。
所以应该在测试网上来玩。不要在正式的以太坊部署(Deploy)这样的示范合约(没有任何用)
运行环境:EVM
EVM(Ethereum Virtual Machine)以太坊虚拟计算机 。用来执行以太坊上的交易,提供智能合约的运行环境。
而EVM运行在以太坊节点上,当我们把合约部署到以太坊网络上之后,合约就可以在以太坊网络中运行了。
合约的编译compile
以太坊虚拟机上运行的是合约的字节码形式,需要我们在部署之前先对合约进行编译,相当于把人类的语言翻译(solidity)成计算机语言(二进制语言)。
可以选择Remix 或solc编译器。
合约的部署Deploy
在以太坊上开发应用时,常常要使用到以太坊客户端(钱包)。
以太坊客户端(钱包)
以太坊客户端,其实我们可以把它理解为一个开发者工具,它提供账户管理、挖矿、转账、智能合约的部署和执行等等功能。
Geth是典型的开发以太坊时使用的客户端,基于Go语言开发。 Geth提供了一个交互式命令控制台,通过命令控制台中包含了以太坊的各种功能(API)。
以太坊中有两类账户
外部账户
该类账户被私钥控制(由人控制),没有关联任何代码。
合约账户
该类账户被它们的合约代码控制且有代码与之关联。
智能合约的部署是指把合约字节码发布到区块链上,并使用一个特定的地址来标示这个合约,这个地址称为合约账户。(由实际矿工出块之后,才真正部署成功)。
运行
合约部署之后,当需要调用这个智能合约的方法时只需要向这个合约账户发送消息(交易)即可,通过消息触发后智能合约的代码就会在EVM中执行了。
Gas汽油
占用区块链的资源(不管是简单的转账交易,还是合约的部署和执行)需要付出相应的gas费用
Gas费用就是愿意为这次交易愿意付出的费用:Gas价格(用以太币计价) * Gas数量。
Gas数量 :任何特定的合约所需的运行合约的Gas数量是固定的,由合约的复杂度决定。
Gas将按照特定规则被逐渐消耗,无论执行到什么位置,一旦Gas被耗尽,将会触发异常。当前调用帧所做的所有状态修改都将被回滚, 如果执行结束还有Gas剩余,这些Gas将被返还给发送账户。
还有一个好处就是如果没有这个gas费用的限制,就会有人写出无法停止(如:死循环)的合约来阻塞网络。
因此(把前面的内容串起来),我们需要一个有以太币余额的外部账户,来发起一个交易(普通交易或部署、运行一个合约),运行时,矿工收取相应的工作量费用(gas汽油)。
我们现在来总结一下,
1:以太坊是平台,它让我们方便的使用区块链技术开发去中心化的应用,
2:在这个应用中,使用Solidity来编写和区块链交互的智能合约,
3:合约编写好后之后,我们需要用以太坊客户端用一个有eth余额的账户去部署及运行合约。