从导致SMT被黑的transferProxy函数看EOS体系的安全解决方案

下面这段就是导致SMT被黑客攻击导致价值归零、以及各大交易所纷纷停止提币的核心代码

    /*
     * Proxy transfer SmartMesh token. When some users of the ethereum account has no ether,
     * he or she can authorize the agent for broadcast transactions, and agents may charge agency fees
     * @param _from
     * @param _to
     * @param _value
     * @param feeSmt
     * @param _v
     * @param _r
     * @param _s
     */
    function transferProxy(address _from, address _to, uint256 _value, uint256 _feeSmt,
        uint8 _v,bytes32 _r, bytes32 _s) public transferAllowed(_from) returns (bool){

        if(balances[_from] < _feeSmt + _value) revert();

        uint256 nonce = nonces[_from];
        bytes32 h = keccak256(_from,_to,_value,_feeSmt,nonce);
        if(_from != ecrecover(h,_v,_r,_s)) revert();

        if(balances[_to] + _value < balances[_to]
            || balances[msg.sender] + _feeSmt < balances[msg.sender]) revert();
        balances[_to] += _value;
        Transfer(_from, _to, _value);

        balances[msg.sender] += _feeSmt;
        Transfer(_from, msg.sender, _feeSmt);

        balances[_from] -= _value + _feeSmt;
        nonces[_from] = nonce + 1;
        return true;
    }

这是黑客利用漏洞完成SMT无限增发的合约调用
https://etherscan.io/tx/0x1abab4c8db9a30e703114528e31dee129a3a758f7f8abc3b6494aad3d304e43f

方法涉及的角色:
角色1 需要转SMT、但地址里面没有ETH的人 – 合约中的_from
角色2 帮助角色1来转SMT,并支付ETH的gas费用 – 合约中的msg.sender,也是调用这个合约的人
角色3 SMT接收方

方法的目的:
角色1想要转SMT给角色3,但自己又没有ETH来支付手续费,于是角色1找到有ETH的角色2说:我给你一些SMT当做手续费,你来通过调用transferProxy来把我的SMT转给角色3,因为你有ETH

方法的漏洞:
漏洞利用前几天导致BEC归零类似的uint256溢出,绕过了if的判断,所以解决这类问题还是需要使用SafeMath来做加减乘除。

EOS体系的解决方案:

1 关于转账手续费
虽然EOS主网还没有上,但根据EOS白皮书的说法,EOS体系转账是需要手续费的,但EOS允许收款人支付。这样角色1可以把中间人角色2排除,直接与角色3交易。

2 关于智能合约漏洞
当“势不可挡的应用程序”以不可预知的方式发挥作用时,使用EOS.IO软件的区块链允许区块生产者(超级节点)替换账户的代码,而不分叉整个区块链。这类似冻结账户的过程,这个代码的替换需要选出的15/21的区块生产者投票。

3 权限管理
proxyTransfer方法里的角色B获得角色授权进行资金操作的情况,在EOS中可以通过权限映射+多签名阈值来实现,虽然没有ETH上这么灵活,但从编程友好和安全的角度是有优势的。

以太坊的智能合约的灵活性是很高的,但也对智能合约开发者提出了很高的要求,而EOS有针对性对这些做了自己的结构设计。

Mac上安装EOS Dawn 3.0的一些坑

在Ubuntu上安装很顺利,Mac上还是碰到一些问题,记录一下。

Mac系统版本:macOS High Sierra 10.13.4

执行 eosio_build.sh 的错误

ERROR: Linking /usr/local/Cellar/python/3.6.5… Error: Permission denied @ dir_s_mkdir – /usr/local/Frameworks
需要执行以下命令
sudo mkdir /usr/local/Frameworks
sudo chown $(whoami):admin /usr/local/Frameworks

ERROR: Could not find a package configuration file provided by "LLVM" (requested version 4.0) with any of the following names
需要执行以下命令(检查一下你有没有这个目录,没有的话搜索一下)
export LLVM_DIR=/usr/local/Cellar/llvm\@4/4.0.1/lib/cmake
参考链接
https://github.com/EOSIO/eos/issues/43

ERROR: Failed to find Gettext libintl (missing: Intl_INCLUDE_DIR)
需要执行以下命令
brew unlink gettext && brew link –force gettext
参考链接
https://github.com/EOSIO/eos/issues/2028?ref=tokendaily

ERROR:找不到 libc.bc和libc++.bc的问题
解决方法:工具链依赖库要一个一个装上去,c++14的

编译智能合约错误

ERROR:'stdint.h' file not found when running the example of smart contract “Hello World”
需要执行以下命令
cd ~/eos/build
sudo make install
参考链接
https://github.com/EOSIO/eos/issues/1718

Mac环境下Boost和wasm安装目录:
set(BOOST_INSTALL_DIR /usr/local/include/boost)
set(WASM_INSTALL_DIR /usr/local/wasm)

【柚子开发讨论群】问题整理

本文记录【柚子开发讨论群】中探讨的一些问题和答案,不定期更新,供大家参考

开发环境:EOS Dawn 3.0

EOS架构设计

EOS可以支持多少并行链?

由于跨链通信,我们可以根据需要在不同链之间分配工作量。代币可以可靠并且安全的在不同链之间转移。由于相同(或不同)矿工并行运行1000条链,我们可以看到每秒数百万的交易。
EOS跨链实现目前没有太多资料,理论上跨链协议没有并行数量限制。目前规划,EOS并行链不会放在今年6月上线,而在大约年底左右实现。

EOS的共识机制插件在哪里,是如何实现的

可以查看 eosio.system

对于一个企业应用,有很多用户,但这些用户应都不能算EOS的账号吧,只是一个企业申请一个账号即可,企业用户的账号怎么分开呢

目前测试网络token费用这块还不能测试,不过以创建账号为例:
cleos create account eosio 1.a EOS7ZkKkWu8koY2qqyuv1Z7djZuaddjZuHhbBHkac5JWNUCsY21H4 EOS7ZkKkWu8koY2qqyuv1Z7djZuaddjZuHhbBHkac5JWNUCsY21H4
create account 后面的 eosio 就是为完成这个操作进行付费的账号,eosio可以是进行付费的企业账号

EOS测试环境

如何同步两个节点

nodeos –p2p-peer-address host:port
https://github.com/EOSIO/eos/wiki/Testnet-Single-Host-Multinode

在启动节点的时候,报错

WechatIMG287
解决方案是
./nodeos –resync

最新的只有单主机多节点的案例,多主机的教程在哪?

目前还没有,应该会更新的
Screen Shot 2018-04-20 at 09.19.25

单主机多节点配置按照官网执行完毕之后ctrl+c关闭了之后现在重启起节点的时候报错了是什么原因呢?

std::exception::what: could not gain write access to the shared memory file
WechatIMG370
应该是ctrl+C退出时,nodeos的进程没有kill掉,需要手动kill。

EOS智能合约

现阶段也只能用c+开发智能合约吗?

是的,第三方正在开发的语言是Rust, Python, and Solidity,不过EOS官方说这些第三方语音会对将来性能扩展有影响,所以还是建议用c++

WREN语言 哪里有介绍?

EOS最初期,BM说要支持WREN开发智能合约,不过后来放弃了这个方向。
目前推荐的智能合约开发语言是C++,第三方正在开发的语言是Rust, Python, and Solidity。C++还是性能首选。

试了下demo,cleos set contract debug debug.wast debug.abi这句会报错,感觉是WASM报错

WechatIMG152

编译cpp报错

fatal error: 'eoslib/eos.hpp' file not found
Screen Shot 2018-04-19 at 14.38.08
Ubuntu默认安装的环境配置问题,部分目录没有include,而且文件夹名不同版本有修改,比如eoslib在新版已改为eosiolib。目前的方法是等后续版本更新。
也可以在其它环境编译wasm,比如在Mac编译成webassembly后部署到服务器。

有人懂基于EOS发币流程吗?

Dawn 2.0: https://blog.csdn.net/zhongdahong/article/details/79676612
Dawn 3.0: https://github.com/EOSIO/eos/wiki/Tutorial-eosio-token-Contract

创建货币的"can_freeze":0, "can_recall":0, "can_whitelist":0这三个参数详细含义是什么,怎么改和使用?

freeze 是否可以冻结 recall 是否可以回收 whitelist 是否设置白名单
那可以冻结的设置完之后,冻结的量怎么去制定?官方的是通过设置账户或货币的frozen参数,没有那么细致的考虑
WechatIMG208

介绍一下 multi_index

https://garanto.org/eosio-eos-automatic-caching-of-multi_index-instances-and-a-convenient-way-to-get-the-appropriate-multi_index-instance-2199.html

https://eosio.github.io/eos/classeosio_1_1multi__index.html

EOS应用

eos可以做游戏嘛?可以放到手机上运行吗?

http://blog.eosdata.io/index.php/2017/09/20/eos-xi-tong-jia-gou-he-chuan-tong-hu-lian-wang-yin/
EOS会提供一个基于ipfs的文件存储,里面可以部署前端页面,前端页面在手机端渲染。页面可以与eos链上的智能合约交互。
https://eosio.github.io/eos/
基于api的RPC调用也可以直接与主链交互,实现去中心和中心结合的应用。

扫码加入柚子开发讨论群
canaan20180423

从Steem见证人投票看EOS超级节点投票的实现方式

最近EOS超级节点竞选正进行得轰轰烈烈,几乎成为检验币圈大佬的标准了,那么EOS投票到底是怎么投的,作为一个持有EOS的用户,你到时需要如何投给心仪的节点呢?

其实EOS代码第一个版本基于BM之前的项目steem来的,所以从steem的见证人投票机制,我们可以一窥EOS投票体系的基础逻辑和方法。

Steem如何投票

通过steemit网站的菜单,我们可以找到“投票给见证人”的入口:https://steemit.com/~witnesses

Screen Shot 2018-04-07 at 20.46.32

页面上可以看到前50位见证人的名单。每个人可以投票给30位见证人(witnesses)。50名以内见证人的投票可以直接点图上点赞标识。
Screen Shot 2018-04-07 at 20.47.11

如果你想投的见证人在50名外,可以通过输入账户名来进行投票,最下面一栏你可以把票数代理给别人帮你行使投票权利
Screen Shot 2018-04-07 at 20.47.29

所以可以看到,投票时再任意时间进行的,你也可以随时修改你的投票,其结果会反应在之后的出块节点的选择上

那么接下来我们来聊聊超级节点

超级节点的成本

按照 EOS 团队公布的硬件门槛,想要当上节点最少需要达到亚马逊 AWSEC 2 主机 x1.32x large 型,128 核处理器,2TB 内存,2x1920GB SSD,25Gb 带宽。一台服务器的成本,一年需要 75.9 万人民币。当然实际成本应该更高,因为需要考虑测试服务器、备用服务器、以及人力成本。

超级节点的收益

最新消息是EOS下调了超级节点奖励(通过增发EOS),目前是每年1%,也就是1000万EOS,假如21个节点平分,按照目前EOS价格50元计算,每个节点分到47万EOS,价值2350万元(如果EOS不跌也不涨的话)。由此可以看出,即使奖励下调到1%,但相比起来成本几乎不值一提。

要多少票才能成为超级节点

现有的EOS投票系统中,每180秒代币持有者中的投票会计算一次,前21名的候选人就会在这轮当选。根据其他类似项目的投票经验(比如Lisk),当选节点的获得投票率在20-40%之间。EOS到六月份全流通时代币总量是10亿个,也就是当选节点的得票数量在2-4亿之间,获得3亿以上投票应该可以比较稳健的当选。

先有鸡还是先有蛋

投票需要EOS账号和计算EOS代币数量,EOS主网需要超级节点出块,超级节点需要投票产生,所以这是一个先有鸡还是先有蛋的问题。
目前还没有找到相关资料介绍这一块,大概率EOS社区会在6月1日完成ERC20代币映射,然后上线一个投票工具让用户导入EOS私钥并进行投票,最后在6月底由选出的第一批超级节点开始出块。

EOS Dawn 3.0 安装指南

EOS 发布了 Dawn 3.0,这个版本是功能相对比较完整的,与前面两个版本相比Bug也少了很多,所以是值得一试的版本。

本文将介绍 EOS Dawn 3.0 安装的几个关键步骤。

硬件配置

从之前社区的讨论,EOS本地测试节点的硬件最低配置大概如下:
CPU:云服务器 2核CPU
内存:8G以上
硬盘:100G以上

系统要求

目前EOS官方支持的操作系统及版本如下,其它的系统可能会出各种问题

Amazon 2017.09 and higher
Centos 7
Fedora 25 and higher (Fedora 27 recommended)
Mint 18
Ubuntu 16.04 (Ubuntu 16.10 recommended)
MacOS Darwin 10.12 and higher (MacOS 10.13.x recommended)

安装方式

1 自动安装脚本

最为推荐的一种安装方式,基本上如果硬件配置和操作系统没问题,这种方式是比较安全的。

2 手动编译安装

如果第一种方式不能顺利安装,可以通过这种方式,需要手动安装依赖库的安装,下载代码,并进行编译
https://github.com/EOSIO/eos/wiki/Local-Environment#2-building-eosio

3 Docker安装

网络好的话,速度快,但需要对Docker比较熟悉,否则对chain进行配置会比较复杂。另外有时候国内下载docker官方镜像可能会比较慢。

安装流程(自动安装脚本的方式)

1 下载eos代码

git clone https://github.com/EOSIO/eos --recursive

2 执行自动安装脚本

cd eos
./eosio_build.sh

安装成功界面

3 启动单节点测试网络(Single Node Testnet)

cd build/programs/nodeos
./nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin

4 验证安装结果

你可以通过下面的命令查看当前正在运行的测试链信息

查看链信息

curl http://127.0.0.1:8888/v1/chain/get_info

查看版本

cd ~/eos/build/programs/cleos
./cleos -H 127.0.0.1 -p 8888 get info

按照过程中如果碰到阿里云无法连接Github的问题,可以参考下面这篇文章

https://steemit.com/github/@ericfish/github

EOS生态网站收集整理

EOS官方Github

https://github.com/EOSIO/eos
在这里你能看到BM大神最新的代码修改,以及EOS团队开发的生态周报项目,比如钱包之类的最新进展。

EOS官方文档

https://eosio.github.io/eos/
这是官方文档地址,包括如何配置开发节点,以及提供给智能合约开发者的接口方法。EOS开发者必读。

币乎的EOS板块

https://bihu.com/?category=hots&code=EOS
币乎的EOS板块有非常多EOS生态的文章,新入场的战友可以读读,最近关于超级节点的内容特别多。

数字货币钱包排行榜

http://tokenwallet.cc/
这个网站对市面上所有钱包做了打分和排名,包括最新出的EOS系钱包,比如E-Token,麦子钱包,蚂蚁钱包等。

EOS Go

https://eosgo.io/
独立EOS社区,第一时间报道EOS社区的各种消息,并每天组织群里各种重要消息。最近关于超级节点报名的消息都是由EOS Go整理的。

EOS Tracker

https://eostracker.io/
区块数据浏览器,目前基于测试网络,可以对EOS网络有一个直观的了解。

EOS Projects

https://eosprojects.org/
各种EOS生态项目的集中展示,随时了解各种EOS生态的新IDEA。

EOS Index

https://eosindex.io/
另外一个EOS生态项目列表,关注最新项目机会的必备网站。

EOS Drops

https://www.eosdrops.io/
EOS空投项目列表,比较有名的是Everpedia项目的空投,除此之外还有不少项目。

Dan的Blog

以前在Steemit: https://steemit.com/@dantheman
后来闹掰了,换成Medium了: https://medium.com/@bytemaster

《失控》中对EOS和ETH关系的预言

《失控》中的故事是这样的,哈佛大学有一个进化学者叫汤姆,这个汤姆做了一个很伟大的小实验,他用自己的电脑当了一回上帝,做了这么几件事:

1、在电脑里准备了一块专用空间,就好像画出了一个伊甸园。

2、汤姆他们写了一个80个字节的编码,就是一个可以自我复制的电脑程序,这就有点像上帝造人,所以就把这个80字节的编码给它起名叫亚当。然后把亚当放在了伊甸园里让它繁殖。

3、他们给伊甸园里还设定了一个叫收割者的程序,这个收割者吧会把这个空间里不能复制的或者疯狂复制的亚当全部都清除掉,换句话说,汤姆给这个世界引入了死亡的机制。

4、他们给这个亚当设定了一个微小的变化,就是这个亚当每一次自我复制的时候,都有10%的几率会产生一个非常微小的变异,但是变异的细节统统不管,这个就相当于赋予了亚当生物遗传变异的功能。

做完这几件事之后,Tom敲了一下回车,这个空间里的亚当就开始自我复制了起来。Tom等人就去休息了,等他们一觉醒来,发现这个空间里经历了一次史诗般的进化历程:

第一阶段:
80个字节的亚当疯狂的复制,一会就把整个空间给占满了;因为有突变的机制,进化就产生了,进化出了一个之后45字节的程序,然后这个45取代了亚当,成为了伊甸园的优势物种。查看这个45发现,它是一个寄生程序,靠吃掉80,也就是亚当来繁殖自己,随着亚当被消耗,45的数量也大幅下降。

第二阶段:
剩下的80进化成了79,变成79之后,就对45免疫了,所以原来的优势物种不行了,很快,又出现了一种51个字节的程序进化出来,以79为“食”,把“79”消灭到了几乎灭绝的程度。这个时候,又出现了一个神奇的事,就是在寄生程序45身上,又出现了一种“寄生虫”,它只有22个字节,它除了寄生在45身上复制自己的信息外,别的什么事都不做。最后22成为了“伊甸园”的主人。

Tom点开这个22发现它的内部非常简单,没有任何一个人类的电脑天才能写出这种天才代码。而这一切都是在Tom睡觉的时候发生的,这个例子说明了从下到上的系统有多强大。

ETH就是那个80,EOS就是那个45。

顺带提一句,这个例子也从一个角度说明了书名《失控》的意义,就是只有失控了才能产生多样性,进化体的天性就是喜欢钻常规的漏洞。

推荐几个讲区块链YouTube频道

几年前,学习区块链是很难的,因为资料少,而且都非常技术。现在有越来越多的资料和媒体出现,做一个价值投资者,整体看xx财经、x世界是没有太大作用的,都是短期消息,要理解本质的话,今天推荐几个youtuber会很有帮助:

Jackson Palmer

https://www.youtube.com/user/jacksonpalmerbc/videos
Jackson,程序员,以及著名的狗狗币创始人,关于他和狗狗币的故事非常有趣,可以自行谷歌。
他的播客新建不久,质量非常高,适合有一定技术背景的人看,属于中高阶水准,而且不配图,看的时候比较容易走神:)
印象很深是他讲去中心化交易所的那集,把目前所有方案统统撸了一遍,很透彻。
今年是狗年,祝愿狗狗币大涨。

Ivan on Tech

https://www.youtube.com/channel/UCrYmtJBtLdtm2ov84ulV-yg
Ivan也是一个程序员,他的俄罗斯口音英语很有意思。
EOS还没有i c o的时候,就看了一集他讲EOS,那时候就基本把EOS讲清楚了,然后就果断参与了。
他也属于技术流(这个世界目前看来还是程序员比较能解释清楚),但经常拿张纸涂涂画画,小白也比较容易理解。最近他的频道越来越有名气了,请到各种大咖,包括BM。

CryptoPortfolio

https://www.youtube.com/channel/UCI9POyyP-f93JHfkhr2ma2g
评测项目为主的播客,很多项目是国内不太能见到的,但是项目质量很好,如果希望了解国外的项目生态,非常值得看看。看看它之前评测的项目目前的价格,就知道播主选项目的眼光很好。
最近更新少了,前几个月一直在预测泡沫要破,不知道是不是因为这个原因已经离场了呢?
总之这个频道推荐的项目很值得关注。

最后,关于怎么打开YouTube,自己想办法吧,混币圈如果都不会上youtube……

关于区块链项目的开源许可证

区块链世界与以前项目一个很大不同在于开源。

世界上的开源许可证,大概有上百种。很少有人搞得清楚它们的区别。

拿以太坊的开源代码为例,py-evm是MIT协议的,solidity是GPL-3.0协议的。那么,它们有什么区别?

Screen Shot 2018-02-04 at 23.26.26

Screen Shot 2018-02-04 at 23.26.33

我所知道的最简单的区分方法:
bg2011050101

也就是说 py-evm 的衍生项目是可以不开源的,而 solidity 的衍生项目是必须开源且采用同样许可。

换句说,对 py-evm 的改动可以很自由,对 solidity 的改动则必须公布改动的细节。

最后贴两个有用的链接:

帮助你快速选择许可方式:https://choosealicense.com/
帮助你了解区块链项目的开源情况和Github地址:https://cryptocodewatch.com