区块链中文技术社区 - 2018年9月
type: channel
link: https://www.bcskill.com/index.php/2018/09
description: 区块链,EOS,Ethereum,IPFS,Dapp技能学习
items: EOS 资源汇总
items: eos系统合约介绍 — 提案合约eosio.msig (下)
items: eos系统合约介绍 — 提案合约eosio.msig (上)
items: Error 3050003: eosio_assert_message assertion failure
items: DApp接入最新版本Scatter.js支持，以及ScatterDesktop的使用
items: EOSIO cleos命令汇总
items: 怎么给超级节点发工资：EOS的奖励分配规则
items: EOS每年增发5%，1/5作为节点奖励，剩下4/5居然都给了它？
items: eosjs简明使用手册（最新版）
items: EOS 智能合约最佳安全开发指南

EOS 资源汇总
type: item
date: 2018-09-28T10:48:52+08:00
description: EOS 资源汇总 A curated list of EOS Ecosystem by SuperONE. EOS 资源汇总。提交 PR 参考 contributing，提交 issue 点击 此处。 中文 | English EOS 主网 超级节点 https://eos.live，EOS 竞选节点列表，by SuperONE https://www.imeos.one/block-producer，EOS 竞选节点列表，by IMEOS https://eosnodes.privex.io，privex.io 出品 GitHub https://github.com/EOSIO，官方源码 https://github.com/EOS-Mainnet，主网源码 主网启动相关 https://github.com/eoscanada/eos-bios，Orchestrator for a decentralized EOS.IO blockchain network boot, by EOS Canad Ghostbusters-Testnet，EOS Core-an EOS mainnet launch solution, by HKEOS and EOSRio https://github.com/winlin/eostoolkit，EOS 工具，EOSBixin 出品 https://github.com/EOSArgentina/firestarter，验证工具 by EOSArgentina https://github.com/eosnewyork/eospy，验证工具 by EOS NewYork https://scholar.eosnation.io，EOSIO Scholar Testnet https://bp.eosgo.io，EOS Block Producer Candidates 展示，EOS Go 出品 https://imeos.one/block-producer，EOS Block Producer Candidates 展示，IMEOS 出品 http://dev.cryptolions.io，EOS Jungle Testnet http://superhero3monitor.eosgreen.io，EOS Superhero Testnet https://github.com/eostea/EOS-Boot-Steps-dawn4，EOSIO - 主网启动演练 https://github.com/eosauthority/genesis，EOS Snapshot Generator eos-bp-nodes-security-checklist，EOS 超级节点安全执行指南，慢雾团队出品，致敬 eos-bp-nodes-security-checklist/audit.md，超级节点安全审计方案，慢雾团队出品，致敬 https://github.com/consenlabs/eos-bp-profile，EOS Block Producer Profile，imToken 收集 https://github.com/onechainone/eos-bp-profile，EOS Block Producer Profile，OneChain 收集 主网启动状态 https://eosnation.io/eos-launch-tracker，EOS Nation 出品 https://eoscountdown.com，EOS 倒计时工具 https://status.producer.vote，可以查看 EOS 主网启动流程图 映射查询 https://www.eoslaomao.com/eos/verify，EOSLaoMao 出品 https://eoscountdown.com，同时提供映射检查功能 区块浏览器 http://eostracker.io，较早开源的 EOS 区块链浏览器 GitHub 账户信息 区块信息 交易信息 Action 信息 超级节点 https://explorer.eoseco.com，EOS 生态区出品 账户信息 区块信息 交易信息 公钥信息 投票 发送交易 映射查询 RAM(内存) 价格 网络计算成本 计算资源成本 RAM(内存) 占用率 https://eosblock.co，EOSpace 出品 http://scaneos.io，ScanEOS 是全球首个专注于 EOS 生态的专业区块链浏览器和数据分析平台 账户信息 区块信息 交易信息 Action 信息 Token 信息 账号竞拍 投票进度 超级节点 http://eosflare.i…

eos系统合约介绍 — 提案合约eosio.msig (下)
type: item
date: 2018-09-25T17:37:05+08:00
description: 简介 本篇将为大家介绍eosio.msig的源码实现，合约代码库详见：eosio.msig。eosio.msig主要有propose、approve、unapprove、cancel、exec、invalidate这几种方法，下面会详细逐一介绍每种方法的功能和实现细节。 主要合约方法 eosio.msig合约，在eosio.msig.hpp头文件中，主要定义了以下六个合约方法： propose：提出提案 approve：通过提案 unapprove：不通过提案 cancel：取消提案 exec：执行提案 invalidate：撤回对之前所有该账户通过、但未被最终执行的提案的通过授权 eosio.msig合约头文件 namespace eosio { class multisig : public contract { public: multisig( account_name self ):contract(self){} void propose(); void approve( account_name proposer, name proposal_name, permission_level level ); void unapprove( account_name proposer, name proposal_name, permission_level level ); void cancel( account_name proposer, name proposal_name, account_name canceler ); void exec( account_name proposer, name proposal_name, account_name executer ); void invalidate( account_name account ); propose方法 propose方法主要功能是提出提案，对应上篇提到的 cleos multisig propose 命令，传参如下： proposer：提案账户 proposal_name：提案名 requested：提案通过所需权限 trx：提案具体执行的交易内容 为了节省资源开销，propose方法并不会根据 cleos multisig propose 传入的参数一一做解析，而是直接解析input data /* propose function manually parses input data (instead of taking parsed arguments from dispatcher) because parsing data in the dispatcher uses too much CPU in case if proposed transaction is big If we use dispatcher the function signature should be: void multisig::propose( account_name proposer, name proposal_name, vector<permission_level> requested, transaction trx) */ void multisig::propose() { constexpr size_t max_stack_buffer_size = 512; size_t size = action_data_size(); char* buffer = (char*)( max_stack_buffer_size < size ? malloc(size) : alloca(size) ); read_action_data( buffer, size ); 之后，会做一系列前置检验工作：proposer提案账户授权是否正确、交易是否超时、propose_name是否存在、提案通过所需权限是否正确等 require_auth( proposer ); eosio_assert( trx_header.expiration >= eosio::time_point_sec(current_time_point()), "transaction expired" ); //eosio_assert( trx_header.actions.size() > 0, "transaction must have at least one action" ); proposals proptable( _self, proposer ); eosio_assert( proptable.find( proposal_name…

eos系统合约介绍 — 提案合约eosio.msig (上)
type: item
date: 2018-09-25T14:00:00+08:00
description: 简介 本篇将为大家介绍eos另一个系统合约eos.msig的主要功能和源码实现细节。eos.msig是eos的提案合约，同样也是cleos multisig命令调用的系统合约，可用于提案、通过/不通提案、执行多重签名交易等功能。由于涉及内容较多，介绍将分为上下两篇，上篇将围绕eos账户权限、cleos multisig命令的使用这几个方面进行介绍，下篇则会为大家介绍eosio.msig的源码实现 Eos账户权限 回顾一下之前的文章，一个账户最基本的权限owner和active是由公私钥对控制的，然而，eos丰富的权限控制方式，还允许我们将一个账户的权限，下放给其他的账户。比如下面的经典例子： 账户popo的权限情况 permissio account weight threshold owner 2 @user1 1 @user2 1 active 1 @user1 1 @user2 1 我们将一步一步，通过命令行操作的方式来为大家介绍eos权限的应用。 1.我们分别创建三个账户popo11111111、zoin11111111、zoin22222222，每个账户使用不同的公私钥对。 分别创建6对公私钥，分别用于三个账号的owner和active权限 cleos create key --to-console | 账号 | 权限|公钥 |私钥 | | ------------ | ------------ | ------------ | | popo11111111 | owner | EOS81WjiHefR6c5VKYjvdSat68RDJ3qGPgCckJqG3pXbDbVjZR5QB | 5JAxr3bM6DwwtcKJ7aVydpoaSA2oyiZ94PjqTpW6uXDZ41VuK22| | popo11111111 | active | EOS7ob62mdBfiRt1a8tQrQGbhnU1gEAvWyQDFHs99HzYEh8wxeQ9T |5KRCeqsHAx1UNTtz7BH5N4SSMe75XMCj3j93TqQRDrYCwbjccoP | | zoin11111111 | owner | EOS5N3qMPXjtwZpMyPeiYXSmBQbr7Lt5Ro2W8pLqyAzFYQPknoUvZ |5KWYcdZcJ1E8mWtg1Qoq5s1fYXJxMQkLupozfZEUEiu6vn6QNzx | | zoin11111111 | active | EOS6BAfK8mZZjMaa74zxkT3evWEtWo4AnRQYmnpGWkNJYKVjcrpao | 5Jwy6VbCwpkmczjYgMNVtr9Nd77aenZcPE8DtvPwtYqztbgMzu4| | zoin22222222 | owner | EOS6hBy5yioHpcH4SxSe91aH8vCGAhhEifKtp1jZEy7PS2rhJFSER |5Hz3u44Avpf4NCVDQdwZGSVXpbpEdRFczo2Wm9FC14pqcx8mUwM | | zoin22222222 | active | EOS5TeY2C9bdewrbS58SZnrp5azF5Cq7AXraNJihxaW4hbGeWSaeE |5JFoGdAc6zPG9KdHCHPHFL5XbpEnFmDq61y53Bw3Hm3VuFy7Stk | 2.下面开始创建三个账号 cleos system newaccount 已有账号 将要创建的账号 ownerkey activekey --stake-net '0.1 EOS' --stake-cpu '0.1 EOS' --buy-ram-kbytes 4000 利用我们上面文章《以传统的WEB开发方式，来举例理解Dapp开发》中已经在麒麟测试网创建的账号cryptokylinq，并在麒麟测试网来创建其他账号。 suroudeMacBook-Pro:~ surou$ cleos -u http://kylin.fn.eosbixin.com system newaccount cryptokylinq popo11111111 EOS81WjiHefR6c5VKYjvdSat68RDJ3qGPgCckJqG3pXbDbVjZR5QB EOS7ob62mdBfiRt1a8tQrQGbhnU1gEAvWyQDFHs99HzYEh8wxeQ9T --stake-net '0.1 EOS' --stake-cpu '0.1 EOS' --buy-ram-kbytes 4000 executed transaction: ada14edaa2dc356f02f8f19515f3227669887a5a840601…

Error 3050003: eosio_assert_message assertion failure
type: item
date: 2018-09-25T12:25:50+08:00
description: 创建账号时Error 3050003 suroudeMacBook-Pro:~ surou$ cleos -u http://kylin.fn.eosbixin.com system newaccount cryptokylinq popo EOS81WjiHefR6c5VKYjvdSat68RDJ3qGPgCckJqG3pXbDbVjZR5QB EOS7ob62mdBfiRt1a8tQrQGbhnU1gEAvWyQDFHs99HzYEh8wxeQ9T --stake-net '0.1 EOS' --stake-cpu '0.1 EOS' --buy-ram-kbytes 4000 Error 3050003: eosio_assert_message assertion failure 如果nodeos启动时开始错误显示 nodeos --verbose-http-errors Error 3050003: eosio_assert_message assertion failure Error Details: assertion failure with message: no active bid for name 根据Details就能看出，由于创建的账户名不属于常规的账户名“1-5，a-z”12位。是需要事先投标购买成功的。

DApp接入最新版本Scatter.js支持，以及ScatterDesktop的使用
type: item
date: 2018-09-23T22:35:00+08:00
description: 我们知道目前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（桌面客户端）两个版本。 ScatterWebExtension https://github.com/GetScatter/ScatterWebExtension ScatterDesktop https://github.com/GetScatter/ScatterDesktop 目前浏览器版本已经逐步废弃，主推桌面版本。 编写一个支持Scatter的DApp例子 //TODO ScatterDesktop使用步骤，并与上面例子交互 //TODO 中秋快乐，稍后继续完善本文。节后会紧跟几篇，详细针对Scatter接口方面的讲解。

EOSIO cleos命令汇总
type: item
date: 2018-09-21T20:31:26+08:00
description: 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的奖励分配规则
type: item
date: 2018-09-21T11:27:48+08:00
description: 最近几篇文章，持续在聊EOS的资源分配模型。今天节后上班第一天，我们来聊个五块钱的天，看看EOS节点的收入问题：收益有多少，是怎么计算出的。 当下一次有人问你，EOS的通胀比率是多少，节点的奖励比例是多少，怎么分配的时候，也许这篇文章可以帮你回答这些问题。 主要用到的网站： https://eos.host/mainnet， 可以直观的查看节点的投票和出块情况 https://votetracker.eosmedi.com/ 可以看到每个节点的投票者的信息 -https://eosflare.io 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%…

EOS每年增发5%，1/5作为节点奖励，剩下4/5居然都给了它？
type: item
date: 2018-09-21T11:13:03+08:00
description: 一、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简明使用手册（最新版）
type: item
date: 2018-09-20T20:37:00+08:00
description: 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 -v和npm -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_bl…

EOS 智能合约最佳安全开发指南
type: item
date: 2018-09-20T18:09:16+08:00
description: EOS 智能合约最佳安全开发指南 这篇文档旨在为 EOS 智能合约开发人员提供一些智能合约的安全准则及已知漏洞分析。我们邀请社区对该文档提出修改或完善建议，欢迎各种合并请求(Pull Request)。若有相关的文章或博客的发表，也请将其加入到参考文献中。 目录 安全准则 已知漏洞 数值溢出 漏洞示例 防御方法 真实案例 权限校验 漏洞示例 防御方法 真实案例 apply 校验 漏洞示例 防御方法 真实案例 参考文献 致谢 安全准则 EOS 处于早期阶段并且有很强的实验性质。因此，随着新的 bug 和安全漏洞被发现，新的功能不断被开发出来，其面临的安全威胁也是不断变化的。这篇文章对于开发人员编写安全的智能合约来说只是个开始。 开发智能合约需要一个全新的工程思维，它不同于我们以往项目的开发。因为它犯错的代价是巨大的，很难像中心化类型的软件那样，打上补丁就可以弥补损失。就像直接给硬件编程或金融服务类软件开发，相比于 Web 开发和移动开发都有更大的挑战。因此，仅仅防范已知的漏洞是不够的，还需要学习新的开发理念： 对可能的错误有所准备。任何有意义的智能合约或多或少都存在错误，因此你的代码必须能够正确的处理出现的 bug 和漏洞。需始终保证以下规则： 当智能合约出现错误时，停止合约 管理账户的资金风险，如限制（转账）速率、最大（转账）额度 有效的途径来进行 bug 修复和功能提升 谨慎发布智能合约。 尽量在正式发布智能合约之前发现并修复可能的 bug。 对智能合约进行彻底的测试，并在任何新的攻击手法被发现后及时的测试（包括已经发布的合约） 从 alpha 版本在麒麟测试网(CryptoKylin-Testnet)上发布开始便邀请专业安全审计机构进行审计，并提供漏洞赏金计划(Bug Bounty) 阶段性发布，每个阶段都提供足够的测试 保持智能合约的简洁。复杂会增加出错的风险。 确保智能合约逻辑简洁 确保合约和函数模块化 使用已经被广泛使用的合约或工具（比如，不要自己写一个随机数生成器） 条件允许的话，清晰明了比性能更重要 只在你系统的去中心化部分使用区块链 保持更新。通过公开资源来确保获取到最新的安全进展。 在任何新的漏洞被发现时检查你的智能合约 尽可能快的将使用到的库或者工具更新到最新 使用最新的安全技术 清楚区块链的特性。尽管你先前所拥有的编程经验同样适用于智能合约开发，但这里仍然有些陷阱你需要留意： require_recipient(account_name name) 可触发通知，调用name合约中的同名函数，官方文档 已知漏洞 数值溢出 在进行算术运算时，未进行边界检查可能导致数值上下溢，引起智能合约用户资产受损。 漏洞示例 存在缺陷的代码：batchTransfer 批量转账 typedef struct acnts { account_name name0; account_name name1; account_name name2; account_name name3; } account_names; void transfer(symbol_name symbol, account_name from, account_names to, uint64_t balance) { require_auth(from); account fromaccount; require_recipient(from); require_recipient(to.name0); require_recipient(to.name1); require_recipient(to.name2); require_recipient(to.name3); eosio_assert(is_balance_within_range(balance), "invalid balance"); eosio_assert(balance > 0, "must transfer positive balance"); uint64_t amount = balance * 4; //乘法溢出 int itr = db_find_i64(_self, symbol, N(table), from); eosio_assert(itr >= 0, "Sub-- wrong name"); db_get_i64(itr, &fromaccount, (account)); eosio_assert(fromaccount.balance >= amount, "overdrawn balance"); sub_balance(symbol, from, amount); add_balance(symbol, to.name0, balance)…