Warning: Trying to access array offset on value of type bool in /www/wwwroot/blockchain/wp-content/themes/Grace8.2/functions_suxingme.php on line 1176

Warning: Trying to access array offset on value of type bool in /www/wwwroot/blockchain/wp-content/themes/Grace8.2/functions_suxingme.php on line 1177

Warning: Trying to access array offset on value of type bool in /www/wwwroot/blockchain/wp-content/themes/Grace8.2/functions_suxingme.php on line 1178

Warning: Trying to access array offset on value of type bool in /www/wwwroot/blockchain/wp-content/themes/Grace8.2/functions_suxingme.php on line 1294
作者:BlockPunk 社区:果壳宇宙(ID:DfinityFun) 前言 4000年前的东方大陆,萨满缓慢的从篝火的灰烬中扒出龟甲,龟甲上随机的裂纹会决定部落下一次狩猎的时机;3000年前的地中海,尊贵的雅典神官主持着抽签仪式,他们要随机选出五百位优秀公民,来参与城邦政务的讨论;2000年前的中东,行商围坐在一张赌桌旁,紧张的注视着桌面上转动的四面骰子,它的最终结果会决定一大笔财富的归属。 在上千年的人类历史里,我们一直不断地探寻着可靠的随机数,并将随机数用在生活的各个方面,民主与共和的抽签制度,战争时期的军情传递、生产上的模型计算,以及赌博娱乐时的可信参照。 对可靠随机数的追求,更是人类对公平的追求,对随机数的承认,可以说是人类最早的关于公正的共识。而在2000多年后的现代,人类发明了计算机,开始了崭新的数字纪元,随机数成为了整个虚拟世界的基础。 真随机数 我们祖先朴实的技术而言,人类创造了很多生成随机数的方法,但这些随机数的随机强度与不可预测程度,并不比烧龟甲来的更高。 这里就要讲到真随机数与伪随机数了。古代的人类观察物理世界时,会发现到处都存在着随机的波动,这种随机性在他们看来,是上天的旨意,你完全没法预测未来会怎么样。真正的随机性,只存在于物理世界,大气噪声、宇宙背景辐射、放射物的衰变期、量子塌缩现象,通过观测这些现象,得到的随机数是完全无规律可循的。 《百万乱数表》图片来自网络 上世纪40年代,兰德公司利用模拟电路制成的电脉冲发生器生成了100万个随机数,并将其出版为《百万乱数表》,一直销售到今天。现在看来这似乎是一个异想天开的行为艺术,但在当时却是非常重大的突破。 熔岩灯 有趣的是,在互联网时代的今天,仍有人在使用这种方法。一家名叫Cloudflare的云服务商,通过图像识别实时处理熔岩灯中蜡的形状,计算量化来获取真随机数,从而对数据进行高强度的加密。这听起来好像有些愚蠢,但其实它的随机强度,却远强于现在主流的随机数。 假随机数 我们可以从物理现象中得到神秘而无穷的随机性,但有些现象并不能精确量化。但同时我们需要巨量的随机数来加密数据、训练模型、公平仲裁,仅依靠自然界的随机数是远远不够的。 这也是计算机之父,冯诺依曼思考过的。在1946年, 冯诺依曼参与了美军氢弹的设计,他在一台名为ENIAC的计算机上,模拟计算核聚变的过程。而这个模型的训练,需要对随机数进行快速的存取,但ENIAC的内存不够大,无法保存长真随机数,因此冯诺依曼设计了一个算法,来模拟一个随机性的混乱状态。 ENIAC计算机 | 图片来自网络 这个算法是这样的:首先获得一个很短的随机值,比如操作时刻的毫秒数,作为这个算法的“种子”,然后将“种子”平方,输出平方结果的中间部分数字,再作为“种子”重复上述操作。重复足够的次数后,就获得了一个“随机数”。 这被称为平方取中法,这也只是无数假随机数算法中的一种,这个算法输出的序列,只取决于最初种子的随机性。由于机器的确定性,同样的种子,就可以计算出同样的随机数。 种子的位数决定了随机数的随机度,当你设定一个两位的种子生成一个10位随机数,在函数产生重复循环之前,最多只能得到100个可用的随机数;而在自然界中,10位随机数应该存在一百亿种可能。这两者之间巨大的数量级差别,就是随机数真与假的区别。 只要你使用基于“种子”的假随机数,必然会出现重复循环的过程,也就是说,只要知晓了你的随机数算法,另一台计算机迟早能暴力尝试出相同的随机数。这就是区块链钱包的密钥生成随机函数被攻破后,暴力盗取密钥的手段。 假随机数存在规律的周期,点集中表现为脉络 图片来自网络 当然这种随机数是足够使用的,我们必须引入计算机科学中非常重要的一个概念,时间边界,也就是在多长的时间里,这个随机数是安全不重复的。和我们使用密码车锁一样,我们知道正确的密码必在一万种的组合方式之中,但一个个尝试需要花费好几天时间,这个时间边界内都算是安全,假随机数也是如此。 我们闭眼敲键盘的随机字符串,其实也有规律可循,这就是QWER的键盘布局,通过分析后破解随机数的可能性就会很大 这依然无法满足区块链的使用要求,因为我们需要一个能在固定时间内,分布式的获取随机数的方法,而不能依赖于任何一个中心主体。 区块链为什么需要随机数 在传统互联网中,随机数是作为密码学与隐私安全的基础,通过共享随机的密钥,两个节点间就可以进行加密的私人通讯,而在区块链中,就是使用私钥密钥传输财产;同时随机数还广泛应用于有限带宽下的多节点通讯,可以利用随机数来决定数据发送的合理顺序,来协调多方节点,在区块链上,就是利用基于随机数的共识算法,协调交易确认者,保证一段时间内大家只对部分节点的消息进行反馈更新,从而在网络消息数有限的情况下获得一致。 而在区块链与加密的世界里,随机数上再次投射出了人类对公平的追求。我们的世界是随机的,过去无法更改,但未来不可预测,这是对生命最大的公平。区块链上一样,我们通过随机数的可信,脱离人性的干扰,获得链上的公正性,保证整个系统的去中心化程度与可信性。特别是权益证明PoS越来越火的现在,我们比以往任何时候都需要一个安全、稳定、可信的随机数,来保证密钥对的生成、链上数据的加密、出块权力的裁定、智能合约的运行。 总结 公平的决定出块权力,维持一致性共识。部分PoW与PoS机制下,依靠随机数选定出块者或者出块组的,包括DPoS机制下的循环出块的顺序,也是依靠随机数决定。 私钥的生成。目前私钥只要由各钱包自定随机数方法生成,存在较大安全隐患。 链上应用的随机数源。保证博彩、游戏、抽奖、分发、调查等应用的公平公正,此类容易被黑客攻击。 数据加密。链上数据因为是公开审查的,需要强度较高的加密,通过足够强的随机数确保链上数据的隐私与安全。 链上随机数的难点 虽然区块链还是基于过去的互联网技术,但是在随机数生成部分却有着非常大区别。 传统的随机数产生方式是中心化的,产出的随机数,与特定机器的状态值、物理状态相关,而同一个随机数算法,在不同的节点上得到的随机数是不同的,并且也没法针对每一个随机数进行验证,因此传统的方式无法产生一致性的随机性,这和区块链不兼容。 因此区块链上的随机数,需要重头开始设计机制,从而来获得满足分布式特点的结果。因此到目前为止,没有真正意义上完美的方案,区块链上的真随机数是缺失的,连假随机数都很难获得。 链上随机数的原则 1.不可预测 因为随机数决定着整个协议层包括所有以上层级的公正性,如果这个随机数是能提前预见的,那么就可以伺机发动攻击。当然这个不可预测性是存在时间边界的,一般以区块链时间为边界,通过控制计算难度,或设置等待,来增加预测的难度。简而言之,有两种方案: 保证随机数从区块时间上看是串行的(VRF/VDF) 保证随机数产生的难度,并按情况调节难度(哈希碰撞) 2.不可干扰 随机数决定着区块(非拜占庭容错系统中)的共识确认,因此如果能干扰到随机数的发生,无需掌握超越上限的节点/算力,就可以间接的控制区块链未来的走向,虽然干扰可能很微小,但多次干扰积累下来就会出现较严重的问题(“放大攻击”)。有两种解决方案: 保证随机数生成是非交互的(阀值签名方案),或完全根据节点本身状态计算(哈希碰撞) 设置随机数生成时延,需要等待长时间的复杂计算才能得出随机数,让干扰者无法预估自己施加的影响 3.可验证 应该详细表述为,可被简单验证,这表示随机数必须能够被任何节点快速进行验证其合法性,这样分布式的节点才能通过检验随机数,确认某一节点的出块资格,从而达成一致性。如果验证效率很低,需要很长时间,那么节点间共识的达成就会遥遥无期,区块链无法使用。 不符合上述原则的一些解决方案 为了解决区块链上的随机数难点,自发的产生了许多解决方案,以下简述以下不符合上述三个原则的方案,虽然他们各自都有自洽的逻辑与一定的安全性,但在现阶段还是存在问题的,在对安全需求不是那么高的地方仍可以使用。这不不针对某个项目,而是指出相似范式的问题 1.使用链下真随机数 不在链上计算随机数,而是使用从物理现象中获得的真随机数,比如大气噪声、电子脉冲,以及依赖包含热噪声电路的芯片组。但是对区块链来说,链下部分是不可见的,默认就是不可信的,链下获得随机数一定需要一个第三方上传至链上,这不仅违背了区块链的去中心化精神,完全无法验证,且存在篡改与提前预知的风险。就算使用预言机来去中心化的获取链下的真随机数,但仍存在物理上的人为干扰。因此这种方案非常不可取。 2.将当前块的数据作为随机源 很多的链上博彩类Dapp,都习惯直接引用最近区块的哈希根值等作为合约的随机种子,再来产生随机数。虽说简介的借助了链上算力的保证,如此产生的随机数看似足够有公信力,但需要考虑到多维度的安全性。首先,区块上的数据是透明的,所有节点都能获取,攻击者同样能用来攻击合约,唯一的障碍就是不开源的随机数算法。第二点,出块人获得出块资格后,可以尝试变更打包交易顺序、尝试打包不同交易,来产生最有利于他的哈希根值,从而扩大自己中奖的概率,这对其他参与者是不公平的。 3.借助分布式组织产生随机数 因为随机数的强度来源于种子的随机性,因此就有人提出由一个分布式组织来产生足够随机的种子,依赖与本地节点的特殊状态或控制者的“自由意志”,向链上上传秘密与验证,以特殊算法组合种子,再在链上产生随机数。先不论链下的合谋可能(有经济设计制约),这种方案还是存在“最后参与者攻击”的可能,也就是最后一个上传秘密的参与者,可以知道此前的全部秘密,他可以控制自己的秘密来干扰最终随机数的产生。且在掌握了函数算法后,可以预测影响的规律,如此可以多次施加干扰,进而不断扩大自己的影响,这就是“放大攻击”。 三类方案 虽然区块链上的随机数并不完美,但随这越来越多的项目认识到了随机数对效率和冗余度的巨大优化,随机数的可信与高效显得越来越重要。因此这里总结了三类相对成熟方案,并指出了相关项目与方案优缺点。 哈希碰撞 在PoW系统中,矿工的客户端有一个基于本节点状态的随机数发生器,可以输出随机数序列,然后再计算其哈希值,一但生成的哈希值在规定的大小范围内,就是为获得了出块资格,其他节点获取这个随机数值,计算一次哈希值即可进行验证,因此它的验证是十分简洁的。 因此这个随机数得经历数百兆亿次随机数发生后,才有机会获得一个符合要求的随机数,因此它的随机程度非常的高;同时由于得出随机数消耗的资源非常大,想要提前几个区块预测这个随机数几乎是不可能的;由于随机数完全根据节点本身状态输出随机数,因此这个随机数不会其他攻击者干扰;即时的难度调整(调整哈希值的大小范围),在安全时间边界内不会出现被攻破的情况。 PoW的共识特点,使得其天然具备随机性的(randomness for free)。 优点: 随机性最强,安全性号,非常适合驱动共识层; 产生随机数时不需要使用网络带宽。 缺点: 计算冗余度,计算消耗大,资源浪费; 难以在应用层使用; 不具备唯一性,可以同时存在多个满足要求的随机数,可能导致区块分叉; 无法抵抗并行加速破解,计算机持有多的人可以连续预测多个随机数。 可验证随机函数(VRF) VRF(Verifiable Random Function)算法于1999年由莫卡利教授提出,由于其较好的安全性与效率,被越来越多区块链项目拿来优化共识过程,让共识的随机数部分占用计算资源变少,让资源更多地被交易的确认与合约的运行所占用。 集合上图简述生成步骤: 0.生成随机数签名专用公私钥对; 1.获得一个足够随机的种子,可以直接使用上一轮结果,与区块高度、时间的变量等进行组合; 2.用随机数私钥对之进行签名(共同参与随机数生成),或是先签名再组合; 3.对签名后的值做哈希摘要,得出最新的随机数; 4.检查随机数是否在合法范围中,判断是否抽签成功进入出块组(部分项目不需要这个过程) 5.根据公钥与轮次等输入,计算证明,接受随机数后验证者使用函数进行验证。 因此这样产生的随机数,节点可以轻松验证其是否合乎算法,"Verifiable"就这样做到了;而经过足够复杂的算法,加上哈希摘要过程,获得足够随机分布的结果,“Random”得到了保证。 VRF主要结合PoS机制一起使用,来进行出块人(群)的随机选择,个别项目中直接决定区块的一致性选择。这个随机数的生成过程可以完全在一个节点的链下运行,同时也可以整个运行在链上。 需要注意的是签名随机的部分,VRF的这个签名随机算法应当具备唯一性,也就是说用同一把密钥,对同一个数据签名随机多次,只有唯一的一个随机数能被公钥验证,这就能防止产生随机数时,多次运行签名随机部分,来获得最有利于自己的随机数。 优点: 算力要求低,产出随机数效率高; 产生唯一性、确定性的随机数,不易出现分叉; 验证可滞后于随机数产生,适合进行秘密选举; 可设置为(输入为上轮结果)抗并行加速破解,矿机多者也无法连续预测随机数。 缺点: 验证步骤较多,秘密选举下需要多次验证; 随机数分布均匀性不好,因为是根据特点密钥计算的; 带宽占用高,延时长,是为让秘密选举的节点互相确认,BLS项目问题不大; Algorand 每一个节点都获取前一轮确认区块上的随机种子,集合轮次时间等,在链下单独运行VRF函数,然后对结果进行哈希摘要,节点将结果与网络中哈希值范围进行比较(比较类似于PoW哈希比对),范围内的成员便有资格参与验证与出块。…
拥有 27 亿全球用户的 Facebook,联合 100 个行业巨头,携带数十亿互联网的流量,正如火如荼地建设一个全球范围的金融基础设施——Libra(天秤座)。作为技术人员,你为何不参与其中? 本文从以下几个点入手,探讨技术人员对 Libra 感兴趣的几个方面。 目标:Libra 想做个什么东西? 生态建设:Libra 怎么做的? 与众不同的点:相较于主流区块链,Libra 有何不同? 开发路线图:Libra 核心团队、开发任务、迭代和发布计划? 开发者上手开发的难度:我该如何参与其中? 开发者如何赚钱:我做什么东西可以获利? 1. 目标 2017 年,当中国区区块链小组刚刚成立时,我们接受过雷锋网的一次采访。那次采访中,我坦言金融领域是可以最适合、最先、最便捷地来应用区块链技术的。只不过之后金融领域的区块链应用一直处于不愠不火的状态,没想到,Facebook 这次下了一剂猛药。 抛开政治方面的动机,从技术人的角度来看,Libra 的动机是纯良的。我们常说技术中立,但是决定这些技术用途的主体归根结底还是人,如果明知道这是一场目的不纯的技术炒作,有点节操的技术人都应该嗤之以鼻。至少现阶段,我认为这项技术对金融行业是有益的,Facebook 掀起的这场运动或许可以给区块链正名。 Libra 不仅仅是具体的区块链技术,同时也是一场声势浩大的运动。它在最开始就明确了一个宏大的愿景——建立一套简单的,无国界的货币和为数十亿人服务的金融基础设施。为了达成愿景,Libra 确立一个目标,它想在安全稳定的开源区块链基础上创建一种稳定的货币,该货币以真实资产储备为后盾,并由独立协会管理。这项特别符合“区块链”思维的措施,看上去毫无新意。在区块链的世界里,这种运行模式稀松平常。既然如此,不免有人开始好奇为什么 Libra 会引起如此广泛的关注?原因很简单,因为它的背后是 Facebook 这个互联网巨头,手握 27 亿的全球用户,再加上 Facebook 一以贯之的性格——Move Fast and break things 以及 Move fast with stable infra;别人干不成的事情,它很可能干得成。一言以蔽之,人们期待的是它可能掀起的 fear of missing out 的狂潮。猜想一下,多数银行估计已经不淡定了。 2. 生态建设 一个成功的开源项目,背后必然有强大的社区支持。举个例子,以太坊的成功是有目共睹的,它作为全球最大的区块链社区,共有大约 35 万的开发者,而且这个数字还在快速增长中。Libra 想在开源世界站住脚跟,也必须组建起强大的社区。其实从 Facebook 拥抱开源的经验来看,这件事做起来不会特别困难,难的是如何让这些区块链社区的开发者投入自己的怀抱? 聪明的是,Libra 区块链(2020 上半年主网上线)在设计上借鉴了大量主流区块链的优点,也规避一些缺陷。它在核心概念中引入了 Balance(余额)模型,而非比特币只有 UTXO(未花费交易输出)模型。这是因为在实际编程过程中,Balance 模型的可操作性比 UTXO 更加友好,至少不用聚合大量 UTXO 才能算出余额。而且为了限制耗时计算,Libra 区块链部分复制了以太坊的 Gas 模型,耗光 Gas 后停止运算。这些性质很贴合大多数区块链开发者的习惯。 虽然有不少人对 Libra 引入 Move 编程语言颇有微词,但是这门新语言在解决智能合约编程漏洞方面确实做出了一些重要的改进。它对自己的能力相当的克制,要求强类型、无动态分派、有限不可变性(Limited Immutablity 参考 Rust 语言,保证每个对象在任何阶段只有一个可修改的引用),在编译期期间的 Bytecode Verifier 验证潜在 bug、模块化,当然还有高大上的形式化验证(Formal Verification)。这些改进是从前人的经验教训中汲取的,语言的范式其实都在不同角度上限制语言本身的功能,很早就有人怀疑区块链上存在图灵完备的编程语言的必要性了,在 Libra 区块链中,这点更加明显,它的目的更聚焦,就是要让开发者更多关注自己的业务表达,减少在安全性上的心智浪费。 前车之鉴固然可以让它在软件设计上高人一筹,但是区块链生态的建立可没那么简单。除了开发者,至少还得有两种角色的广泛参与。第一类是投资者,他们是实际运营区块链的人;还有一类就是用户,他们是整个网络存在的终极理由。这是一项系统工程,每个区块链从业者都应该思考和关注。 区块链简易生态示意图 所以,在 Libra 区块链之上,还需要其它机制的建设,也就是我们常说的区块链治理。Facebook 表现出了先见之明,首先设立了一个总部坐落在政治中立的瑞士日内瓦的非营利性成员组织,简称 Libra 协会,拉拢了一帮有头有脸的行业大佬。这些大佬遍布支付、技术和交易平台、电信、区块链、风险投资等行业,同时涵盖非营利组织、多边组织和学术机构。不仅如此,Facebook…
0.引子 关心链圈或者币圈的朋友,或许听过北大岳昕事件或者最近的疫苗事件。 北大岳昕事件: https://etherscan.io/tx/0x2d6a7b0f6adeff38423d4c62cd8b6ccb708ddad85da5d3d06756ad4d8a04a6a2 疫苗事件: https://etherscan.io/tx/0xb1ed364e4333aae1da4a901d5231244ba6a35f9421d4607f7cb90d60bf45578a 各大媒体和社交网络都被封口,但区块链的世界里没有404。 那么问题来了,我们应该如何将信息发布到区块链上呢?如果做到已经发布,就不可篡改。一经发布就永久流传呢?方法很简单。深研未来今天将手把手教大家内容上链的具体操作方法和流程。以后再出现公共事件时,希望大家第一时间将内容保存,并上链。这个世界的公平公正,需要我们每个人共同努力! 1.原理 其实原理很简单: 在以太坊上,任何一笔交易都会记录在区块里面,而每一笔交易都有一个独一无二的交易id。 我们可以在区块链上通过交易 id 查看历史上的任何一笔交易。 每个交易都可以设置一个可选的 transaction data 字段,用来描述交易说明。 transaction data 这个字段是不会占用 gas 的,既它不会产生任何费用。 我们就是通过以太坊上的这个 “漏洞“ ,自己给自己转账 0 eth,生成一笔最低成本的交易,将我们要发布的内容填入交易说明,来实现内容上链的。 2.MetaMask 首先,你得有一个以太币的钱包,Mist 或者 MetaMask 都可以。在这篇文章里,我们默认使用MetaMask,安装方法如下: 2.1 Metamask安装 这是一款运行在谷歌浏览器Chrome上的插件,所以首先你必须要安装google chrome浏览器。或者使用其他浏览器的极速模式也可以(如360浏览器)。浏览器安装好之后,接下来要进行metamask插件的安装。 这款插件的官方地址为https://metamask.io/,我们用Chrome打开这个链接,进入后按照下面两个图的顺序进行安装即可。 因为众所周知的原因,安装过程需要科学上网。科学上网详情请见:【点我科学上网】 2.2 Metamask使用 1. 安装完成后,当你第一次点开这个小狐狸图标,会出现这样的提示。 2. 这里提示用户,当登录到MetaMask之后,你的账户对你访问的所有网站都是可见的,为了你的隐私,在使用完MetaMask之后最好退出登录。同时也提示读者,默认情况下MetaMask会登录到一个测试网络,要使用真实的以太网络,需要用户手动连接到以太坊的主网络,这里后面会给大家演示。 3. 点选 Main Ethereum Network 之后,阅读完使用说明,往下拉到最下面,连续点击Accept,便可以设定密码。 4. 当成功设定密码之后,你会获得 12 个英文字(这组英文成为助记词),请一定一定要把这 12 个英文字记录在安全的地方 ,因为在区块链上,如果忘记了密码的话,你的只能通过输入这组英文字来恢复帐号。 5. 确定这 12 个英文字都记录好之后,你便可以看到在区块链上属于自己的地址了。 6. 下面是关于钱包页面各个按钮功能的一些介绍和翻译,直接从图中就可以了解了。 以上是关于metamask的安装及简单的使用和介绍,接下来,要讲一下关于账户的管理,以及如何快速的进行转账等操作。 2.3 使用Metamask操作 Metamask的优势在于快速的账户创建,和地址之间的互相转账。 如下图,我们点击右上角那个小人儿,点击Create Account,差不多可以在一秒之内完成一个钱包的创建,直接点击进去便可以对该钱包进行操作和管理,其页面都是一样的。 之后如果要将ETH转账给其他几个钱包,此时我们点击SEND。 在之后出现的页面中,我们输入转账对象的地址,和转账数量。(我们把鼠标移动到转账地址的框框里,会发现右侧出现了一个小三角,用鼠标点击它,会直接出现metamask内自己的其他地址的选项(Account1,Account2,……),直接选择即可,无需复制地址。) 之后会进入转账具体信息的界面,可以设置gas limit以及gas price。点击ACCEPT就将转账发送出去了。如果顺利的话,过一会儿就能在ETH区块链浏览器中看到你的转账交易了。 Metamask优势 如果你是手动操作,在进行大量地址转账操作的时候,会发现有了这个功能会省去大量的时间,尤其是配合metamask快速创建钱包的特性。 3.购买ETH 知道Metamask怎么操作后,接下来你需要往你的Metamask钱包里转入一定数量的以太坊,这个数量不用太多,内容上链,一条内容的成本也就几块钱而已(主要用于支付gas费),你通过用类似OTCBTC的软件去场外市场用法币购买eth,然后提币到metamask自己的地址。如果你自己的其他钱包(如imToken)里有eth,那么直接转账到metamask自己的地址即可。不会购买eth的童鞋,可以在深研未来官网的投资交易栏目中去搜寻如何购买。   4.内容上链 4.1 复制地址 复制你自己的地址,用于自己给自己转账。 4.2 准备内容 然后,准备你需要上链的内容。内容必须是十六进制的 Hex 字符。有很多种方法可以从UTF-8字符得到Hex字符。比如使用Python: content = “区块链的世界里没有404,深研未来将和您一同维护这个世界的公平、公正!” content= '\xe5\x8c\xba\xe5\x9d\x97\xe9\x93\xbe\xe7\x9a\x84\xe4\xb8\x96\xe7\x95\x8c\xe9\x87\x8c\xe6\xb2\xa1\xe6\x9c\x89404\xef\xbc\x8c\xe6\xb7\xb1\xe7\xa0\x94\xe6\x9c\xaa\xe6\x9d\xa5\xe5\xb0\x86\xe5\x92\x8c\xe6\x82\xa8\xe4\xb8\x80\xe5\x90\x8c\xe7\xbb\xb4\xe6\x8a\xa4\xe8\xbf\x99\xe4\xb8\xaa\xe4\xb8\x96\xe7\x95\x8c\xe7\x9a\x84\xe5\x85\xac\xe5\xb9\xb3\xe3\x80\x81\xe5\x85\xac\xe6\xad\xa3\xef\xbc\x81' 然后批量去除掉\x。 或者通过在线工具(本文推荐使用此方法):https://onlinehextools.com/convert-utf8-to-hex 调节转换参数(三个勾都去掉),将UTF-8字符转换成Hex字符: 得到: e58cbae59d97e993bee79a84e4b896e7958ce9878ce6b2a1e69c89404efbc8ce6b7b1e7a094e69caae69da5e5b086e5928ce682a8e4b880e5908ce7bbb4e68aa4e8bf99e4b8aae4b896e7958ce79a84e585ace5b9b3e38081e585ace6ada3efbc81 然后使用Word等文字编辑工具,将Hex字符批量变大写(深研未来亲测过,不经过此步骤,直接把小写的Hex字符写入到以太坊区块链中,显示View…
0.性能与评测 过早优化,往往引来各种麻烦。 一项技术究竟能否实用,有两项基本指标十分关键:一是功能的完备;一是性能的达标。 本章将试图对已有区块链技术进行一些评测。所有结果将尽可能保证客观准确,但不保证评测方法是否科学、评测结果是否具备足够参考性。 1.简介 区块链的平台性能跟很多因素都有关系,特别在实际应用中,根据应用场景的不同和系统设计和使用的不同,可能同一套平台最终在业务体现上会有较大差异。 在这里,仅侧重评测一般意义上的平台性能。 所有给出指标和结果仅供参考,由于评测环境和方案不同,不保证结果的一致性。 生产环境中应用区块链技术请务必进行充分验证评测。 2.Hyperledger Fabric v0.6 性能评测 环境配置 类型 操作系统 内核版本 CPU(GHz) 内存(GB) 物理机 Ubuntu 14.04.1 3.16.0-71-generic 4×2.0 8 每个集群启动后等待 10s 以上,待状态稳定。 仅测试单客户端、单服务端的连接性能情况。 评测指标 一般评测系统性能指标包括吞吐量(throughput)和延迟(latency)。对于区块链平台系统来说,实际交易延迟包括客户端到系统延迟(往往经过互联网),再加上系统处理反馈延迟(跟不同 consensus 算法关系很大,跟集群之间互联系统关系也很大)。 本次测试仅给出大家最为关注的交易吞吐量(tps)。 结果 query 交易 noops clients VP Nodes iteration tps 1 1 2000 195.50 1 4 2000 187.09 pbft:classic clients VP Nodes iteration tps 1 4 2000 193.05 pbft:batch clients VP Nodes batch size iteration tps 1 4 2 2000 193.99 1 4 4 2000 192.49 1 4 8 2000 192.68 pbft:sieve clients VP Nodes iteration tps 1 4 2000 192.86 invoke 交易 noops clients VP Nodes…
1.链码示例一:信息公证 简介 chaincode_example01.go 主要实现如下的功能: 初始化,以键值形式存放信息; 允许读取和修改键值。 代码中,首先初始化了 hello_world 的值,并根据请求中的参数创建修改查询链上 key 中的值,本质上实现了一个简单的可修改的键值数据库。 主要函数 read:读取key args[0] 的 value; write:创建或修改 key args[0] 的 value; init:初始化 key hello_world 的 value; invoke:根据传递参数类型调用执行相应的 init 和 write 函数; query:调用 read 函数查询 args[0] 的 value。 代码运行分析 main 函数作为程序的入口,调用 shim 包的 start 函数,启动 chaincode 引导程序的入口节点。如果报错,则返回。 func main() { err := shim.Start(new(SimpleChaincode)) if err != nil { fmt.Printf("Error starting Simple chaincode: %s", err) } } 当智能合约部署在区块链上,可以通过 rest api 进行交互。 三个主要的函数是 init,invoke,query。在三个函数中,通过 stub.PutState与 stub.GetState存储访问 ledger 上的键值对。 通过 REST API 操作智能合约 假设以 jim 身份登录 pbft 集群,请求部署该 chaincode 的 json 请求格式为: { "jsonrpc": "2.0", "method": "deploy", "params": { "type": 1, "chaincodeID": { "path":…
0.区块链核心技术概览 运用之妙夺造化,存乎一心胜天工。 跨境商贸合作中签订的合同,怎么确保对方能严格遵守和及时执行? 酒店宣称刚打捞上来的三文鱼,怎么追踪捕捞和运输过程中的时间和卫生? 现代数字世界里,怎么证明你是谁?怎么证明某个资产属于你? 经典囚徒困境中的两个人,怎样才能达成利益的最大化? 宇宙不同文明之间的“黑暗森林”猜疑链,有没有可能被彻底打破? 这些看似很难解决的问题,在区块链的世界里已经有了初步的答案。 本文将带领大家探索区块链的核心技术,包括其定义与原理、关键的问题等,还将探讨区块链技术的演化,并对未来发展的趋势进行展望。最后,对一些常见的认识误区进行了澄清。 1.定义与原理 定义 区块链技术自身仍然在飞速发展中,目前相关规范和标准还在进一步成熟中。 公认的最早关于区块链的描述性文献是中本聪所撰写的 《比特币:一种点对点的电子现金系统》,但该文献重点在于讨论比特币系统,实际上并没有明确提出区块链的术语。在其中,区块和链被描述为用于记录比特币交易账目历史的数据结构。 另外,Wikipedia 上给出的定义中,将区块链类比为一种分布式数据库技术,通过维护数据块的链式结构,可以维持持续增长的、不可篡改的数据记录。 笔者认为,讨论区块链可以从狭义和广义两个层面来看待。 狭义上,区块链是一种以区块为基本单位的链式数据结构,区块中利用数字摘要对之前的交易历史进行校验,适合分布式记账场景下防篡改和可扩展性的需求。 广义上,区块链还指代基于区块链结构实现的分布式记账技术,还包括分布式共识、隐私与安全保护、点对点通信技术、网络协议、智能合约等。 区块链技术最早的应用出现在比特币项目中。作为比特币背后的分布式记账平台,在无集中式管理的情况下,比特币网络稳定运行了八年时间,支持了海量的交易记录,并且从未出现严重的漏洞,这些都与区块链结构的巧妙是分不开的。 基本原理 区块链的基本原理理解起来并不复杂。 首先包括三个基本概念: 交易(Transaction):一次对账本的操作,导致账本状态的一次改变,如添加一条转账记录; 区块(Block):记录一段时间内发生的所有交易和状态结果,是对当前账本状态的一次共识; 链(Chain):由区块按照发生顺序串联而成,是整个账本状态变化的日志记录。 如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中交易导致状态改变的结果进行确认。 在实现上,首先假设存在一个分布式的数据记录账本,这个账本只允许添加、不允许删除。账本底层的基本结构是一个线性的链表,这也是其名字“区块链”的来源。链表由一个个“区块”串联组成(如下图所示),后继区块记录前导区块的哈希(Hash)值。新的数据要加入,必须放到一个新的区块中。而这个块(以及块里的交易)是否合法,可以通过计算哈希值的方式快速检验出来。任意维护节点都可以提议一个新的合法区块,然而必须经过一定的共识机制来对最终选择的区块达成一致。 图 1.5.1.1 – 区块链结构示例 以比特币为例理解区块链工作过程 具体以比特币网络为例,来看其中如何使用了区块链技术。 首先,比特币客户端发起一项交易,广播到比特币网络中并等待确认。网络中的节点会将一些收到的等待确认的交易记录打包在一起(此外还要包括前一个区块头部的哈希值等信息),组成一个候选区块。然后,试图找到一个 nonce 串(随机串)放到区块里,使得候选区块的哈希结果满足一定条件(比如小于某个值)。这个nonce 串的查找需要一定的时间进行计算尝试。 一旦节点算出来满足条件的 nonce 串,这个区块在格式上就被认为是“合法”了,就可以尝试在网络中将它广播出去。其它节点收到候选区块,进行验证,发现确实符合约定条件了,就承认这个区块是一个合法的新区块,并添加到自己维护的区块链上。当大部分节点都将区块添加到自己维护的区块链结构上时,该区块被网络接受,区块中所包括的交易也就得到确认。 当然,在实现上还会有很多额外的细节。这里面比较关键的步骤有两个,一个是完成对一批交易的共识(创建区块结构);一个是新的区块添加到区块链结构上,被大家认可,确保未来无法被篡改。 比特币的这种基于算力寻找 nonce 串的共识机制被称为工作量证明(Proof of Work,PoW)。目前,要让哈希结果满足一定条件,并无已知的快速启发式算法,只能进行逐个尝试的暴力计算。尝试的次数越多(工作量越大),算出来的概率越大。 通过调节对哈希结果的限制,比特币网络控制平均约 10 分钟产生一个合法区块。算出区块的节点将得到区块中所有交易的管理费和协议固定发放的奖励费(目前是 12.5 比特币,每四年减半)。这个计算新区块的过程,即俗称的“挖矿”。 读者可能会关心,比特币网络是任何人都可以加入的,如果网络中存在恶意节点,能否进行恶意操作来对区块链中记录进行篡改,从而破坏整个比特币网络系统。比如最简单的,故意不承认收到的别人产生的合法候选区块,或者干脆拒绝来自其它节点的交易等。 实际上,因为比特币网络中存在大量(据估计数千个)的维护节点,而且大部分节点都是正常工作的,默认都只承认所看到的最长的链结构。只要网络中不存在超过一半的节点提前勾结一起采取恶意行动,则最长的链将很大概率上成为最终合法的链。而且随着时间增加,这个概率会越来越大。例如,经过 6 个区块生成后,即便有一半的节点联合起来想颠覆被确认的结果,其概率也仅为 (1/2)^6 ≈ 1.6%,即低于 1/60 的可能性。 当然,如果整个网络中大多数的节点都联合起来作恶,可以导致整个系统无法正常工作。要做到这一点,往往意味着付出很大的代价,跟通过作恶得到的收益相比,得不偿失。 注:区块链结构,与 Git 版本管理的有向无环图数据结构,在设计上有异曲同工之妙。 2.技术的演化与分类 区块链技术自比特币网络设计中被大家发掘关注,从最初服务数字货币系统,到今天在分布式账本场景下发挥着越来越大的技术潜力。 区块链的演化 比特币区块链已经支持了简单的脚本计算,但仅限于数字货币相关的处理。除了支持数字货币外,还可以将区块链上执行的处理过程进一步泛化,即提供智能合约(Smart Contract)。智能合约可以提供除了货币交易功能外更灵活的合约功能,执行更为复杂的操作。 这样扩展之后的区块链,已经超越了单纯数据记录的功能了,实际上带有点“智能计算”的意味了;更进一步地,还可以为区块链加入权限管理,高级编程语言支持等,实现更强大的、支持更多商用场景的分布式账本。 从计算特点上,可以看到现有区块链技术的三种典型演化场景: 场景 功能 智能合约 一致性 权限 类型 性能 编程语言 代表 公信的数字货币 记账功能 不带有或较弱 PoW 无 公有链 较低 简单脚本 比特币网络 公信的交易处理 智能合约 图灵完备 PoW、PoS 无 公有链 受限 特定语言 以太坊网络 带权限的分布式账本处理…
分布式系统 万法皆空,因果不空。 随着摩尔定律碰到瓶颈,越来越多的系统要依靠分布式集群架构来实现海量数据处理和可扩展计算能力。 区块链首先是一个分布式系统。 中央式结构改成分布式系统,碰到的第一个问题就是一致性的保障。 很显然,如果一个分布式集群无法保证处理结果一致的话,那任何建立于其上的业务系统都无法正常工作。 本文将介绍分布式系统中一些核心问题的来源以及相关的工作。 一致性问题 在分布式系统中,一致性(Consistency,早期也叫 Agreement)是指对于系统中的多个服务节点,给定一系列操作,在协议(往往通过某种共识算法)保障下,试图使得它们对处理结果达成某种程度的一致。 如果分布式系统能实现“一致”,对外就可以呈现为一个功能正常的,且性能和稳定性都要好很多的“虚处理节点”。 举个例子,某影视公司旗下有西单和中关村的两个电影院,都出售某电影票,票一共就一万张。那么,顾客到达某个电影院买票的时候,售票员该怎么决策是否该卖这张票,才能避免超售呢?当电影院个数更多的时候呢? 这个问题在人类世界中,看起来似乎没那么难,你看,英国人不是刚靠 投票 达成了“某种一致”吗? 注意:一致性并不代表结果正确与否,而是系统对外呈现的状态一致与否,例如,所有节点都达成失败状态也是一种一致。 挑战 在实际的计算机集群系统(看似强大的计算机系统,很多地方都比人类世界要脆弱的多)中,存在如下的问题: 节点之间的网络通讯是不可靠的,包括任意延迟和内容故障; 节点的处理可能是错误的,甚至节点自身随时可能宕机; 同步调用会让系统变得不具备可扩展性。 要解决这些挑战,愿意动脑筋的读者可能会很快想出一些不错的思路。 为了简化理解,仍然以两个电影院一起卖票的例子。可能有如下的解决思路: 每次要卖一张票前打电话给另外一家电影院,确认下当前票数并没超售; 两家电影院提前约好,奇数小时内一家可以卖票,偶数小时内另外一家可以卖; 成立一个第三方的存票机构,票都放到他那里,每次卖票找他询问; 更多…… 这些思路大致都是可行的。实际上,这些方法背后的思想,将可能引发不一致的并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题的基础思路和唯一秘诀。只是因为计算机系统比较傻,需要考虑得更全面一些;而人们又希望计算机系统能工作的更快更稳定,所以算法需要设计得再精巧一些。 要求 规范的说,理想的分布式系统一致性应该满足: 可终止性(Termination):一致的结果在有限时间内能完成; 共识性(Consensus):不同节点最终完成决策的结果应该相同; 合法性(Validity):决策的结果必须是其它进程提出的提案。 第一点很容易理解,这是计算机系统可以被使用的前提。需要注意,在现实生活中这点并不是总能得到保障的,例如取款机有时候会是“服务中断”状态,电话有时候是“无法连通”的。 第二点看似容易,但是隐藏了一些潜在信息。算法考虑的是任意的情形,凡事一旦推广到任意情形,就往往有一些惊人的结果。例如现在就剩一张票了,中关村和西单的电影院也分别刚确认过这张票的存在,然后两个电影院同时来了一个顾客要买票,从各自“观察”看来,自己的顾客都是第一个到的……怎么能达成结果的共识呢?记住我们的唯一秘诀:核心在于需要把两件事情进行排序,而且这个顺序还得是大家都认可的。 第三点看似绕口,但是其实比较容易理解,即达成的结果必须是节点执行操作的结果。仍以卖票为例,如果两个影院各自卖出去一千张,那么达成的结果就是还剩八千张,决不能认为票售光了。 带约束的一致性 做过分布式系统的读者应该能意识到,绝对理想的强一致性(Strong Consistency)代价很大。除非不发生任何故障,所有节点之间的通信无需任何时间,这个时候其实就等价于一台机器了。实际上,越强的一致性要求往往意味着越弱的性能。 一般的,强一致性(Strong Consistency)主要包括下面两类: 顺序一致性(Sequential Consistency):Leslie Lamport 1979 年经典论文《How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs》中提出,是一种比较强的约束,保证所有进程看到的 全局执行顺序(total order)一致,并且每个进程看自身的执行(local order)跟实际发生顺序一致。例如,某进程先执行 A,后执行 B,则实际得到的全局结果中就应该为 A 在 B 前面,而不能反过来。同时所有其它进程在全局上也应该看到这个顺序。顺序一致性实际上限制了各进程内指令的偏序关系,但不在进程间按照物理时间进行全局排序。 线性一致性(Linearizability Consistency):Maurice P. Herlihy 与 Jeannette M. Wing 在 1990 年经典论文《Linearizability: A Correctness Condition for Concurrent Objects》中共同提出,在顺序一致性前提下加强了进程间的操作排序,形成唯一的全局顺序(系统等价于是顺序执行,所有进程看到的所有操作的序列顺序都一致,并且跟实际发生顺序一致),是很强的原子性保证。但是比较难实现,目前基本上要么依赖于全局的时钟或锁,要么通过一些复杂算法实现,性能往往不高。 目前,高精度的石英钟的漂移率为,人类目前最准确的原子震荡时钟的漂移率为。Google 曾在其分布式数据库 Spanner 中采用基于原子时钟和 GPS 的“TrueTime”方案,能够将不同数据中心的时间偏差控制在 10ms 以内。方案简单粗暴而有效,但存在成本较高的问题。 强一致的系统往往比较难实现。很多时候,人们发现实际需求并没有那么强,可以适当放宽一致性要求,降低系统实现的难度。例如在一定约束下实现所谓最终一致性(Eventual Consistency),即总会存在一个时刻(而不是立刻),系统达到一致的状态,这对于大部分的 Web 系统来说已经足够了。这一类弱化的一致性,被笼统称为弱一致性(Weak Consistency)。 莫非分布式领域也有一个测不准原理?这个世界为何会有这么多的约束呢? 共识算法 实际上,要保障系统满足不同程度的一致性,往往需要通过共识算法来达成。 共识算法解决的是对某个提案(Proposal),大家达成一致意见的过程。提案的含义在分布式系统中十分宽泛,如多个事件发生的顺序、某个键对应的值、谁是领导……等等,可以认为任何需要达成一致的信息都是一个提案。 注:实践中,一致性的结果往往还需要客户端的特殊支持,典型地通过访问足够多个服务节点来验证确保获取共识后结果。…
0.比特币 —— 区块链思想诞生的摇篮 之所以看得更远,是因为站在了巨人的肩膀上。 作为区块链思想诞生的源头,比特币项目值得区块链技术爱好者们仔细研究。 比特币网络是首个得到大规模部署的区块链技术应用,并且是首个得到实践检验的数字货币实现,无论在信息技术历史还是在金融学历史上都具有十分重要的意义。比特币项目在诞生和发展过程中,借鉴了来自数字货币、密码学、博弈论、分布式系统、控制论等多个领域的技术成果,可谓博采众家之长于一身。 虽然后来的区块链技术应用已经远超越了数字货币的范畴,但探索比特币项目的发展历程和设计思路,对于深刻理解区块链技术的来龙去脉有着重要的价值。 本文将介绍比特币项目的来源、核心原理设计、相关的工具,以及关键的技术话题。 1.比特币项目简介 图  比特币项目 比特币(BitCoin,BTC)是基于区块链技术的一种数字货币实现;比特币网络是历史上首个经过大规模长时间检验的数字货币系统。 自 2009 年正式上线以来,比特币价格经历了数次的震荡,目前每枚比特币市场价格超过 2500 美金。比特币网络中总区块数接近 48 万个。 比特币网络在功能上具有如下特点: 去中心化:意味着没有任何独立个体可以对网络中交易进行破坏,任何交易请求都需要大多数参与者的共识; 匿名性:比特币网络中账户地址是匿名的,无法从交易信息关联到具体的个体,但这也意味着很难进行审计; 通胀预防:比特币的发行需要通过挖矿计算来进行,发行量每四年减半,总量上限为 2100 万枚,无法被超发。 下图来自 blockchain.info 网站,可以看到比特币字诞生以来的汇率(以美元为单位)变化历史。 图 1.9.1.2 – 比特币汇率历史 比特币大事记 2008 年 11 月 1 日 19:16:33,中本聪在 metzdowd 的加密技术邮件列表发布比特币白皮书:《Bitcoin: A Peer-to-Peer Electronic Cash System》(《比特币:一种点对点的电子现金系统》)。 2009 年 1 月 3 日 18:15:05,中本聪在位于芬兰赫尔辛基(Helsinki)的一个小型服务器上挖出了第一批 50 个比特币,并记录下当天泰晤士报的头版标题:“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks(财政大臣考虑再次紧急援助银行危机)”。第一个区块被称为创世区块或初始区块(Genesis Block),可以通过 https://blockchain.info/block-index/14849 查看其详细内容。 2010 年 5 月 21 日,第一次比特币交易:佛罗里达程序员 Laszlo Hanyecz 用 1 万 BTC 购买了价值 25 美元的披萨优惠券。这是比特币的首个兑换汇率:1: 0.0025 美金。这些比特币在今日价值超过 8000 万美金。 2010 年 7 月 17 日,第一个比特币交易平台成立。 2011 年 4 月,首个有官方正式记载的版本 0.3.21 发布,支持普通用户参与到…
0.Hyperledger – 超级账本项目 Uneasy lies the head that wears a crown. Hyperledger 项目是首个面向企业的开放区块链技术的重要探索。在 Linux 基金会的支持下,吸引了包括 IBM、Intel、摩根等在内的众多科技和金融巨头的参与。 本文将介绍 Hyperledger 项目的历史,并以核心的 fabric 项目为例,讲解如何快速安装部署和应用区块链系统。 1.诞生与发展 历史 区块链已经成为当下最受人关注的开源技术,有人说它将颠覆金融行业的未来。然而对很多人来说,区块链技术难以理解和实现,而且缺乏统一的规范。 2015 年 12 月,开源世界的旗舰——Linux 基金会牵头,联合 30 家初始企业成员(包括 IBM、Accenture、Intel、J.P.Morgan、R3、DAH、DTCC、FUJITSU、HITACHI、SWIFT、Cisco 等),共同 宣告 了 Hyperledger 项目的成立。该项目试图打造一个透明、公开、去中心化的分布式账本项目,作为区块链技术的开源规范和标准,让更多的应用能更容易的建立在区块链技术之上。项目官方信息网站在 hyperledger.org, 图 1.11.1.1 – Hyperledger 项目快速成长 目前已经有超过 120 家全球知名企业和机构(大部分均为各自行业的领导者)宣布加入 Hyperledger 项目,其中包括 30 家来自中国本土的企业,包括艾亿新融旗下的艾亿数融科技公司(2016.05.19)、Onchain(2016.06.22)、比邻共赢(Belink)信息技术有限公司(2016.06.22)、BitSE(2016.06.22)、布比(2016.07.27)、三一重工(2016.08.30)、万达金融(2016.09.08)、华为(2016.10.24)等。 如果说以比特币为代表的货币区块链技术为 1.0,以以太坊为代表的合同区块链技术为 2.0,那么实现了完备的权限控制和安全保障的 Hyperledger 项目毫无疑问代表着 3.0 时代的到来。 IBM 贡献了数万行已有的 Open Blockchain 代码,Digital Asset 则贡献了企业和开发者相关资源,R3 贡献了新的金融交易架构,Intel 也刚贡献了跟分布式账本相关的代码。 Hyperledger 社区由技术委员会(Technical Steering Committee,TSC)指导,首任主席由来自 IBM 开源技术部 CTO 的 Chris Ferris 担任,管理组主席则由来自 Digital Asset Holdings 的 CEO Blythe Masters 担任。另外,自 2016 年 5 月起,Apache 基金会创始人 Brian Behlendorf 担任超级账本项目的首位执行董事。2016 年 12 月,中国技术工作组 正式成立,负责本土社区组织和技术引导工作。官方网站也提供了十分详细的 组织结构信息。 该项目的出现,实际上宣布区块链技术已经不再是仅面向“社会实验”性质的应用场景,它已经正式被主流机构和企业市场认可;同时,Hyperledger 首次提出和实现的完备权限管理、创新的一致性算法和可拔插、可扩展的框架,对于区块链相关技术和产业的发展都将产生深远的影响。…

关注我们的公众号

微信公众号