【eos全家桶系列】智能合约 & 私链激活 & 基本操作

简介

本篇文章,将跟大家介绍eos私链的激活、基础智能合约的安装,以及为大家演示转账等基础操作。还没有安装eos私链的同学,可以参考我上篇文章,先搭建好私链。

智能合约

承接上篇文章,我们启动私链 —> 创建公私钥对 —> 创建钱包 —> 将公私钥对导入钱包 —> 创建user账户。有同学会问,我们什么时候能发交易、做一些转账等基本操作?那我们就不得不提出一个新概念—智能合约。简单来说,智能合约是条款以计算机语言而非日常语言或法律语言记录的智能合同,其工作的基本原理类似于计算机程序的if-then语句,在预先设定的条件达成时,就自动执行相应的合同条款。

eos的所有功能,都是基于智能合约完成的。所以,如果我们要激活私链,想在私链上完成转账等交易,就需要部署eos的基础合约。eos有几个比较重要的系统合约,是我们必须要部署的:

- eosio.bios:eos的系统启动合约。这个合约是eos很多命令的基础合约,让我们可以直接通过eosio账户控制eos私链

- eosio.token:eos的发币合约。系统执行这个合约发行EOS,合约实现了指定代币发行给哪个账户、代币最大发行量、转账方法等功能

- eosio.msig:eos的提案合约。EOS持有人可以使用合约方法提出一个提案,其他人可以表决通过或者不通过这个提案,通过这个合约能实现交易的多重签名方案

- eosio.system:eos的系统命令合约。这个合约几乎实现了eos全部的系统命令,包括创建账户、资源质押、超级节点投票、域名竞拍等功能

所有的系统合约都在eos/contracts目录下面,这几个合约内部的方法实现细节,我会单独写文章介绍,大家现在只需要大致记住它们的作用即可。

私链激活

我们将模拟eos主网的部署启动过程,对eos私链进行激活:创建一系列系统账户、部署一系列系统合约、发币、选举超级节点等,大家跟着我一步一步操作。

第一步,部署eosio.bios系统合约,部署账户为eosio。

我们需要使用cleos命令行工具部署智能合约

cd eos

cleos set contract eosio contracts/eosio.bios -p eosio

tips:

- 这个操作是将eosio.bios合约部署到了eosio账户上,-p是指定授权账户为eosio。执行这个命令时,钱包一定要处于unlock状态,方便调取eosio账户的私钥。

- 执行cleos set contract时,可能会出现下面的报错:

这是因为eos的虚拟机使用的是webassembly,智能合约源码是用c++写的,需要先编译成wasm/wast文件,再部署到eos上面,才能被虚拟机执行。我们使用eos自带的工具eosiocpp去编译源码,这个工具在节点安装时就已经安装好了:

cd eos/contracts/eosio.bios

eosiocpp  -o  eosio.bios.wast   eosio.bios.cpp

第二步,创建一系列系统账户。

eos的系统账户是用来部署智能合约的,由eosio账户创建,有以下几个账户:

eosio.bpay:超级节点获取出块奖励的临时代管账户,增发EOS的1%的25%会先转到这个账户

eosio.msig:用来部署eosio.msig合约

eosio.names:用来管理域名竞拍

eosio.ram:用来管理ram买卖

eosio.ramfee:用来管理ram买卖产生的手续费,每笔买卖扣1%的手续费

eosio.saving:增发EOS临时存放账户,增发总量 5%,其中80%放在此账户,另外 20%再分成25%和75%,分别给eosio.bpay和eosio.vpay

eosio.stake:用来管理抵押换取cpu、net资源的EOS

eosio.token:用来部署eosio.token合约

eosio.vpay:节点们按照获得投票多少比例获取奖励的临时代管账户,增发EOS的1%的75%会先转到这个账户

使用cleos create key生成公私钥对,再将私钥导入钱包,最后执行cleos create account生成系统地址,忘记怎么操作的同学,请回顾我上篇内容中的钱包、账户部分。

cleos create key

cleos  wallet  import  -n  <wallet name>  --private-key  <private key>

cleos  create  account  eosio  <system account name>  <owner public key>  <active public key>

给大家举个例子,展示eosio.token账户是怎么创建的:

第三步,部署eosio.token合约,部署账户为eosio.token。

cd eosio

cleos  set  contract  eosio.token  contracts/eosio.token  -p  eosio.token

第四步,部署eosio.msig合约,部署账户为eosio.msig。

cd eos

cleos  set  contract  eosio.msig  contracts/eosio.msig  -p  eosio.msig

第五步,发布EOS代币,调用eosio.token账户下的eosio.token智能合约的create函数。

cleos  push  action  eosio.token  create  '[ "eosio", "1000000000.0000 EOS"]' -p eosio.token

tips:cleos push action命令,用来触发eosio.token合约的create函数,代币发行账户是eosio,发行量10亿,代币的符号是EOS。

第六步,将EOS资产打入eosio账户,调用eosio.token账户下的eosio.token智能合约的issue函数。

因为EOS的发行人是eosio账户,所以调用issue这个函数,需要eosio账户授权

cleos  push  action  eosio.token  issue  '[ "eosio", "1000000000.0000 EOS", "test message"]' -p eosio

第七步,部署eosio.system合约,部署账户为eosio。

cd eos

cleos  set  contract  eosio  contracts/eosio.system  -p  eosio -x 1000

第八步,创建账户。

这里我们创建账户,将使用cleos system newaccount命令,这是eos上创建普通账户所用的命令,底层实际上调用的是eosio.system合约的newaccount函数。之前提到的cleos create account命令,其实是为了eosio账户创建系统账户提供的命令,需要特殊权限才能执行。

cleos system newaccount  <account to pay for create cost>  <new account name> <owner public key> <active public key>  --stake-net <amount> --stake-cpu  <amount> --buy-ram  <amount>

eosio账户创建了一个账户voter1,为这个新账户抵押了20000EOS、20000EOS去换取cpu和net资源,付费20000EOS为这个账户买了ram资源。

tips:

- 新创建的账户,需要抵押一定的EOS去换取cpu、net资源,需要花费一定EOS去买ram资源,用于交易的发送。用于抵押cpu和net的EOS是可以赎回的,赎回需要3天时间。

- 资源的分配是按比例的。比如,抵押全网1%的eos,就可以换取全网1%的cpu或者net资源。

- cpu和net资源是可再生的,使用后一天就可恢复,ram是不可再生资源,用完得再买。

第九步,投票选举超级节点

上一步,我们创建两个账户voter1和bp1。eos的主链或者私链,初始的时候都是被系统账户eosio控制的。但是,如果想要激活eos的所有功能,则必须投票选举超级节点,且全网投票必须超过发行总量的15%,即1.5个亿。主链上是选举21个超级节点,它们轮流出块。私链上,我们只需要选举一个超级节点,让它出块即可。下面,我们将为大家演示超级节点的选举过程。

1)eosio将1.5亿EOS转账给voter1

cleos  transfer  eosio  voter1  "150000000.0000 EOS"  -p  eosio

2)voter1将EOS抵押为cpu、net资源,因为只有抵押为资源的EOS才能用于投票。

cleos  system  delegatebw  voter1  voter1  "150000000.0000 EOS"  "0 EOS"

我们抵押了1.5亿 EOS去换cpu资源,0 EOS去换net资源。cleos  system  delegatebw命令详情如下,from是出抵押的EOS的账户,to是接收抵押资源的账户,stake_net_quantity和stake_cpu_quantity是抵押EOS的金额:

3)将bp1注册为超级节点,只有注册的账户,其他账户才能给它投票

cleos  system  regproducer  bp1  <bp1's public key>

4)voter1投票给bp1,这里的投票是账户行为,等于将voter1抵押的全部EOS都投给了bp1

cleos  system  voteproducer  prods  voter1  bp1

这步执行完毕后,私链就算激活了,这时你会发现eosio账户已经不能出块了,我们需要修改配置文件config.ini,将producer-name替换为bp1,signature-provider换成bp1的公私钥对,然后执行nodeos重启节点,这时就是bp1负责出块了

基本操作

激活了私链之后,我们就解锁了eos全部的功能。下面,我将为大家介绍下EOS上的基本操作,如:查询账户详情、转账、质押资源、投票、查询账户余额等

账户相关

1)查询账户,这个命令可以看到账户的基本权限、cpu和net的质押和使用情况

cleos get account <account name>

2)转账

cleos transfer <from account>  <to account>  <amount>  <transfer message>

3)查询账户余额

cleos get currency balance <发币合约部署的账户>  <account name>  <代币符号>

4)质押EOS换取cpu、net资源

cleos system delegatebw <from account>  <to account>  <amount of EOS for cpu>  <amount of EOS for net>

from account和to account相同时,是自己给自己质押资源;不同时,是其他账户帮忙质押资源给自己。

5)取消资源质押

cleos  system undelegatebw  <from account>  <to account>  <amount of EOS for cpu>  <amount of EOS for net>

6)查看待赎回的资源

取消质押后,EOS并不会马上回到账户余额里,需要等待三天。这时可以在refunds表里查看待赎回的资源。

cleos get table <合约部署账户> <account name> refunds

7)手动触发refund

如果三天后发现EOS还没回到余额里,则需要手动触发refund函数。undelegatebw命令,本质上是在函数里延迟三天调用refund函数,属于合约调合约,有失败的可能。这里我不多做解释,今后会专门写一篇文章具体介绍。refund函数属于eosio.system合约,所以需要使用cleos push action命令:

cleos push action eosio refund '["account"]'   -p account

因为没到3天就触发refund,节点的输出日志会报错,需要等待

投票相关

1)注册为候选超级节点,注册之后其他账户才能为其投票

cleos system regproducer <account name> <public>

2)为超级节点投票

cleos  system  voteproducer  prods <account name>  <account you want to vote>

3)查看超级节点投票情况

cleos system listproducers

后记

本章为大家讲解了eos上的智能合约部署、私链激活、基本操作等内容,涉及的内容较多,需要大家实际动手去操作,其中可能会遇到问题,有问题可以去issue找答案,或者反馈给我。

关于cleos命令、eosiocpp命令的详细用法,可以查阅官方文档

接下来的几篇文章,将跟大家介绍eosio几个系统合约的详细实现,涉及源码解读,尽请期待!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容