以太坊智能合约
上一章,我们讲了什么是智能合约,这一章,我们结合以太坊来讲讲和更详细的学习智能合约。
一.账户
以太坊的核心操作对象就是账户。账户又分为两类:外部所有账户和合约账户。
外部所有账户可能也被简称为“账户”,可以这么理解:外部账户与其他区块链电子货币的账户(如比特币)一样,即外部账户具有如下功能和特性:
1.人为创建的
2.存取货币
3.是公钥加密系统加密和产生的账户
4.以太坊上的外部账户还具有创建合约账户和部署合约的能力
因此,外部所有账户和合约账户,我们都认为是一个状态对象,这些状态主要体现为余额状态等,合约账户除拥有余额状态外,其还拥有合约存储状态。
下面我们来看看以太坊账户的创建、钥匙文件及备份?
i.创建账户
创建账户前提是安装好以太坊和go-ethereum,相关链接可参考 https://blog.csdn.net/ bylaven /article/details/80386862?from=groupmessage&isappinstalled=0,接着我们可 以输入personal.newAccount()命令创建用户及设置密码
ii.钥匙文件
刚才创建了一个账户,每个账户由一对公私钥来确定,每个账户其实就是一个地址,这个地址即公钥的最后20个字节,这个地址和私钥以json格式存储于keyfile“钥匙文件”中,并且私钥将只存储于用户客户端上。密钥文件格式如下:
{
"address": "6a787f16c2037826fbc112c337d7b571bb19c022",
"crypto": {
"cipher": "aes-128-ctr",
"ciphertext": "8ed39b22ab67a787baa4ebb545382255f747328e2a3e2e74970a0f66b422d169",
"cipherparams": {
"iv": "8e0e0905919d6d1669957fdf65f114ce" },
"kdf": "scrypt",
"kdfparams": {
"dklen": 32,
"n": 262144,
"p": 1,
"r": 8,
"salt": "a2a84d4843dbcb7c0aefa933f37ead073aefe8503ac8497b77828e85467c6822" },
"mac": "1fc4a5d260fdd70e772fdc9a28614e82d5ff0adc6c98332f8455c5aa0a3352ad" },
"id": "7bce1a69-79a2-429a-836c-cc2bf72c80de",
"version": 3}
iii.账户备份
从用户的钥匙文件中可以看出,以太坊账户的私钥的密文存储于ciphertext字段中,用户通过输入密码获取到私钥,而在交易中的所有签名都得通过私钥来完成,一旦私钥丢失,用户的账户将无法找回,因此,备份账户及私钥对我们来说相当对重要。
备份账户信息,我们只需要找到以太坊对存储目录即可,当然各种操作系统以太坊的存储目录我这不再赘述,相关资料可查看区块链技术指南的以太坊账户备份部分。
二.以太币
Ether币最小的单位是Wei,即Ether =10^{18}Wei,与比特币一样,以太币也有自己的一套激励机制-----以太坊上账户的操作及智能合约部署等都会支付以太币才能支撑运转,以太币获得都奖励主要分为:
静态奖励:每挖出一个区块获得5个以太币
动态奖励:
1.挖出的区块中交易的费用归矿工所有
2.挖出的区块中含叔区块,矿工可以从叔区块中领取额外的1/32个以太币的奖励( 每个区块仅限2个叔区块),以太币通过这种机制可以保障大矿池的垄断。
叔区块:指那些被挖出来的分叉链上的区块(由于网络延迟等原因没有被同步到新的区块中的区块)
三.gas
智能合约上链后无法修改,为防止恶意用户智能合约产生死循环的可能性,以太坊要求每执行一步智能合约都支付相应的费用,这些费用的最小单位就是gas。每个智能合约消耗的gas是固定的,但花费但gas越多可能能换取但时间越短(一种以金钱换时间的做法)。
与gas相关的几个概念及关联:
1.gas花销
gas花销是静态的,主要针对与每步操作是不变的,保证每个操作的gas花销都一样。
2.gas价格
gas价格是每个gas所兑换的以太币都数量,将随以太币的价格有所波动。
3.gas费用
gas价格乘以gas花销即gas费用,单位为以太币。
四.合约
以太坊智能合约与账户有相当关联,上面我们也曾介绍过账户的类型有外部账户和合约 账户,这里合约账户就是用来专门执行以太坊上的智能合约的。
1.编写智能合约
智能合约是一段可被以太坊虚拟机执行的代码,这些代码以二进制的形式存储于区块 链上,也称为以太坊虚拟机位码。目前,使用于开发以太坊智能合约的语音有solidity、serpent和LLL语言,具体相关语言请详细关注:
http://solidity.readthedocs.io/en/v0.4.24/
https://ethfans.org/wikis/Serpent-%E6%8C%87%E5%8D%97
http://llvm.org/docs/tutorial/index.html
下面以solidity编写一个例子:
pragma solidity ^0.4.17;
contract HelloWorld
{
address creator;
string greeting;
function HelloWorld(string _greeting) public
{
creator = msg.sender;
greeting = _greeting;
}
function greet() constant returns (string)
{
return greeting;
}
function setGreeting(string _newgreeting)
{
greeting = _newgreeting;
}
/**********
Standard kill() function to recover funds
**********/
function kill(string name) public returns (string)
{
require(keccak256(name) == keccak256("panzuchao"));
return name;
}
}
2.部署智能合约及运行
以太坊虚拟机在执行时,只识别以太坊虚拟机位码,因此,部署时,得将上面使用solidity高级语言写的代码译成以太坊虚拟机能识别的以太坊虚拟机位码。
下面我将举例使用truffle来部署我们上面的智能合约:
truffle的安装等详见:https://blog.csdn.net/loy_184548/article/details/77984366
在控制台中输入truffle migrate或者truffle migrate --reset,如图:
这样,我们等智能合约已经部署好啦。
3.调用智能合约
经过以上的部署运行后,我们可以通过web3.js或者geth cli客户端发起调用,相关调用api可参考
http://web3js.readthedocs.io/en/1.0/