Continue...

The thinking of project about FISCO BCOS

此篇博文以笔者参与的项目为背景进行编写,内容包括但不限于联盟链( FISCO-BCOS )在对该项目的业务与其技术实现中发挥的作用。在本文中笔者会多次引用到与业务或FISCO-BCOS的相关名词,若有疑问可查看本文引用的文章链接进行查看。以下内容为个人看法及观点,可能出现因考虑不足或经验缺乏导致的错误,若读者朋友发现任何问题及有任何疑问,还请不吝指教,我们共同探讨与进步,谢谢。 FISCO-BCOS能解决的实际问题 如何发挥区块链的优势,在链上编写自己的业务逻辑 使用SDK,让业务系统与区块链进行交互 在此项目前笔者更多的会关注公链,具体来说就是Ethereum,也着手写过一些Solidity智能合约,了解一些底层的技术实现。对联盟链的认知与“玩法”也只停留在听过像Fabric,R3等项目名词而已。那么通过这次机会熟悉了另一联盟链——FISCO-BCOS,关于其更多介绍可在文章引用链接部分查看。 项目面临的问题和其解决之道 首先简单介绍项目(下面简称项目A),以便为下文做铺垫。项目A主要解决在无第三方机构储存个人明文资料的情况下,对这些个人资料做验证,保证其真实性以及没有被篡改。 众所周知,在中国大陆有许多类似学信网这样的网站由政府持有,作为储存个人资料和提供查询服务的第三方服务机构,这样的第三方服务机构储存了大量个人信息资料的网站。在笔者所参与的项目,其落地的区域隐私保护条例相对严格,在一些情况下,连政府机构也不允许随意流转与储存个人资料,那如何解决资料接收方查实资料真伪的问题呢? FISCO-BCOS提供了这样的一个解决方案,在资料的拥有方与资料的查证方之间搭建起一个区块链网络,各方拥有各自的区块链节点,链上存储资料credential。资料的拥有方通过节点发布资料credential,资料查证方通过节点使用链下接收到的明文资料向区块链查询真伪,比对credential后即可知道查证方收到的资料是否与资料拥有方拥有的资料一致。 在这个过程中,不存在有三方机构对资料的明文进行存储,也能确保资料的真实性。下面笔者针对项目A所涉及的业务,结合 FISCO-BCOS 提供的开源方案(1.提供链底层;2.提供一套智能合约作为链上的业务逻辑控制)进行分析与介绍。 在这里要注意的是,在链下传输证书明文时需注意安全问题,针对该项目的安全实施方式在此我就不详细展开,读者可以根据自己业务流程建立相应的安全机制。 链上的业务逻辑——智能合约 本文是以区块链应用层面展开描述,至于FISCO-BCOS提供的区块链底层支持细节,可以在参考资料[1]FISCO-BCOS查看。 笔者会以大笔篇幅来详述这一章节,以笔者角度来解析相关代码。这一套智能合约设计流程和相关描述可查看参考资料[2]。在阅读本章节前还应了解链上各机构扮演的角色及其作用参考资料[3]。 笔者会结合这些资料与读者一同解析代码,如果有错误的地方,欢迎在评论区提出。另, 读者在阅读此章节若具备智能合约相关知识,阅读起来会相对轻松。 FISCO-BCOS 与Ethereum的智能合约都使用Solidity编写,由于Solidity也是由于Ethereum才出现在大众的视野里,所以本文多处会提到Ethereum。 请忽略图1列表中的红色下划波浪线,笔者先从权限控制功能的智能合约开始,再解析业务相关的智能合约部分。 权限控制部分 RoleController.sol 笔者从RoleController.sol开始解析,该合约保存了WeID相应的角色,并可从各角色中移除、添加WeID。下文如未特指某WeID表示为个人,WeID均默认表示为链上机构。...

Continue reading...

哥尼斯堡七桥问题

要求:现在你要找出走遍七座桥的方法。但是必须遵守以下条件: 走过的桥不可再走 可以经过同一陆地 可以以任一陆地为起点 不需回到原点 若能走遍七座桥,请说明方法。若不能,也请给出证明。 其实这就是“一笔画”的问题,意思就是从下笔开始,所画的线要经过每一块陆地,笔画不能出现间断。用图2的方法发现最后也到达不了g桥。读者们也可以多多画一下,尝试一下。最后发现根本不可能走遍七座桥,但是我们要证明出来。因为或许有方法只是我们没有想到而已。 我们考虑将问题简化一下,因为每次使用上图来进行试验以及问题的思考其实是相对麻烦的。这种图形化的“链接方式”称作“图”(Graph)。 在图3中,用白色的圈来表示陆地A、B、C、D,我们成为“顶点”。用顶点之间的连线来表示桥a、b、c、d、e、f、g,我们称其为“边”。 顶点所关联的边数称其为“度数”。 度数为偶数的点称为“偶点”,度数为奇数的点称为“奇点”。接下来顺着图中的边走,在经过的边的端点出打上钩,并减去顶点的度数。我们将此称为“边走边减”。 目前不关心具体是从哪里开始的,经过的路径,只看顺着边走的时候顶点的度数是如何变化的。出发时,起点的度数减1。 途中经过每一个顶点时,该顶点的度数减2,因为经过了“入口边”和“出口边”。 每次经过顶点,顶点的度数都会减2。因此不管经过顶点多少次,经过的顶点的奇偶性不会变,即奇点还是奇点,偶点还是偶点。 到达终点时,该顶点的度数减1。 我们假设如此“完成了一笔画”,那么可能出现一下两种情况。 (1)起点和终点相同的情况    一笔画成,也就意味着“边走边减”的结果是所有顶点的度数变为0(偶数)。为什么?因为如果还存在不为0的顶点,那么也就存在没经过的边。    经过“边走边减”之后,经过的顶点的奇偶性不变。由此我们可知度数变为0(偶数)的经过点,在原图中本身就是偶点。    此外,起点度数减1,终点度数也减1,变为0。然而,起点和终点是同一顶点,所以顶点的度数减2,所以该顶点也成了偶点。    结论,在“起点与终点相同”的一笔画中,图中所有的顶点都是“偶点”。 (2)起点和终点不相同的情况    和(1)的 思路相同,经过的顶点都是偶点,只有起点和终点是奇点。据此,在“起点和终点不同”的一笔画中,图中只有两个“奇点。    至此,可知以下命题是成立的: (如果)“可以画成一笔画” =》“所有顶点都是偶点,或者有2个奇点。” 我们回到哥尼斯堡七桥问题。如果哥尼斯堡的七桥能用一笔画通过的话,应该满足 “ 所有顶点都是偶点,或者有2个奇点 ”。 我们来看看哥尼斯堡七桥(图10)的顶点。如图所示,四个点都是“奇点”。由此证明了在给定条件下不能走遍哥尼斯堡七桥。...

Continue reading...

根据离散函数概率返回int值

笔者在阅读《算法》一书的时候看到这样一道示例题,刚开始没有想清楚,而后结合一些帖子和高数的知识便将算法想要传达的意思想明白了,下边我会从均匀分布函数开始记录笔者思考的过程。 简单回顾均匀分布函数的知识,更多详情资料读者需自行查阅。 均匀分布也叫矩形分布,是指任意相同间隔所对应的概率分布都相等,该分布有两个参数:最小值(a)和最大值(b),缩写为U(a, b)。函数为: 当a=0,b=1时,为标准均匀分布。 对Java语言的Random库,似乎只能产生服从正态分布N(0,1)和均匀分布U(0,1)的随机数,那么如何按照特定的概率生成随机数呢? X 0 1 P(X = x) p 1 – p 容易想到,对于服从均匀分布U(0,1)的随机变量,产生的随机数落在[0,p)的概率就为p, 而落在[p,1)的概率为1−p。 接下来,我们考虑稍微复杂的情况: X 0 1 2 P(X = x)...

Continue reading...

Difference new() with depoly() of Solidity for Smart Contract

今天在做基于Ethereum的古董投资Dapp(编写完成后笔者会开源)单元测试时发觉了一个问题的存在,如题。我不确定new一个合约后返回的实例(一串十六进制的HASH)是否与deploy返回的HASH一样也是一个合约地址,在社区询问后无果,就自己在remix里写了一小段代码验证我的想法。希望能帮助读者解决这方面的困惑。 需要注意的是笔者在remix里的Environment是Injected Web3,使用MetaMask里的Kovan Test Network去完成测试。测试的Token可以在这里领取:https://gitter.im/kovan-testnet/faucet在gitter里发送你的钱包地址即可。下面进入正题: 图1 图1是我编写的一端简易的测试代码。我通过图右边的deploy直接将合约B部署上测试网络,在图左边的合约B代码中读者可以看见new了合约A的实例,那么我的猜想是否正确呢?我们将在测试网络的Ethereum区块链浏览器上看出结果。 图2 如图2,图左最上方的那条Transaction是我直接deploy后返回的结果(点进链接可查看详细内容,下面会详解)。图左下面三条是我new(点击图右下aInstance函数,详细代码看图1)实例后的结果。 图3 图3是点进deploy返回结果的链接显示的页面,图3下面的input Date是合约B的十六进制字节码,如图3所示创建红框里的合约并且返回其合约地址。对比图4、5、6,图4、5、6是new实例的详情。 图4 图5 图6 对比图3、4、5、6可以看出Transaction的对象(红框里的地址)都是同一串HASH,唯一不同的是图3是创建该合约,而其余三张是通过此合约再去创建另一合约(也就是创建新的合约地址)。所以图3没有图4、5、6最上面选项卡Internal Transaction。 图7 图8 图9 点进选项卡Internal Transaction,图7、8、9是new实例对象通过B合约创建的三个新的合约,图7、8、9红框中显示的是三个不同的合约地址。笔者点击图9红框中合约地址可见下图10的该合约的详情。 图10 图11 图10红框中的十六进制字节码与图11中合约A的字节码相同,点击进入图7、8的合约地址看到的字节码与图10、11的字节码也是相同的。即合约B每一次new都为创建合约A创建了新的合约地址,所以图1中Instance就是新的合约地址。与deploy效果一样返回的也是一个合约地址。 若笔者文中存在错误之处,欢迎各位读者指正,共同学习。

Continue reading...

区块链的1.0时代:比特币 – 第5章 交易

5.1 简介 比特币交易是比特币系统中最重要的部分。根据比特币系统的设计原理,系统中任何其他的部分都是为了确保比特币交易可以被生成、能在比特币网络中得以传播和通过验证,并最终添加入全球比特币交易总账簿(比特币区块链)。比特币交易的本质是数据结构,这些数据结构中含有比特币交易参与者价值转移的相关信息。比特币区块链是全球复式记账总账簿,每个比特币交易都是在比特币区块链上的一个公开记录。 在这一章,我们将会剖析比特币交易的多种形式、所包含的信息、如何被创建、如何被验证以及如何成为所有比特币交易永久记录的一部分。 5.2 比特币交易的生命周期 一笔比特币交易的生命周期起始于它被创建的那一刻,也就是诞生(origination)。 随后,比特币交易会被一个或者多个签名加密,这些签名标志着对该交易指向的比特币资金的使用许可。接下来,比特币交易被广播到比特币网络中。在比特币网络中,每一个节点(比特币交易参与者)验证、并将交易在网络中进行广播,直到这笔交易被网络中大多数节点接收。最终,比特币交易被一个挖矿节点验证,并被添加到区块链上一个记录着许多比特币交易的区块中。 一笔比特币交易一旦被记录到区块链上并被足够多的后续区块确认,便成为比特币总账簿的一部分,并被所有比特币交易参与者认可为有效交易。于是,被这笔交易分配到一个新所有者名下的比特币资金可以在新的交易中被使用——这使得所有权链得以延伸且再次开启一个新的比特币交易生命周期。 5.2.1 创建比特币交易 将一笔比特币交易理解成纸质支票或许有助于加深我们对它的理解。与支票相似,一笔比特币交易其实是一个有着货币转移目的的工具,这个工具只有在交易被执行时才会在金融体系中体现,而且交易发起人并不一定是签署该笔交易的人。 比特币交易可以被任何人在线上或线下创建,即便创建这笔交易的人不是这个账户的授权签字人。比如,一个负责应付账款的柜员在处理应付票据时可能会需要CEO签名。相似地,这个负责应付账款的柜员可以创建比特币交易,然后让CEO对它进行数字签名,从而使之有效。一张支票是指定一个特定账户作为资金来源的,但是比特币交易指定以往的一笔交易作为其资金来源,而不是一个特定账户。 一旦一笔比特币交易被创建,它会被资金所有者(们)签名。如果它是合法创建并签名的,则该笔交易现在就是有效的,它包含了转移这笔资金所需要的所有信息。最终,有效的比特币交易必须能接入比特币网络,从而使之能被传送,直至抵达下一个登记在公共总账薄(区块链)的挖矿节点。 5.2.2 将比特币交易传送至比特币网络 首先,一笔交易需要传递至比特币网络,才能被传播,也才能加入区块链中。本质上,一笔比特币交易只是300到400字节的数据,而且它们必须被发送到成千上万个比特币节点中的任意一个。只要发送者能使用多于一个比特币节点来确保这笔交易被传播,那么发送者并不需要信任用来传播该笔交易的单一节点。相应地,这些节点不需要信任发送者,也不用建立发送者的“身份档案”。由于这笔交易是经过签名且不含任何机密信息、私钥或密码,因此它可被任何潜在的便利网络公开地传播。信用卡交易包含敏感信息,而且依赖加密网络连接完成信息传输,但比特币交易可在任意网络环境下被发送。只要这笔交易可以到达能将它广播到比特币网络的比特币节点,这笔交易是如何被传输至第一个节点的并不重要。 比特币交易因此可以通过未加密网络(例如WiFi、蓝牙、NFC、ChirP、条形码或者复制粘贴至一个网页表格)被发送到比特币网络。在一些极端情况下,一笔比特币交易可以通过封包无线电、卫星或短波、扩频或跳频以避免被侦测或阻塞通信的方式进行传输。一笔比特币交易甚至可被编为文字信息中的表情符号并被发表到在线论坛,或被发送成一条短信或一条Skype聊天信息。因为比特币将金钱变成了一种数据结构,所以在本质上是不可能阻止任何人创建并执行比特币交易的。 5.2.3 比特币交易在比特币网络中的传播 一旦一笔比特币交易被发送到任意一个连接至比特币网络的节点,这笔交易将会被该节点验证。如果交易被验证有效,该节点将会将这笔交易传播到这个节点所连接的其他节点;同时,交易发起者会收到一条表示交易成功的返回信息。如果这笔交易被验证为无效,这个节点会拒绝接受这笔交易且同时返回给交易发起者一条表示交易被拒绝的信息。 比特币网络是一个点对点网络,这意味着每一个比特币节点都连接到一些其他的比特币节点(这些其他的节点是在启动点对点协议时被发现的)。整个比特币网络形成了一个松散地连接、且没有固定拓扑或任何结构的“蛛网”——这使得所有节点的地位都是同等的。比特币交易相关信息(包括交易和区块)被传播——从每一个节点到它连接的其他节点。一笔刚通过验证且并被传递到比特币网络中任意节点的交易会被发送到三到四个相邻节点,而每一个相邻节点又会将交易发送到三至四个与它们相邻的节点。以此类推,在几秒钟之内,一笔有效的交易就会像指数级扩散的波一样在网络中传播,直到所有连接到网络的节点都接收到它。 比特币网络被设计为能高效且灵活地传递交易和区块至所有节点的模式,因而比特币网络能抵御入侵。为了避免垃圾信息的滥发、拒绝服务攻击或其他针对比特币系统的恶意攻击,每一个节点在传播每一笔交易之前均进行独立验证。 一个异常交易所能到达的节点不会超过一个。”8.3 交易的独立校验“一节将详细介绍决定比特币交易是否有效的原则。 5.3...

Continue reading...