物数链,是融合物联网万物互联理论与区块链技术,致力于打造一个万物互联的大数据区块链。传统物联网运行平台采用中心化技术,不管在数据采集或运行上都基于物联网参与的任何一方都是尽职尽责的前提,由于信任机制发展缓慢,严重阻碍了物联网市场的发展。。针对物联网过程中出现的问题,物数链重点围绕区块链技术应用于物联网行业所面临的数据获取、数据并发、数据并存问题,结合区块链—物联网—大数据,构建新一代物联网体系架构。
物数链将物联网参与方在每一个环节的数据加以储存,实现资产化转化。同时,物数链借助区块链的特点,为基础数据建立了一个基于技术的信任体系。在物数链中,由于具有不可篡改性和可追溯性,参与者对于交易公平机制有绝对的信任,保障了交易的正常运行。
物数链与区块链技术高度耦合
1 物数链
物数链的目的是基于链上元协议(on-chain meta-protocol)、脚本、智能合约、跨链协同、分布式储存概念进行整合和提高,使得开发者能够创建任意的基于共识的、可扩展的、标准化的、特性完备的、易于开发的和协同的数据展现及数据储存平台。通过建立终极的抽象的基础层-内置有图灵完备编程语言的区块链-使得任何人都能够创建合约和去中心化应用,并在其中设立他们自由定义的所有权规则、交易方式和状态转换函数。
2 物数链账户
在账户系统中,状态是由被称为“账户”(每个账户由一个 20 字节的地址)的对象和在两个账户之间转移价值和信息的状态转换构成的。LDBC 的账户包含四个部分:
• 随机数,用于确定每笔交易只能被处理一次的计数器
• 账户目前的余额
• 账户的合约代码
• 账户的存储(默认为空)
LDBC 是物数链内部的主要加密燃料,用于支付交易费用。一般而言,有两种类型的账户:外部所有的账户(由私钥控制的)和合约账户(由合约代码控制)。
外部所有的账户没有代码,人们可以通过创建和签名一笔交易从一个外部账户发送消息。每当合约账户收到一条消息,合约内部的代码就会被激活,允许它对内部存储进行读取和写入,和发送其它消息或者创建合约。
3 消息和交易
第一,消息可以由外部实体或者合约创建,然而比特币的交易只能从外部创建。第二,消息可以选择包含数据。第三,如果消息的接受者是合约账户,可以选择进行回应,这意味着物数链消息也包含函数概念。
物数链中“交易”是指存储从外部账户发出的消息的签名数据包。交易包含消息的接收者、用于确认发送者的签名、币账户余额、要发送的数据和两个被称为STARTGAS 和 GASPRICE 的数值。为了防止代码的指数型爆炸和无限循环,每笔交易需要对执行代码所引发的计算步骤-包括初始消息和所有执行中引发的消息-做出限制。STARTGAS 就是限制,GASPRICE 是每一计算步骤需要支付矿工的费用。如果执行交易的过程中,“用完了燃料”,所有的状态改变恢复原状态,但是已经支付的交易费用不可收回了。如果执行交易中止时还剩余燃料,那么这些燃料将退还给发送者。创建合约有单独的交易类型和相应的消息类型;合约的地址是基于账号随机数和交易数据的哈希计算出来的。
消息机制的一个重要后果是物数链的“头等公民”财产-合约与外部账户拥有同样权利,包括发送消息和创建其它合约的权利。这使得合约可以同时充当多个不同的角色,例如,用户可以使去中心化组织(一个合约)的一个成员成为一个中介账户(另一个合约),为一个偏执的使用定制的基于量子证明的兰波特签名(第三个合约)的个人和一个自身使用由五个私钥保证安全的账户(第四个合约)的共同签名实体提供居间服务。物数链不需要关心合约的每一参与方是什么类型的账户。
4 物数链状态转换函数
物数链状态转换函数:APPLY(S,TX) -》 S’,可以定义如下:
1 检查交易的格式是否正确(即有正确数值)、签名是否有效和随机数是否与发送者账户的随机数匹配。如否,返回错误。
2 计算交易费用:fee=STARTGAS * GASPRICE,并从签名中确定发送者的地址。从发送者的账户中减去交易费用和增加发送者的随机数。如果账户余额不足,返回错误。
3 设定初值 GAS = STARTGAS,并根据交易中的字节数减去一定量的燃料值。
4 从发送者的账户转移价值到接收者账户。如果接收账户还不存在,创建此账户。如果接收账户是一个合约,运行合约的代码,直到代码运行结束或者燃料用完。
5 如果因为发送者账户没有足够的钱或者代码执行耗尽燃料导致价值转移失败,恢复原来的状态,但是还需要支付交易费用,交易费用加至矿工账户。
6 否则,将所有剩余的燃料归还给发送者,消耗掉的燃料作为交易费用发送给矿工。
例如,假设合约的代码如下:
if !contract.storage[msg.data[0]]:
contract.storage[msg.data[0]] = msg.data[1]
需要注意的是,在现实中合约代码是用底层虚拟机代码写成的。假设合约存储器开始时是空的,一个值为 10 个币,燃料为 2000,燃料价格为 0.001 个币并且两个数据字段值为[ 2, ‘CHARLIE’ ] [3]的交易发送后,状态转换函数的处理过程如下:
1 检查交易是否有效、格式是否正确。
2 检查交易发送者至少有 2000*0.001=2 个币。如果有,从发送者账户中减去 2个币。
3 初始设定 gas=2000,假设交易长为 170 字节,每字节的费用是 5,减去 850,所以还剩 1150。
4 从发送者账户减去 10 个币,为合约账户增加 10 个币。
5 运行代码。在这个合约中,运行代码很简单:它检查合约存储器索引为 2 处是否已使用,注意到它未被使用,然后将其值置为 CHARLIE。假设这消耗了 187 单位的燃料,于是剩余的燃料为 1150 – 187 = 963。
6. 向发送者的账户增加 963*0.001=0.963 个币,返回最终状态。
如果没有合约接收交易,那么所有的交易费用就等于 GASPRICE 乘以交易的字节长度,交易的数据就与交易费用无关了。另外,需要注意的是,合约发起的消息可以对它们产生的计算分配燃料限额,如果子计算的燃料用完了,它只恢复到消息发出时的状态。因此,就像交易一样,合约也可以通过对它产生的子计算设置严格的限制,保护它们的计算资源。
5 代码执行
物数链合约的代码使用低级的基于堆栈的字节码的语言写成的,被称为“物数链虚拟机代码”。代码由一系列字节构成,每一个字节代表一种操作。一般而言,代码执行是无限循环,程序计数器每增加一(初始值为零)就执行一次操作,直到代码执行完毕或者遇到错误,STOP 或者 RETURN 指令。操作可以访问三种存储数据的空间:
●堆栈,一种后进先出的数据存储,32 字节的数值可以入栈,出栈。
●内存,可无限扩展的字节队列。
●合约的长期存储,一个秘钥/数值的存储,其中秘钥和数值都是 32 字节大小,与计算结束即重置的堆栈和内存不同,存储内容将长期保持。
代码可以象访问区块头数据一样访问数值,发送者和接受到的消息中的数据,代码还可以返回数据的字节队列作为输出。
虚拟机代码的正式执行模型令人惊讶地简单。当物数链虚拟机运行时,它的完整的计算状态可以由元组(block_state, transaction, message, code, memory, stack, pc, gas)来定义,这里 block_state 是包含所有账户余额和存储的全局状态。每轮执行时,通过调出代码的第 pc(程序计数器)个字节,当前指令被找到,每个指令都有定义自己如何影响元组。例如,ADD 将两个元素出栈并将它们的和入栈,将 gas(燃料)减一并将 pc 加一,SSTORE 将顶部的两个元素出栈并将第二个元素插入到由第一个元素定义的合约存储位置,同样减少最多 200 的 gas 值并将 pc 加一,虽然有许多方法通过即时编译去优化,但物数链的基础性的实施可以用几百行代码实现。
6 区块链和挖矿
虽然有一些不同,但物数链的区块链在很多方面类似于比特币区块链。它们的区块链架构的不同在于,物数链区块不仅包含交易记录和最近的状态,还包含区块序号和难度值。物数链中的区块确认算法如下:
1 检查区块引用的上一个区块是否存在和有效。
2 检查区块的时间戳是否比引用的上一个区块大,而且小于 2 分钟。
3 检查区块序号、难度值、 交易根,叔根和燃料限额(许多以太坊特有的底层概念)是否有效。
4 检查区块的工作量证明是否有效。
5 将 S[0]赋值为上一个区块的 STATE_ROOT。
6 将 TX 赋值为区块的交易列表,一共有 n 笔交易。对于属于 0……n-1 的 i,进行状态转换 S[i+1] = APPLY(S[i],TX[i])。如果任何一个转换发生错误,或者程序执行到此处所花费的燃料(gas)超过了 GASLIMIT,返回错误。
7 用 S[n]给 S_FINAL 赋值, 向矿工支付区块奖励。
8 检查 S-FINAL 是否与 STATE_ROOT 相同。如果相同,区块是有效的。否则,区块是无效的。
物数链确认效率远超比特币相提并论。原因是状态存储在树结构中(tree structure),每增加一个区块只需要改变树结构的一小部分。因此,一般而言,两个相邻的区块的树结构的大部分应该是相同的,因此存储一次数据,可以利用指针(即子树哈希)引用两次。一种被称为“帕特里夏树”(“Patricia Tree”)的树结构可以实现这一点,其中包括了对默克尔树概念的修改,不仅允许改变节点,而且还可以插入和删除节点。
应用一般来讲,物数链之上一个完美的例子是为解决物流信息共享问题而设的自我强制悬赏。通过独创的环形计算(annular calculate)将数据分享做成一个标准化共识,改进区块链的识别和共识奖励。
7 改进版幽灵协议
幽灵协议提出的动机是当前快速确认的块链因为区块的高作废率而受到低安全性困扰;因为区块需要花一定时间(设为 t)扩散至全网,如果矿工 A 挖出了一个区块然后矿工 B 碰巧在 A 的区块扩散至 B 之前挖出了另外一个区块,矿工 B 的区块就会作废并且没有对网络安全作出贡献。此外,这里还有中心化问题:如果 A 是一个拥有全网 30%算力的矿池而 B 拥有 10%的算力,A 将面临 70%的时间都在产生作废区块的风险而 B 在 90%的时间里都在产生作废区块。因此,如果作废率高,A 将简单地因为更高的算力份额而更有效率,综合这两个因素,区块产生速度快的块链很可能导致一个矿池拥有实际上能够控制挖矿过程的算力份额。通过在计算哪条链“最长”的时候把废区块也包含进来,幽灵协议解决了降低网络安全性的第一个问题;这就是说,不仅一个区块的父区块和更早的祖先块,祖先块的作废的后代区块也被加进来以计算哪一个区块拥有支持其的最大工作量证明。物数链付给以“叔区块”身份为新块确认作出贡献的废区块 87.5%的奖励,把它们纳入计算的“侄子区块” 将获得奖励的 12.5%,不过,交易费用不奖励给叔区块。
物数链实施了一个只下探到第五层的简化版本的幽灵协议。其特点是,废区块只能以叔区块的身份被其父母的第二代至第五代后辈区块,而不是更远关系的后辈区块(例如父母区块的第六代后辈区块,或祖父区块的第三代后辈区块)纳入计算。这样做有几个原因。首先,无条件的幽灵协议将给计算给定区块的哪一个叔区块合法带来过多的复杂性。其次,带有物数链所使用的补偿的无条件的幽灵协议剥夺了矿工在主链而不是一个公开攻击者的链上挖矿的激励。最后,计算表明带有激励的五层幽灵协议即使在出块时间为 15s 的情况下也实现了了 95%以上的效率,而拥有 25%算力的矿工从中心化得到的益处小于 3%。
费用因为每个发布到区块链的交易都占用了下载和验证的成本,需要有一个包括交易费的规范机制来防范滥发交易。比特币使用的默认方法是纯自愿的交易费用,依靠矿工担当守门人并设定动态的最低费用。因为这种方法是“基于市场的”,使得矿工和交易发送者能够按供需来决定价格,所以这种方法在比特币社区被很顺利地接受了。然而,这个逻辑的问题在于,交易处理并非一个市场;虽然根据直觉把交易处理解释成矿工给发送者提供的服务是很有吸引力的,但事实上一个矿工收录的交易是需要网络中每个节点处理的,所以交易处理中最大部分的成本是由第三方而不是决定是否收录交易的矿工承担的。于是,非常有可能发生公地悲剧。
然而,当给出一个特殊的不够精确的简化假设时,这个基于市场的机制的漏洞很神奇地消除了自己的影响。论证如下。假设:
1 一个交易带来 k 步操作, 提供奖励 kR 给任何收录该交易的矿工,这里 R 由交易发布者设定, k 和 R 对于矿工都是事先(大致上)可见的。
2 每个节点处理每步操作的成本都是 C (即所有节点的效率一致)。
3 有 N 个挖矿节点,每个算力一致(即全网算力的 1/N)。
4 没有不挖矿的全节点。
当预期奖励大于成本时,矿工愿意挖矿。这样,因为矿工有 1/N 的机会处理下一个区块,所以预期的收益是 kR/N , 矿工的处理成本简单为 kC. 这样当 kR/N 》kC,即 R 》 NC 时。矿工愿意收录交易。注意 R 是由交易发送者提供的每步费用,是矿工从处理交易中获益的下限。 NC 是全网处理一个操作的成本。所以,矿工仅有动机去收录那些收益大于成本的交易。
然而,这些假设与实际情况有几点重要的偏离:
1.因为额外的验证时间延迟了块的广播因而增加了块成为废块的机会,处理交易的矿工比其它的验证节点付出了更高的成本。
2.不挖矿的全节点是存在的。
3.实践中算力分布可能最后是极端不平均的。
4.以破坏网络为己任的投机者,政敌和疯子确实存在,并且他们能够聪明地设置合同使得他们的成本比其它验证节点低得多。
上面第 1 点驱使矿工收录更少的交易,第 2 点增加了 NC; 因此这两点的影响至少部分互相抵消了。 第 3 点和第 4 点是主要问题;作为解决方案我们简单地建立了一个浮动的上限:没有区块能够包含比 BLK_LIMIT_FACTOR 倍长期指数移动平均值更多的操作数。具体地:
blk.oplimit = floor((blk.parent.oplimit * (EMAFACTOR – 1) + floor(parent.opcount* BLK_LIMIT_FACTOR)) /EMA_FACTOR) BLK_LIMIT_FACTOR 和 EMA_FACTOR 是暂且被设为 65536 和 1.5 的常数,但可能会在更深入的分析后调整。
8 计算和图灵完备
需要强调的是物数链虚拟机是图灵完备的; 这意味着虚拟机代码可以实现任何可以想象的计算,包括无限循环。物数链虚拟机代码有两种方式实现循环。首先,JUMP 指令可以让程序跳回至代码前面某处,还有允许如 while x 《 27: x = x * 2 一样的条件语句的 JUMPI 指令实现条件跳转。其次,合约可以调用其它合约,有通过递归实现循环的潜力。这很自然地导致了一个问题:恶意用户能够通过迫使矿工和全节点进入无限循环而不得不关机吗? 这问题出现是因为计算机科学中一个叫停机问题的问题:一般意义上没有办法知道,一个给定的程序是否能在有限的时间内结束运行。
我们的方案通过为每一个交易设定运行执行的最大计算步数来解决问题,如果超过则计算被恢复原状但依然要支付费用。消息以同样的方式工作。为显示这一方案背后的动机,请考虑下面的例子:
一个攻击者创建了一个运行无限循环的合约,然后发送了一个激活循环的交易给矿工,矿工将处理交易,运行无限循环直到燃料耗尽。即使燃料耗尽交易半途停止,交易依然正确(回到原处)并且矿工依然从攻击者哪里挣到了每一步计算的费用。
一个攻击者创建一个非常长的无限循环意图迫使矿工长时间内一直计算致使在计算结束前若干区块已经产生于是矿工无法收录交易以赚取费用。然而,攻击者需要发布一个 STARTGAS 值以限制可执行步数,因而矿工将提前知道计算将耗费过多的步数。
一个攻击者看到一个包含诸如 send(A,contract.storage[A]); contract.storage[A] = 0格式的合约然后发送带有只够执行第一步的费用的而不够执行第二步的交易(即提现但不减少账户余额)。合约作者无需担心防卫类似攻击,因为如果执行中途停止则所有变更都被回复。
一个金融合约靠提取九个专用数据发布器的中值来工作以最小化风险,一个攻击者接管了其中一个数据提供器,然后把这个可变地址调用机制设计成可更改的数据提供器转为运行一个无限循环,以求尝试逼迫任何从此合约索要资金的尝试都会因燃料耗尽而中止。然而,该合约可以在消息里设置燃料限制以防范此类问题。
图灵完备的替代是图灵不完备,这里 JUMP 和 JUMPI 指令不存在并且在某个给定时间每个合约只允许有一个拷贝存在于调用堆栈内。在这样的系统里,上述的费用系统和围绕我们的方案的效率的不确定性可能都是不需要的,因为执行一个合约的成本将被它的大小决定。此外,图灵不完备甚至不是一个大的限制,在我们内部设想的所有合约例子中,至今只有一个需要循环,而且即使这循环也可以被 26 个单行代码段的重复所代替。考虑到图灵完备带来的严重的麻烦和有限的益处,为什么不简单地使用一种图灵不完备语言呢?事实上图灵不完备远非一个简洁的解决方
案。为什么?请考虑下面的合约:
C0: call(C1); call(C1);
C1: call(C2); call(C2);
C2: call(C3); call(C3); …
C49: call(C50); call(C50);
C50: (run one step of a program and record the change in storage)
现在,发送一个这样的交易给 A,这样,在 51 个交易中,我们有了一个需要花费 250 步计算的合约,矿工可能尝试通过为每一个合约维护一个最高可执行步数并且对于递归调用其它合约的合约计算可能执行步数从而预先检测这样的逻辑炸弹,但是这会使矿工禁止创建其它合约的合约(因为上面 26 个合约的创建和执行可以很容易地放入一个单独合约内)。另外一个问题点是一个消息的地址字段是一个变量,所以通常来讲可能甚至无法预先知道一个合约将要调用的另外一个合约是哪一个。于是,最终我们有了一个惊人的结论:图灵完备的管理惊人地容易,而在缺乏同样的控制时图灵不完备的管理惊人地困难- 那为什么不让协议图灵完备呢?
9 挖矿的去中心化
物数链现在的目的是使用一个基于为每 1000 个随机数随机产生唯一哈希的函数的挖矿算法,用足够宽的计算域,去除专用硬件的优势。注意每单个用户使用他们的私人笔记本电脑或台式机就可以几乎免费地完成一定量的挖矿活动,但当到了100%的 CPU 使用率之后更多地挖矿就会需要他们支付电力和硬件成本。ASIC 挖矿公司需要从第一个哈希开始就为电力和硬件支付成本。所以,如果中心化收益能够保持在(E + H) /E 以下,那么即使 ASICs 被制造出来普通矿工依然有生存空间。另外,我们计划将挖矿算法设计成挖矿需要访问整个区块链,迫使矿工存储完成的区块链或者至少能够验证每笔交易。这去除了对中心化矿池的需要;虽然矿池依然可以扮演平滑收益分配的随机性的角色,但这功能可以被没有中心化控制的 P2P 矿池完成地同样好。这样即使大部分普通用户依然倾向选择轻客户端,通过增加网络中的全节点数量也有助于抵御中心化。
10 扩展性
扩展性问题是常被关注的地方,与比特币一样,物数链也遭受着每个交易都需要网络中的每个节点处理这一困境的折磨。比特币的当前区块链大小约为 20GB,以每小时 1MB 的速度增长。如果比特币网络处理 Visa 级的 2000tps 的交易,它将以每三秒 1MB 的速度增长(1GB 每小时,8TB 每年)。物数链可能也会经历相似的甚至更糟的增长模式,因为在物数链之上还会有很多应用,而不是像比特币只是简单的货币,但物数链全节点只需存储状态而不是完整的区块链历史这一事实让情况得到了改善。
大区块链的问题是中心化风险。如果块链大小增加至比如 100TB,可能的场景将是只有非常小数目的大商家会运行全节点,而常规用户使用轻的 SPV 节点。这会增加对全节点合伙欺诈牟利(例如更改区块奖励,给他们自己 BTC)的风险的担忧。轻节点将没有办法立刻检测到这种欺诈。当然,至少可能存在一个诚实的全节点,并且几个小时之后有关诈骗的信息会通过 Reddit 这样的渠道泄露,但这时已经太晚:任凭普通用户做出怎样的努力去废除已经产生的区块,他们都会遇到与发动一次成功的 51%攻击同等规模的巨大的不可行的协调问题。物数链会使用两个附加的策略以应对此问题。首先,因为基于区块链的挖矿算法,至少每个矿工会被迫成为一个全节点,这保证了一定数量的全节点。其次,更重要的是,处理完每笔交易后,我们会把一个中间状态树的根包含进区块链。即使区块验证是中心化的,只要有一个诚实的验证节点存在,中心化的问题就可以通过一个验证协议避免。如果一个矿工发布了一个不正确的区块,这区块要么是格式错,要么状态 S[n]是错的。因为 S[0]是正确的,必然有第一个错误状态 S[i]但 S[i-1]是正确的,验证节点将提供索引 i,一起提供的还有处理 APPLY(S[i-1],TX[i]) -》 S[i]所需的帕特里夏树节点的子集。这些节点将受命进行这部分计算,看产生的 S[i]与先前提供的值是否一致。另外,更复杂的是恶意矿工发布不完整区块进行攻击,造成没有足够的信息去确定区块是否正确。解决方案是质疑-回应协议:验证节点对目标交易索引发起质疑,接受到质疑信息的轻节点会对相应的区块取消信任,直到另外一个矿工或者验证者提供一个帕特里夏节点子集作为正确的证据。
11 综述
去中心化应用上述合约机制使得任何一个人能够在一个虚拟机上建立通过全网共识来运行命令行应用(从根本上来说是),它能够更改一个全网可访问的状态作为它的“硬盘”。然而,对于多数人来说,用作交易发送机制的命令行接口缺乏足够的用户友好使得去中心化成为有吸引力的替代方案。最后,一个完整的“去中心化应用”应该包括底层的商业逻辑组件和上层的图形用户接口组件。物数链客户端被设计成一个网络浏览器,但包括对“LDBC” Javascript API 对象的支持,可被客户端里看到的特定的网页用来与物数链交互。从“传统”网页的角度看来,这些网页是完全静态的内容,因为区块链和其它去中心化协议将完全代替服务器来处理用户发起的请求。最后,去中心化协议有希望自己利用某种方式使用 LDBC 来存储网页。
12 结论
物数链协议围绕去物流数据分享去中心化存储,去中心化计算以及数十个类似概念建立的协议和去中心化应用,有潜力从根本上提升物流行业的效率,并通过首次添加经济层为其它的 P2P 协议提供有力支撑,最终,同样会有大批与金钱毫无关系的应用出现。
物数链协议实现的任意状态转换概念提供了一个具有独特潜力的平台;与封闭式的,为诸如数据存储,或金融等单一目的设计的协议不同,从设计上是开放式的,并且我们相信它极其适合作为基础层服务于在将来的年份里出现的极其大量的物流行业和非行业协议。
评论
查看更多