[转]EOS智能合约 & 私链激活 & 基本操作
链接:https://www.jianshu.com/p/90dea623ffdf
简介
本篇文章,将跟大家介绍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智能合约 & 私链激活 & 基本操作的更多相关文章
- 【精解】EOS智能合约演练
EOS,智能合约,abi,wasm,cleos,eosiocpp,开发调试,钱包,账户,签名权限 热身 本文旨在针对EOS智能合约进行一个完整的实操演练,过程中深入熟悉掌握整个EOS智能合约的流程,过 ...
- EOS智能合约开发(三):EOS创建和管理账号
没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保 ...
- EOS智能合约存储实例讲解
EOS智能合约存储实例 智能合约中的基础功能之一是token在某种规则下转移.以EOS提供的token.cpp为例,定义了eos token的数据结构:typedef eos::token<ui ...
- EOS智能合约授权限制和数据存储
EOS智能合约授权限制和数据存储 在EOS合约中,调用合约需要来自账户的授权,同时还要指定需要调用的动作.当然,有的合约并不是所有账户都可以调用的,这就需要用到授权限制.接下来我们就来看看如何限制合约 ...
- EOS智能合约开发(四):智能合约部署及调试(附编程示例)
EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...
- EOS智能合约开发(二):EOS创建和管理钱包
上节介绍了EOS智能合约开发之EOS环境搭建及启动节点 那么,节点启动后我们要做的第一件事儿是什么呢?就是我们首先要有账号,但是有账号的前提是什么呢?倒不是先创建账号,而是先要有自己的一组私钥,有了私 ...
- EOS 智能合约编写(一)
本文编写了一个简单的EOS智能合约,实现用户管理和资产管理,包括存钱,取钱,转帐的功能,旨在学习如何编写自己的EOS合约功能. 系统:Ubuntu EOS版本:v1.1.1 一.智能合约代码 ...
- eos智能合约与主进程交互
eos智能合约与主进程交互 1.启动wasm 参考eos智能合约执行流程.md 2.智能合约调用主进程api 如何实现wasm代码与eos宿主交互还需要摸索! 大致:在wasm_interface.c ...
- eos智能合约执行流程
eos智能合约执行 1. 执行流程 controller::push_transaction() // 事务 -> transaction_context::exec() // 事务 -&g ...
随机推荐
- hive -- 协同过滤sql语句
hive -- 协同过滤sql语句 数据: *.3g.qq.com|腾讯应用宝|应用商店 *.91rb.com|91手机助手|应用商店 *.app.qq.com|腾讯应用宝|应用商店 *.haina. ...
- iOS启动速度优化
背景 7月26号我们阿里数据iOS端发布了4.4.0版本,这次版本主要是优化了性能,其中main()阶段的启动耗时优化成果比较明显,从之前的0.5-0.7秒,降低为目前的0.1-0.2秒(main() ...
- 苹果手机的SB系列(3)超级烦人的账户解锁?
不知道大家有没有这种体验,Iphone 每隔一段时间后账户就被锁定了,也不告诉你原因,就是要解锁? 我怎么感觉比做的比支付宝差多了,我注册支付宝十几年,也没有动不动就告诉了有安全原因,要解锁,要重置密 ...
- JQ菜单滑块
网站导航滑块效果: 复制以下代码保存到html文件中即可查看效果... <html> <head> <title>JQ菜单滑块</title> < ...
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾
错误描述:fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "stdafx.h"”? 错误分析: 此错误发生 ...
- java使用格式String型转成Date型
public class TimeTwo { public static void main(String[] args) throws ParseException{ String s = &quo ...
- android控件基本布局
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=&qu ...
- 《程序设计入门——C语言》翁恺老师 第三周编程练习记录
1 时间换算(5分) 题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果 ...
- Quick Sort -- 快速排序算法
//参数说明: // int data[] : 待排序的数据数组 // int m : 下限值 // int n : 上限值 void QuickSort ( int data[] , int m , ...
- 物联网智能家居ppt