您正在查看: Surou 发布的文章

DApp接入最新版本Scatter.js支持,以及ScatterDesktop的使用

我们知道目前EOS DApp运行,目前分为两种方式

  • App提供DApp运行环境。App内置浏览器控件,注入js,DApp运行时用注入的js与App内置的钱包交互,DApp需要私钥签名时,将需要签名的数据通过注入的js将数据传给外部的钱包,使用钱包当前选中的私钥将数据签名,然后将数据返回给DApp。
  • 浏览器扩展提供支持。目前支持EOS链的扩展主要是以Scatter,或者基于此二次开发为主。

本篇我们主要讲下DApp对Scatter的接入,大多的App提供的运行环境也是支持Scatter的,比如tp钱包等,并且Scatter在EOS链的绝对地位(不低于Metamask对于以太坊),所以我们开发DApp最少要支持Scatter的支持。

先来个主角Scatter介绍

Scatter 是一个去中心化的签名、身份、私人数据与身份验证解决方案。它在用户的计算机本地运行,采用非对称加密技术,令用户可以在不访问集中式服务器的情况下通过网站进行身份验证。Scatter 主要包含两个部分:钱包与 RIDL (Reputation & Identity Layer) 系统。

Scatter 钱包目前支持 EOS 和 ETH 钱包,未来会支持更多钱包。Scatter 已推出 Chrome 浏览器插件版本和桌面 Beta 版本,之后会推出移动端版本,其中浏览器插件版与以太坊轻钱包 MetaMask 类似。Scatter 钱包作为 EOS 应用程序与用户信息之间的桥梁,能让用户安全地向应用程序签名和提供私人数据,并保证在与EOS 区块链通信的 Web 应用程序进行交互时不会暴露密钥和其他不必要的信息。Scatter 不需要用户提交私钥,只需对交易签名,它是本地的应用,不会给用户发送需要解密或加密私钥的请求。而用户如果使用直接手动将私钥输入到应用程序的网页表单中,会存在资产被盗取的严重风险。

Scatter 的 RIDL (Reputation & Identity Layer) 系统包含了声望与身份系统。用户可以创建多个身份,每个身份都包含用户身份名称、EOS 账户/密钥对、姓名、电话和地址等个人信息。用户只需设置一次身份, Dapp 就可以经过用户授权后从 Scatter 接入用户身份信息。因此用户不必在多个 Dapp 重复填写个人信息,并避免个人信息泄漏。而在 Scatter 声望系统当中,用户和 Dapp 可以互相对彼此的声望进行评分。这一系统允许应用程序评估用户做出某种行为的可能性,比如偿还贷款。反之,它也允许用户衡量应用程序的质量,例如安全性与可用性。

Scatter 项目代码

现在Scatter 分为ScatterWebExtension(浏览器扩展)和ScatterDesktop(桌面客户端)两个版本。

编写一个支持Scatter的DApp例子

//TODO

ScatterDesktop使用步骤,并与上面例子交互

//TODO

中秋快乐,稍后继续完善本文。节后会紧跟几篇,详细针对Scatter接口方面的讲解。

EOSIO cleos命令汇总

version返回版本信息

返回EOS客户端版本信息

$cleos version client
Build version: cc9decff

create在区块链上和区域外创建数据

create key 创建密钥

命令格式:$ cleos create key
为了创建一个帐户,你需要两个新的密钥:所有者和激活密钥。你可以要求cleos为你创建一些钥匙:
这将是你的Owner Key,

$ cleos create key --to-console
Private key: 5HtimtY36YN8mB5MRKh2FDkdtUg98dZ5HrnC9hhCkf5KsZvXR11
Public key: EOS86qf6z2CuNfYDADMMysy2Gfs6p3GVK5k71BbGovmtmkBwvMxPq

再次执行,生成active key

$ cleos create key --to-console
Private key: 5K4SVxGkSrUWJVSsxtyJx7nqwVoNwgEZ77KxwVXaB2yzCf2ri3q
Public key: EOS5aC4xP3rf1sJVfNudJaa4CikUpmAYqXuiCxfL8nQT3tFDys9X1

注意:cleos不会把生成的私钥自动导入钱包,需手动导入cleos wallet import

create account 创建账号

命令格式:$ cleos create account ${control_account} ${account_name} ${owner_public_key} ${active_public_key}

Usage: ./cleos create account [OPTIONS] creator name OwnerKey ActiveKey

Positionals:
  creator TEXT                创建新帐户的帐户的名称
  name TEXT                   新帐户的名称
  OwnerKey TEXT               新帐户的所有者公钥
  ActiveKey TEXT              新帐户的激活公钥

Options:
  -x,--expiration             在交易到期之前以秒为单位设置时间,默认值为30s。
  -f,--force-unique           强制使交易独一无二,这将消耗额外的带宽,并消除对多次发布同一交易的任何保护。
  -s,--skip-sign              指定未锁定钱包密钥是否用于签署交易。即跳过签署直接交易。
  -d,--dont-broadcast         不要向网络广播交易(只需打印到stdout)。
  -p,--permission TEXT ...    授权的帐户和权限级别,如“帐户@权限”(默认值'creator@active')

待续

怎么给超级节点发工资:EOS的奖励分配规则

最近几篇文章,持续在聊EOS的资源分配模型。今天节后上班第一天,我们来聊个五块钱的天,看看EOS节点的收入问题:收益有多少,是怎么计算出的。

当下一次有人问你,EOS的通胀比率是多少,节点的奖励比例是多少,怎么分配的时候,也许这篇文章可以帮你回答这些问题。

主要用到的网站:

超级节点/备用节点/BP是什么?

在许多文章里面你会看到BP这一缩写。这是Block Producer的简称,即出块节点。

实际上,超级节点,这是中文里面才会有的称呼,似乎不加上超级,就显得不够霸气似的。英文语境里面,只是称呼EOS的节点为BP(Block Producer)。

节点分为两类:出块节点,跟备用节点(Block Producer Candidate)。在EOS主网之中,现在是设定为前21个节点为出块节点,其他的节点为备用节点。

备用节点也有另外的名称,叫做候选节点,两个名字都是说的同一回事。

你如果愿意,也可以调用EOS的命令,将自己启动的节点注册为节点,只是,未必有收益罢了。

节点收益知多少?

通过https://eos.host/mainnet这一网络,可以非常直观的查看各个节点的收益情况。

上图列出了前30个节点的得票率占比,橙色为出块节点,灰色为备用节点。

21个出块节点的收益


通过第二张图,可以看到,有一栏是列出来了节点的预估收益。

我们再仔细看一下。排名第一的佳能节点(恭喜佳能!),总计出块34895,预估得到收益为: 1,248.86 EOS

备用节点的收益


除了出块节点之外,也有部分备用节点是有收益的。从图中可以看出来,排名59的备选节点hexlantttttt,预计也能够得到100多的EOS作为回报。

你可能会好奇:出块节点的收益跟备用节点的收益是怎么算的呢?我们从EOS的增发开始说起。

算算节点的收益分配

分配的流程
每次有节点发起指令要领取奖励的时候,系统会计算:

  • 新增发的EOS总数有多少;
  • 按照比例,将新增发的EOS分配到不同的奖励池之中(下文会详述);
  • 按照节点的实际情况,计算节点应该得到的收益,并分配这部分收益给节点;
  • 对于备用节点来说,如果领取的奖励不足100个EOS,则无法领取奖励。
    简单概括就是,先计算各部分奖励池应该分配多少EOS,即新注入多少EOS;然后,根据规则,分配这部分新增的奖励,分配给对应的人节点。

EOS通胀率为5%

EOS是温和通胀设计的系统,每年增发的EOS比率为5%左右,按照总供应量10亿来计算,就是五千万EOS。
而节点得到的奖励,只是通胀的一小部分,只是总EOS数量的1%。

新增EOS的用途

实际上,EOS的增发,是持续进行的,而并非是每年一次性新增加EOS。每次EOS的节点发起领取奖励的命令,就会计算新增EOS的量。

通胀的EOS,有两个用途:

  • 通胀EOS的20%, 用于给节点的奖励,即,如果新增了五千万EOS,那么会有1千万EOS分配给节点作为奖励,包括给出块节点和备用节点;
  • 通胀EOS的80%, 用于EOS基金池,这部分会在未来用于Worker Proposal的奖励发放。所谓的Worker Proposal,是指的社区福利应用或者对EOS系统有所帮助的项目。

Worker Proposal这部分的奖励,现在已经开始累积,但是没有发放。

后续会部署新的智能合约到系统之中,经过持票人投票选出来认为对社区有益的DAPP,来获得这部分奖金。

可以看得出来,EOS设计之中对于生态的重视,Worker Proposal(可以称为:工作提案?)这部分每年足足有四千万左右的EOS奖励。(此处进行了简化,实际上随着EOS通胀,奖励的EOS数量会越来越多,比率为总流通量的4%)

如果你觉得自己的创意够牛逼,对于推动社区进步有贡献,那后续,光凭藉Worker Proposal的这部分奖励,应该就足够你赚到钱的了。

出块节点和备用节点的收益

具体的节点奖励的这1%,分为两部分:出块奖励(0.25%)和得票奖励(0.75%)。

出块奖励只是分配给出块的前21个节点,而得票奖励呢,则是用作所有节点(包括出块节点和备用节点)的奖励。

  • 出块奖励占据EOS总量的0.25%,这部分前21个节点平分。
    假设总量是10亿,那么,出块奖励部分,则是两百五十万 EOS,这部分21个节点平分。
  • 得票奖励, 占0.75%,这部分由所有节点按照投票权重占比来分配的。

例如,在某个时刻,如果未分配的得票奖励部分是一万2千个EOS,那么,假设 EOS Cannon节点的投票权重比例为10%,则佳能可以分得10%的奖励,即两千五百个EOS。

另外,佳能作为出块节点,还可以因为出块得到奖励。
假设未分配的出块奖励为两千一百个EOS,那么,佳能得到的奖励就是一百个,因为出块奖励是21个节点平分的。

总结

  • 如果某个节点是前21个节点之一,那么,其奖励分为:出块奖励部分 + 得票奖励部分;
  • 如果某个节点是备用节点,那么,它可能得到的收益属于得票奖励之中的一部分,比如总共投票权重为100,该节点所得到的投票权重为5,则可以分到得票奖励的5%。
  • 如果某个备用节点的得票奖励不足100个EOS,则无法得到奖励。

转载自:https://www.jianshu.com/p/8fb3531d055c

EOS每年增发5%,1/5作为节点奖励,剩下4/5居然都给了它?

一、EOS通胀及奖励怎么分?

众所周知,EOS采取每年增发5%代币的通胀模式。这是因为EOS采用了DPOS共识机制,而且没有任何交易手续费(明面上的),所以它通过增发代币的方式来鼓励节点提供计算资源和记账。

但实际上,这些增发的EOS并不完全用于节点奖励,而是分为两部分,其中节点奖励占五分之一,即1%的EOS增发量;剩下的归WPS提案基金(WPF),约4%。

其中节点(包括超级节点和备用节点)奖励的四分之一,即0.25%的EOS增发量为超级节点的出块奖励,剩下的0.75%为所有节点的得票率奖励。备用节点则无出块奖励,只有得票率奖励且要求在100个EOS以上,否则便不算备用节点,无法领取奖励。

而归提案基金(WPF)所有的4%的增发奖励则服务于WPS(工作者提案系统),它就是为了奖励给对社区有益的工作提案,旨在成为社区促进创新的资金来源,以帮助发展生态系统。

二、WPS新提案流程

通过上面的介绍,我们大致了解了WPS是什么。那么在WPS中,我们又该如何将提案提交公众批准呢?(内心OS:其实我就是冲着瓜分4%的增发奖励去的)

具体流程是这样的:EOS持有者发起提案,上链,经由紧急事务委员会进行紧急事务标准评估,满足标准就进行社区投票。如果投票不通过,根据反馈意见重新修改提交,如果投票通过,则获得第一阶段的基金分配

需要提醒的是,这个流程中提到的紧急事务委员会,是属于第一阶段公投时候所产生的,所处理的事务为紧急类别的事务,目前紧急类别的事务包括:Github存储库管理、安全测试、Bug赏金计划以及WPS监督委员会。

三、WPS备受争议

从WPS的设计上看,它将激励社区开发人去提供有效和可拓展的改进所需的补丁和升级,使得EOS.IO能够满足社区不断变化的需求。它无疑将填补目前EOS社区治理的部分空白,对于EOS生态发展起着一定促进作用。

虽然WPS有着诸多优点,但我们注意到这样一个问题,即4%作为提案基金是不是太高了。EOS增发的4%,这可是一笔数额不菲的资金,WPS允许将这部分资金用于由社区批准的项目,如果使用得当固然是幸事一件;但如果没用好,对EOS系统就可能会是一场打击。因此,BM也于前几周在电报群中表达了对选民投票积极性以及对WPS正常运转的忧虑,认为应该取消。

虽然BM这一观点得到了一部分社区成员的认同,但我个人认为:WPS的存在是值得肯定和支持的,但4%这个比例有点高,可以改为一年0.5-1.5%的比例进行试验,然后在试验中进行调整优化。

另外,核心WPS工作组也于上周发布了声明,表示当前核心工作组正在努力构建一套工具和一套拟议的规则和指南,以实现WPS的设计目标。同时,他们将会在9月至10月,执行第一次公投。第一次公投将会决定是否同意将100万EOS通证从eosio.saving帐户转移到新帐户eosio.wps,用做第一阶段的基金,用于紧急事务。(更多内容可查看:https://bihu.com/article/1163451

而在第一阶段之后,将会逐渐替换掉紧急基金会,而且如下图所示,会有监管、社区、基础设施等更多其他类别的提案产生。

所以,现在对WPS盖棺定论还为时尚早,不如让WPS“再飞一会”,待第一次公投后再看它,说不定它会成长为EOS生态中的另一个奇迹。
转载自:https://www.jianshu.com/p/4ad8e49910a9

eosjs简明使用手册(最新版)

eosjs简明使用手册(最新版)

作者:古千峰 2018-7-15

以下教程用于EOS正式版,已在DEV开发链和EOS1.0.5-1.0.7版本的主链上测试通过。

官方文档因为版本的原因,内容多有错误,仅供参考。

eosjs的API与http-RPC调用一致,如rpc使用get-block,则在eosjs中使用getBlock()方法。即去横岗,首字符大写

eosjs几个容易出错的地方

  • asset类型,表达方式为字符串,如:100.0000 EOS,千万注意小数点后四位,少一位都不行
  • 与链连接时需要指定chainId,可以通过cleos get info获得

1- 安装eosjs

eosjs用于对交易签名、交易等操作。
eosjs-api用于读取链上数据,只读,如果只需要读取链上数据的话,只需要使用eosjs-api

在nodejs中安装:

npm install eosjs
npm install eosjs-api

注意nodejs需要最新版,如安装过程发生错误,请用node -vnpm -v查看版本。

2- 建立eosjs与链的连接

Eos = require('eosjs')

// Optional configuration..
config = {
  keyProvider: ['PrivateKeys...'], // 配置私钥字符串
  httpEndpoint: 'http://178.62.196.196:8888', //DEV开发链url与端口
  chainId: "0b08e71a2f8caaccc2dc13244b788f5eba29462ecd5d5dea1ad8cbe9581e885a", // 通过cleos get info可以获取chainId
  mockTransactions: () => null, // 如果要广播,需要设为null
  transactionHeaders: (expireInSeconds, callback) => {
    callback(null/*error*/, headers) //手动设置交易记录头,该方法中的callback回调函数每次交易都会被调用
  },
  expireInSeconds: 60,
  broadcast: true,
  debug: false,
  sign: true,
  authorization: null // 该参数用于在多签名情况下,识别签名帐号与权限,格式如:account@permission
}

eos = Eos(config)

3- 建立eosjs-api与链的连接

如果加载了eosjs后,默认加载eosjs-api,无需单独链接eosjs-api与链

EosApi = require('eosjs-api')

// everything is optional
options = {
  httpEndpoint: 'http://178.62.196.196:8888',
  verbose: false, // API logging
  logger: { // Default logging functions
    //log: config.verbose ? console.log : '',
    error: console.error
  },
  fetchConfiguration: {}
}

eos = EosApi(options)

4- 获取帮助

不添加如何参数,可以获取该方法的使用说明,如:

eos.getBlock()

5- 获取链上最新出块信息

eos.getInfo({}).then(result => { 
    console.log(result) 
})

返回:

{ server_version: 'b195012b',
  chain_id: '0b08e71a2f8caaccc2dc13244b788f5eba29462ecd5d5dea1ad8cbe9581e885a',
  head_block_num: 209307,
  last_irreversible_block_num: 209267,
  last_irreversible_block_id: '00033173a9ccd4bdd60a92d257e9354023b0457b134797be472a236cd908bc31',
  head_block_id: '0003319ba8ddc60d80c3cd0c7a70695cfd951f51ace9a798c913384cfbae659c',
  head_block_time: '2018-07-15T01:51:07.500',
  head_block_producer: 'eoshackathon',
  virtual_block_cpu_limit: 100000000,
  virtual_block_net_limit: 1048576000,
  block_cpu_limit: 99900,
  block_net_limit: 1048576 
}

如果需要拿到某一个数据值,比如:head_block_producer,则使用:

eos.getInfo({}).then(result => { 
    console.log(result.head_block_producer) //以对象属性方式获取head_block_producer
})

6- 获取指定区块信息

eos.getBlock(200000).then(result => { console.log(result) }) //获取第200000个区块

或者:

eos.getBlock({block_num_or_id: 200000}).then(result => { console.log(result) }) //获取第200000个区块

或者:

eos.getBlock('00030d4011a6744857533a6e6d907037a94c27a2dc006b4d28125f76bed2b355').then(result => { console.log(result) }) //根据id获取区块

或者:

eos.getBlock({block_num_or_id: '00030d4011a6744857533a6e6d907037a94c27a2dc006b4d28125f76bed2b355'}).then(result => { console.log(result) }) //根据id获取区块

或者将返回值传到回调函数callback中处理:

callback = (err, res) => { err ? console.error(err) : console.log(res) }
eos.getBlock(200000, callback)

7- 获取账户余额

eos.getCurrencyBalance({ code: "eosio.token", account: "eosio", symbol: "DEV" }).then(result => console.log(result))

以上命令相当于

cleos get currency balance eosio.token eosio DEV

8- 获取某代币的信息

eos.getCurrencyStats({code: "eosio.token", symbol: "DEV"}, callback) //用上面出现的callback,下同

9- 获取账户信息

eos.getAccount({account_name: "eoshackathon"}, callback) //获取eoshackathon账户的信息

相当于:

cleos get account eoshackathon

返回:

{ account_name: 'eoshackathon',
  head_block_num: 219997,
  head_block_time: '2018-07-15T03:20:12.500',
  privileged: false,
  last_code_update: '1970-01-01T00:00:00.000',
  created: '2018-07-13T20:54:28.000',
  ram_quota: 8148,
  net_weight: 500000,
  cpu_weight: 500000,
  net_limit: { used: 145, available: 120795486, max: 120795631 },
  cpu_limit: { used: 1511, available: 11518458, max: 11519969 },
  ram_usage: 3414,
  permissions:
   [ { perm_name: 'active', parent: 'owner', required_auth: [Object] },
     { perm_name: 'owner', parent: '', required_auth: [Object] } ],
  total_resources:
   { owner: 'eoshackathon',
     net_weight: '50.0000 DEV',
     cpu_weight: '50.0000 DEV',
     ram_bytes: 8148 },
  self_delegated_bandwidth: null,
  refund_request: null,
  voter_info: null 
}

10- 获取智能合约代码

eos.getCode({ account_name: "eosio"}, callback)

获取eosio账户的所有合约代码

11- 获取智能合约ABI

eos.getAbi({ account_name: "eosio"}, callback)

12- 获取Table行数据

不成熟

13- 获取账户的Actions列表

eos.getActions({account_name: "eoshackathon", pos: 0, offset: 15}, callback) //pos和offset是指:从第pos条记录开始获取offset条Actions

14- 获取公钥对应的账户

eos.getKeyAccounts({ public_key: 公钥字符串}, callback)

如果查找到帐号,则返回[],如果该公钥没有对应帐号,则报错。
相当于:

cleos get accounts 公钥

15- 获取主账号控制的其他帐号

eos.getControlledAccounts({ controlling_account: "eoshackathon"}, callback)

16- 获取transaction交易细节

该指令有bug,慎用!

eos.getTransaction({id: "xxxx"}, callback)

17- 转账交易

首先,在链接配置config中,keyProvider: [发送方私钥]
其次,可以设置options参数如下:

options = {
    authorization: '发送方帐号@active',
    broadcast: true,
    sign: true
}
方式1:
eos.transfer('发送方帐号', '接收方帐号', '0.3000 DEV','memo')

如果需要对返回值处理:

eos.transfer('发送方帐号', '接收方帐号', '0.3000 DEV','memo', callback)

如果有options参数,则:

eos.transfer('发送方帐号', '接收方帐号', '0.3000 DEV','memo', options, callback)
方式2:

使用对象:

eos.transfer({ from: '发送方帐号', to: '接收方帐号', quantity: '0.1000 DEV', memo: '备注', callback })

如果不想广播交易,可以使用以下简便指令:

eos.transfer('发送方帐号', '接收方帐号', '0.3000 DEV','memo', false) //在最后加上false,不广播
方式3:

使用eos.transaction,构造对象执行

eos.transaction(
    {
        // ...headers,
        actions: [
            {
                account: 'eosio.token',
                name: 'transfer',
                authorization: [{
                    actor: '发送方帐号',
                    permission: 'active'
                }],
                data: {
                    from: '发送方帐号',
                    to: '接收方帐号',
                    quantity: '0.3000 DEV',
                    memo: '备注'
                }
            }
        ]
    }
    // options -- example: {broadcast: false}
)

以上命令与以下cleos相同:

cleos push action eosio.token transfer '[ "发送方帐号", "接收方帐号",  "0.3000 DEV", "备注" ]' -p 发送方帐号

18- 新建帐号

creatoraccount = "testtesttest" //主账号
newaccount = "testtest1113" //新账号
newaccount_pubkey = "EOS5LUYdLZAd3uHF5XGAeE61aTeSXWqvqxBSUq3uhqYH7kY15Drjf" //新账号的公钥

//构建transaction对象
eos.transaction(tr => {
    //新建账号
    tr.newaccount({
        creator: creatoraccount,
        name: newaccount,
        owner: newaccount_pubkey,
        active: newaccount_pubkey
    })

    //为新账号充值RAM
    tr.buyrambytes({
        payer: creatoraccount,
        receiver: newaccount,
        bytes: 8192
    })

    //为新账号抵押CPU和NET资源
    tr.delegatebw({
        from: creatoraccount,
        receiver: newaccount,
        stake_net_quantity: '1.0000 DEV',
        stake_cpu_quantity: '1.0000 DEV',
        transfer: 0
    })
})

19- 购买RAM

creatoraccount = "testtesttest" //主账号
newaccount = "testtest1113" //新账号

eos.transaction(tr => {
    tr.buyrambytes({
        payer: creatoraccount,
        receiver: newaccount,
        bytes: 8192 
    })

或者

eos.transaction(tr => {
    tr.buyram({
        payer: creatoraccount,
        receiver: newaccount,
        quant: 8 //以k为单位的内存,8k=8192字节
    })

20- 出售RAM

eos.transaction(tr => {
    tr.sellram({
        account: 'testtesttest',
        bytes: 1024 //出售1k内存
    })
})

21- 竞拍账号名

eos.transaction(tr => {
    tr.bidname ({
        bidder: "testtesttest",
        newname: "竞拍的名字",
        bid: 价格
    })
})

22- 抵押CPU和NET

eos.transaction(tr => {
    tr.delegatebw({
        from: "testtesttest",
        receiver: "testtesttest", //testtesttest账户为自己抵押
        stake_net_quantity: "1.0000 DEV",
        stake_cpu_quantity: "1.0000 DEV",
        transfer: 0
    })
})

23- 取消抵押(赎回)CPU和NET

eos.transaction(tr => {
    tr.undelegatebw({
        from: "testtesttest",
        receiver: "testtesttest",
        unstake_net_quantity: "0.1000 DEV", //赎回0.1个DEV
        unstake_cpu_quantity: "0.1000 DEV"
    })
})

24- 智能合约部署

如果是加载wasm合约,不用使用binaryen,如果加载wast合约,需要安装并使用binaryen,如下:

npm install binaryen@39.0.0

并用以下方式导入到js

binaryen = require('binaryen')
eos = Eos({keyProvider, binaryen})
部署合约

以官方自带的hello合约为例

fs = require('fs')
wasm = fs.readFileSync(`contracts/hello/hello.wasm`) //这个文件在客户端上,而不是在服务器上
abi = fs.readFileSync(`contracts/hello/hello.abi`)

eos.setcode('contract_name', 0, 0, wasm) // contract_name 为合约名
eos.setabi('contract_name', JSON.parse(abi)) // @returns {Promise}

25- 智能合约的执行

方法一:
eos.contract("contract_name").then(hello => {  //hello随便起的变量名
    hello.hi('axay', {                         //hi是方法名, 'axay'是该hello合约hi方法的参数
        authorization: ['testtesttest']        //testtesttest是建立该合约的用户
    }).then(result => {
        console.log(result);
    });
});
方法二:
eos.transaction(
    {
        actions: [
            {
                account: 'contract_name',  //合约名
                name: 'hi',               //方法名,该方法在官方的hello合约中有
                authorization: [{
                    actor: 'testtesttest',
                    permission: 'active'
                }],
                data: {
                    user: 'axay'
                }
            }
        ]
    }
    // options -- example: {broadcast: false}
).then(result => console.log(result))

26- 通过eosjs发行一个代币

发行代币有两种方式,一种是通过cleos参考这里,但前提是必须要安装好EOS系统。
另一种方式是通过eosjs,无需在本机安装EOS系统。

注意:

此操作需要以eosio.token账户进行操作,因此需将eosio.token帐号的私钥导入到keyProvider数组中。但如果出于安全原因,不允许将eosio.token账户私钥加到程序中的话,则可以由发币的用户先部署eosio.token合约,然后再做接下去的操作。

第一步:创建代币

eos.transaction(
    {
        // ...headers,
        actions: [
            {
                account: 'eosio.token',       //合约名
                name: 'create',               //调用创建代币的方法
                authorization: [{
                    actor: 'eosio.token',     //必须是eosio.token
                    permission: 'active'
                }],
                data: {
                    issuer: 'testtesttest',   //代币发行方
                    maximum_supply: '10000.0000 AAA', //代币总量与名称
                    can_freeze: 0,
                    can_recall: 0,
                    can_whitelist: 0
                }
            }
        ]
    }
    // options -- example: {broadcast: false}
).then(result => console.log(result))

第二步:发行代币

eos.transaction(
    {
        // ...headers,
        actions: [
            {
                account: 'eosio.token',      //合约名
                name: 'issue',               //调用发行代币的方法
                authorization: [{
                    actor: 'testtesttest',   //必须是代币的发行方
                    permission: 'active'
                }],
                data: {
                    to: 'testtesttest',      //收到代币的帐号
                    quantity: '1000.0000 AAA',
                    memo: "testtesttest issue 1000 AAA"
                }
            }
        ]
    }
    // options -- example: {broadcast: false}
).then(result => console.log(result))

也可以将以上两步合在一起操作,如:

eos.transaction(
    {
        // ...headers,
        actions: [
            {
                account: 'eosio.token',  //合约
                name: 'create',               //方法
                authorization: [{
                    actor: 'eosio.token',
                    permission: 'active'
                }],
                data: {
                    issuer: 'testtesttest',
                    maximum_supply: '10000000.0000 GAT',
                    can_freeze: 0,
                    can_recall: 0,
                    can_whitelist: 0
                }
            },
            {
                account: 'eosio.token',  //合约
                name: 'issue',               //方法
                authorization: [{
                    actor: 'testtesttest',
                    permission: 'active'
                }],
                data: {
                    to: 'testtest1111',
                    quantity: '1000.0000 GAT',
                    memo: "testtesttest issue 1000 GAT to testtest1111"
                }
            }
        ]
    }
    // options -- example: {broadcast: false}
).then(result => console.log(result))

https://github.com/eoshackathon/eos_dapp_development_cn/edit/master/docs/eosjs_manual.md