Harry

2018-12-07

智能合约 | 如何调试Solidity

对于一个新手来说,ta的Aha时刻来自于ta终于可以运行自己的第一行代码,我还记得我当年写的可以运行的“烂代码”的兴奋时刻。而当我利用自己的编程技能找到工作时,其中的一个Aha时刻来自于我学会了如何调试程序。调试程序占用工作的时间有时候会达到50%,面对着一堆代码逻辑就是不知道问题在哪里。而当我掌握了如何利用断点查看当前的变量和状态后,我的工作效率提升了一倍,bug变少了,幸福感提升了。 调试Solidity有一个很好的工具:Remix,通过这个链接可以进入到Remix的网站:http://remix.ethereum.org 。 代码编辑 之后我们可以把Solidity代码放到编辑器中,上图中可以看到最左侧的行数旁边有警告/错误提示,把鼠标放到上面会有具体的信息提示,根据提示修改代码就可以消除错误信息了。修改后的示例代码可以在这里获取:https://gist.github.com/luckyyang/8edc58ad647f35424823448ea4404f8d 。 合约编译 之后我们可以选择对应的编译器版本,示例代码中的版本是0.4.25,然后就可以编译了,看到绿色的提示表明编译成功。编译的主要工作是生成ABI和bytecode,本文不做阐述。 合约部署 编译成功后,就可以切换到Run标签进行合约的部署了,这里我们可以选择Environment为JavaScript VM,直接在浏览器中运行一个虚拟的区块链网络,这样就不用我们使用Mist和ganache-cli这类的工具再去运行区块链网络了。 如上图所示,选择JavaScript VM后,会自动帮我们生成5个Account,每个Account中有100个Ether,足够我们开发使用了。 如上图所示,点击Deploy按钮后就可以部署合约了,部署成功后会自动显示合约的信息。点击合约会显示所有的变量和方法。 合约交互 如上图所示,红色表示此类方法会修改合约的状态,也表明了需要消耗gas;青色表示此类方法的作用是获取信息,不会修改合约的状态。点击具体的方法名字就可以和合约进行交互了。 合约调试 如上图所示,同时与合约交互的transaction也会显示到代码区下面的区域。点击Debug按钮会跳转到Debugger界面(下图),不但可以进行单步调试,还可以看到合约中更具体的信息,如变量和合约状态等。...

Read More
2018-12-04

以太坊智能合约与逆波兰表达式

想必大家对 1+1,3-4,5*6, 8/4,(1+6)*9,1+6*7,这些简单的数学四则运算都不陌生,有时候遇到买菜大姐, 这些菜称称,一共多少钱啊? 8块,给10块,哎这还有3块,找个儿整。人民群众喜闻乐见,耳熟能详的四则运算,有个高级的称呼中缀表达式。   为什么是中缀,而不是前缀、后缀、上缀、下缀? 中缀因为操作符都在中间位置,那能放到后面去么?当然可以了。 这种把操作符置后的方式叫逆波兰表达式,即 RPN,更通俗的叫法是后缀表达式。 中缀表达式怎么和后缀表达式对应呢? 后缀表达式有什么优点? 相较于前缀表达式更易于转换,最左边一定为运算资源。 不用括号,依靠运算顺序就能确定运算符的优先级,运算更简洁。 更符合计算机的计算方式。计算机通过从左至右读取后缀表达式,就可以将遇到的运算对象压入栈,在遇到运算符时就弹出运算资源,完成计算,再将结果压入栈。最后留在栈中的就是计算结果。 来点小例子,展示后缀表达式的方便与神奇。...

Read More
2018-12-02

[视频文字稿大纲] 手把手教你开发DApp

我们在11月25日举行了第一场Blockchain Coding Day活动,活动内容是教大家写一个简单的Dapp。针对线下活动遇到的问题,特意在B站发布了一个视频,方便大家进行回顾。 视频链接:https://www.bilibili.com/video/av37213922/,时长18分钟。 视频内容分以下部分: 下载源码并安装依赖 替换地址 通过测试网的水龙头充值 替换abi与bytecode 部署合约 运行Dapp 部署到腾讯云 在上次活动中遇到的一个很棘手的问题是操作系统。 大家有用Window的,也有直接使用Linux的Ubunut,还有使用Mac的。因为Node.js某些类库依赖C++,本地编译需要安装node-gyp,node-gyp在纯windown环境安装非常麻烦。 我们不推荐Window, 可以使用虚拟机在Window系统中安装一个Linux的Ubunut系统,...

Read More
2018-11-26

Blockchain Coding Day活动精彩回顾

Blockchain Coding Day于2018年11月25日顺利举办,本次活动由Nervos北京社区主办,星群加速器、HAOQICAT.COM、HIBLOCK和小芦蜂联合主办。 活动的目标是希望通过一天的沉浸式的编程体验,让参与者学习到DApp开发的流程和编程的乐趣。活动的形式是随机的方式分成多个小组,每个小组由一个教练带领,根据Peter老师的DApp开发教程《基于 Nervos AppChain 的 DApp 开发》来一起学习,最终开发出一个属于自己的DApp。没有到现场的小伙伴也可以自学,课程链接为 https://learning.nervos.org/nerv-first 。 通过这次学习,大家学到了如何使用代码编辑器编写智能合约;然后学会了通过调试工具Remix编译合约,将合约编译成bytecode 和ABI,bytecode会被放到区块链上,是EVM执行所用到的,ABI(Application Binary Interface)用来告诉代码如何使用合约中的函数;然后大家学会了如何把合约部署到Nervos的Appchain上;最后大家学会了如何使用React编写前端页面,与智能合约交互,并显示结果在页面上。 下午Peter老师给大家做了一个light...

Read More
2018-11-23

种类繁多的比特币地址

在之前的一篇文章中,我们介绍了比特币地址的生成过程,分为了8个步骤,不知道大家有没有动手试试呢?自己就可以在离线环境中生成非常多的冷钱包地址,前提是你有非常多的比特币需要自己保存。壕,交个朋友吧。 其中有个细节,我们在计算完Hash160的结果后, 第四步的操作是加上主网的前缀符 00,大家对这个操作有很多疑问,这个前缀符有什么用?其实比特币的地址类型有很多种,不同类型的地址应用于不同的场景,如何区分呢,自然就是前缀符了。   P2PKH类型的地址最常用,比特币网络的很多地址是这种。可用于转账、发账, 支持最最常用的操作,安安静静,低调内敛。 P2SH类型的地址支持多重签名。 什么是多重签名呢? 假设3个人管理一个基金会的比特币账户,规定至少2个人同意的时候才能动用,我们就可以做一个3-2签名的多重签名,也可以做5-3签名的,5个人中只要有3个同意,就可以动用。其实还可以做5-5签名,只有5个人都同意了,才能动用,绝对的民煮。交易所的冷钱包往往都是多重签名地址,利于分权,其实也降低了风险。 以太坊的多重签名,需要编写智能合约,虽然有些麻烦,但能进行更细致的分配。 Testnet类型的地址,这个很好理解,软件工程中常常有测试环境,区块链也分为主网、测试网,主网是我们在使用的真正的转账网络,测试网主要用于测试,我们可以获取一定数量的测试币,进行调试,而不用花费真金白银,也能提前发现bug,是不是很像游戏的不删档内测。 下图是同一个私钥,生成的不同类型地址,这3个地址都是34位长度,由于大小写字体的字宽问题,在视觉上长度不一致。 以太坊的地址比较统一,主网地址,测试网地址都是同一个类型的。 最近很吸引眼球的吴比特币、澳比特币分叉事件,闹得鸡飞狗跳,吴比特币的前身BCH地址跟比特币地址差异很大,其实他们是能互相转换的,为什么呢?因为有相同的hash160, 地址只是一种方便人可读的呈现方式。欲要分叉,先改其地址 …… ...

Read More
2018-11-21

Nervos 如何支撑加密经济?

以前 Peter 提过,搞区块链的人们其实真正想要的是加密经济。但是对于如何更好的去支撑加密经济,不同的团队有不同的理解,所以各个区块链团队的技术架构也非常的不同。2018年11月,我参加了 Nervos 的 Meetup ,会上 Nervos CTO Jan 同学分享了 Nervos 的思路。演讲的完整视频在:https://www.youtube.com/watch?v=f2Gk64UpgD8 ,我这里的内容,是对演讲中 Nervos 宏观运行方式的整理,刻意的简化了一些技术细节的讨论,略去了一些术语,保证没有区块链和密码学基础的读者也能迅速看懂。 分层架构...

Read More
2018-11-13

使用代码生成比特币地址

手动生成Bitcoin地址 看似有点儿事倍功半,如果你了解了这个过程,就会明白眼花缭乱的Bitcoin分叉币 地址只是私钥的不同显示方式,对了解Eth EOS地址也很有帮助,也可以更清楚的了解Bitcoin是如何花费的,一通则百通,妙哉。 生成Bitcoin地址,先由私钥生成公钥,再有公钥生成hash160,最后hash160再进行base58运算得到地址,如下图所示: 生成私钥,再得到公钥,是由ECDSA实现的。ECDSA是Elliptic Curve Digital Signature Algorithm的缩写, 即椭圆曲线数字签名算法。 椭圆曲线其实不是椭圆,而是下面的模样: 那我们言归正传,直接进入主题,我把这个过程分成了8个步骤。 Step1. 生成私钥 Bitcoin要使用到Secp256k1这条特殊的椭圆曲线得到公私钥,我们通过OpenSSL命令来生成私钥。 openssl ecparam -name secp256k1 -genkey > priv.pem# DER格式openssl ec -in priv.pem -outform DER | tail -c +8 | head -c 32 | xxd -p -c 32# 输出read EC keywriting EC keyccea9c5a20e2b78c2e0fbdd8ae2d2b67e6b1894ccb7a55fc1de08bd53994ea64 得到秘钥文件priv.pem,输出DER格式,长度是...

Read More
2018-11-09

[转载] 货币、区块链和社会扩展性

比特币成功的秘诀在于:用大量的资源消耗和差劲的计算扩展性来换取更有价值的东西——社会扩展性。由于近几十年来信息技术的巨大进步,限制网络组织参与人数和类型的已经不再是计算机和网络,而是还没有充分跟上技术进步的人类思维和制度设计。区块链技术,通过计算机科学来实现数据完整性,使得迄今为止信任成本最小的货币(加密货币)成为可能,它也必然为其他金融领域以及主要基于在线数据进行交易的场景带来进步。(这是一份干货十足的文章,我们为大家翻译了一个更好的版本,enjoy~ 原文作者:Nick Szabo 原文链接:http://unenumerated.blogspot.com/2017/02/money-blockchains-and-social-scalability.html  译者:Jan, Joey 小编内心戏:人类的进步基本靠组织能力的衡量的,组织能力的大幅提高大多数是靠技术进步实现的。区块链技术通过数据共识的方式,使人类建立起更强大,更普遍的认知。 技术的进步,制度的进化,让人类从蛮荒时代过度到部落,再建立国家政体,团结了越来越多的人,人类共识的范围也从几百人的部落扩大到几亿人的国家。遥想未来,国家的形态也会慢慢消失,之后人类有一个共同的身份认知:地球人,我们的目标是:星辰大海。 未来的大同世界,货币都不统一,怎么干翻外星人,怎么走出地球这个摇篮呢? 最近读了大刘的小说,中二病又严重了,嘤嘤~ 介绍 当下,区块链风头正盛。比特币是其中最大、运行时间最长的区块链。直到今天,在它迄今为止的八年发展史中(原文写于2017年2月9号),比特币从 10,000 个币买一块披萨的价值(在交易所用传统货币给比特币定价之前)上涨到每个比特币值 1,000 美元以上。在撰写本文时,比特币的市值已超过...

Read More
2018-11-05

以太坊的 Gas 机制

以太坊对智能合约的影响是深刻的,即使不用以太坊,只要做智能合约开发,就避免不了要学一下以太坊。而学习以太坊的第一天就肯定会碰到的概念就是 Gas ,这个就是咱们今天的主角,理解了 Gas 机制也就基本理解的智能合约的工作原理了。文章中首先介绍以太坊的账户和交易,以便介绍清楚智能合约工作的基本上下文,或者说让大家理解 Gas 使用的场景,接下来聊聊 Gas 的工作原理,让大家理解为啥已经有了以太币还要有 Gas ,最后深入到细节聊聊 gasPrice 和 gasLimit 这些交易参数的实际作用。 账户和交易...

Read More
2018-11-01

密码学 | 区块链上的随机数

这集来聊随机性。随机性要保证的是机会均等,而只要机会均等,区块链上恶人就没有空子可钻,就可以达成真正的共识。所以有两点是非常明确的,第一,实现随机性非常重要,只要有随机就有共识。第二,真正去中心化环境下实现随机是非常困难的,以至于到目前为止,Peter 认为真正被验证过的可行方案只有一种,就是 POW 。 什么是随机? 有必要抛开区块链,先给随机性( Randomness ) 一个非常清晰的定义。 首先,要保证不可以预测性。比如掷骰子,不管你看我掷了多少次,下一次的结果,依然是完全没办法猜到的。不可预测性,肯定是随机的一个必要条件。 其次,要保证没有规律。只有不可预测,是不能保证随机性的。比如现在我同时掷两个骰子,最后要两个数之和。这个和肯定是不可预测的,但是和为7要比和为2的概率大很多倍,所以这也不是随机。 总之,随机性要同时保证不可预测和无规律,最终目的保证的是机会均等。没有任何人为耍花招的余地。 产生随机数的方式 随机的概念说完了,下面来看看产生随机数的方式。 首先说真随机这个概念。自然界有些事情是人类尚未找到任何规律的,例如大气噪声,量子活动,这些都可以作为真随机数的来源。有人会抬杠说,这些底层不一定没规律啊,只是我们还没找到而已,所以不能叫真随机。这个说法不是没道理,但是这些数据起码目前可以在人类社会能够保证机会公平的,所以我们认为是真随机的。 但是程序世界里面,只有伪随机,没有真随机的。计算机上随机数如何去生成呢?首先程序会去采集一些硬件噪声,注意,这些是来自真实世界的真随机数。程序中去生成随机数是通过伪随机数生成器,说白了就是一套算法。算法基于之前采集到的真随机数来做初始化,所以这些真随机数就被叫做随机种子。算法的输出是很多伪随机数,之所以说是伪随机数,是因为它们是完全是由种子决定的。...

Read More
2018-10-29

Nervos解读 | 信任自动化系统 CITA

CITA 的全称是 Cryptape Inter-enterprise Trust Automation,翻译过来就是“秘猿企业间信任自动化系统”。 Cryptape 是一家公司,中文名是秘猿科技。本文是 CITA 的一个入门简介。 何为信任自动化系统 CITA 号称企业间信任自动化系统。咱们先来解释一下什么是信任自动化。 首先说什么是信任。我们生活中的信任通常是褒义词,例如,我们应该信任我们的朋友。但是在区块链和密码学领域,信任是一个负面的意思。比如,你跟我说你有三根白菜要换我的一根萝卜。有两种方法可以达成交易,一种是白菜萝卜都摆在当场,直接交换,这种过程显然是不需要信任的。但是另外一种方式是,我信任你,先把萝卜给你,回头你再把白菜给我捎过来。通过这个例子,我们可以看到,什么叫做信任?信任就是在我选择相信那些自己没办法验证的数据。可见,信任是一个安全漏洞。 而区块链给大家带来的是“去信任化”,或者说,区块链保证的是交易各方共享数据,只要有完备可信的数据在,交易过程就不需要信任了。而 CITA...

Read More
2018-10-27

Nervos北京社区布道者培训精彩回顾

上周末,Nervos北京社区举办了首次布道者培训,邀请到了风静縠纹平老司机和Peter老师带来了精彩分享。 风静縠纹平@简书: Github:Rivers Yang(riversyang) 资深程序员,有十七年的软件行业从业经验;目前专注于区块链技术布道、中文技术社区贡献以及智能合约开发和安全审计方向。 第一部分: 以太坊是一个由交易所驱动的状态机,以区块为单位来记录“世界状态”的变动;可以简单地理解为“区块链 + EVM”。 以太坊的基础数据结构包含账户状态、交易、收据和区块,以及全局的状态树、存储树和区块级的交易树、收据树。 智能合约的本质是“自主对象(Autonomous Object)”。 以太坊中的所有交易和其关联代码的执行,都是在所有“矿工”以及全节点上分别运行的,据此来更新它们各自维护的“世界状态”,在网络节点间传输的只有区块数据。 以太坊虚拟机是基于“栈”的“准”图灵机,有自己的临时存储和永久存储机制,有自己的完整指令设计,它是以太坊的核心组件。 第二部分: ABI...

Read More
2018-10-25

[转载]区块链和社会自动化

本文作者happypeter,peter从2013年开始录制技术教学视频, 现在是专业的区块链讲解员。 前几天跑步的时候,遇到一位企业家朋友,他问我区块链为何突然如此受重视。我说,一项技术之所以能带来革命,肯定是因为它做到了一个前无古人的事情。火车之所以革命,是因为地球上从没有出现过这么大体量的地面运输工具,飞机之所以革命,是因为飞机能飞。那么区块链到底做到了什么呢? 数据公有 先给出答案,然后慢慢解释。区块链在人类历史上第一次实现了数据公有,“数据公有”这四个字我自己思考了很久,可能不够准确而且容易误解,但是 Peter 觉得这四个字是最能传递我想要表达的意思的。 先说说什么是数据公有。人类最早的数据可能就是四千年前两河流域人们用楔形文字写成的账目了,从那时候开始,数据的安全都完全基于数据的私有,因为私有,才有唯一的记账人,数据才不会混乱,因为私有,才能用大铁门大铁锁来保证数据的安全。但是这样带来的问题也很明显,数据是你的,如果你自己偷偷改一下数据,是没有人知道的。所以说,企业的数据最多就是企业内可信,全社会共同认为的真正安全的数据是不存在的,也就是说数据公有是一件从来没有被实现过的事情。值得特别提一下,公有的数据并不意味这数据是完全透明公开的,区块链对数据加密和隐私保护非常擅长,但是这个角度不是我们本文的重点。 没有数据公有,社会协作就只能依赖于对第三方的信任。全社会范围的协作从来就没有停止过,例如货币是可以自由流通的,但是这并不是基于数据是可信的,而是基于我们对银行的信任。信任,在区块链语境下是个绝对的贬义词,可以说信任是系统设计的最大漏洞。我给你一块钱,实际上是没有一个你和我之间公认的数据的记录的,交易可以达成,完全是因为有一个第三方的老大在。有人可能说,老大那里有数据啊,怎么能说没有数据呢?但是实际情况是,老大的数据咱们谁也没见过,谁也没有权力查账验证,什么叫信任,就是去相信你根本没办法去验证的东西。银行为啥都盖那么高的楼呢?其实就是为了构建咱们老百姓对它的信任,多么荒谬的事情。 有了公有数据,社会协作就可以”去信任化“。2014年我写过的一篇文章,说比特币核心的技术突破就是实现了价值传递。我有一个比特币,给你了,我就没有了。所以比特币实现了一个不依赖于第三方的价值传递协议。但是其实仔细想想,所谓传递,所谓技术突破,其实底层就是因为区块链带给人们的是数据的公有,数据就在那里,比特币就是一个大账本,上面记录了你多了一块钱,我少了一块钱,只要数据是公有且安全的,这个过程真的不需要第三方,也无需信任。这就是区块链带来的“去信任化”。 到这里,什么是数据公有,数据公有有何意义,就说清楚了。 社会自动化 下面我们来说社会自动化。Peter 本科时学自动化的。工业上的自动化大家都很好理解。但是什么是社会自动化呢? 社会自动化,是 Peter 脑子里面突然冒出来的一个词。有意思的是,工业自动化很大程度上意味着工业流程靠机器完成,无人参与。社会的本质就是你和我连接成的一个网络啊,那么社会自动化难不成也是让社会无人参与么?这个当然不是,但是自动化的意思没有变,依然是“去人为干预”,或者说把社会上人跟人交易的流程靠计算机程序自动完成。社会自动化,这里给出一个定义就是:陌生人之间在无需信任对方或者第三方的条件下来进行交易。...

Read More
2018-10-11

Nervos AppChain组件之ReBirth

ReBirth是一个提供区块链数据缓存服务的服务器端组件。它通过在服务器本地缓存 AppChain上的数据,为 Microscope等提供所需的数据缓存和查询服务,加快查询区块数据的速度。 ReBirth 具体有什么用 如果Microscope不配置ReBirth,首页右侧的最近交易列表没有数据,也不支持查询! 大概工作原理 ReBirth是一个典型的Rails Api服务,后端数据库是PostgreSQL。 启动后台任务,通过rpc请求获取AppChain链的数据,保存到数据库中,通过PostgreSQL支持查询功能。 rails task -T |grep syncrails daemons:sync:restart              # restart sync processrails daemons:sync:start                 # start sync processrails daemons:sync:status               # get sync process statusrails daemons:sync:stop                  # stop sync processrails ethereum:node:waitforsync    # Check if node is syncing 目前一共有9张表 1. abis2. balances3. blocks4. transactions5. erc20_transfers6. event_logs7. sync_errors8. sync_infos9. validator_caches 1~6 表是保存区块的基本数据7~9 可能是记录同步状态 如果不使用docker...

Read More