区块链应用

Nervos CKB为全新的分布式应用网络提供共同知识层

Nervos 来源:区块网 2018-10-29 09:19

共识算法追求在网络延迟和各类节点故障存在的情况下实现两个目标:正确性和性能。正确性又包括一致性(指分布式系统中每一个节点的数据副本完全相同)以及可用性(指分布式系统能够在有限的时间内响应用户的请求)。性能也包括两个方面,一是交易延迟(即从客户端提交Transaction到客户端获得确定性结果所需要的时间,越短越好);二是吞吐量(即系统每秒中可以处理多少笔交易)。
公有链运行在开放的分布式网络中,节点可以自由的加入和退出,在线节点不固定且变更频繁,这些都是传统BFT共识算法很难处理的问题。中本聪(Satoshi Nakamoto)巧妙的引入经济激励以及概率性共识应对这些难点,因此要保证正确性需要额外的开放性与公平性。开放性使共识节点的加入退出无阻碍,无论是有100000个节点还是1个节点,公有链都能正常工作;公平性使共识节点可以获得与所付出的努力成比例的回报。公有链共识算法的性能指标除延迟和吞吐量外,还需要考虑运行开销。
以比特币工作量证明(Proof of Work)为代表的Nakamoto共识拥有极佳的开放性和可用性,比特币网络中的节点可以任意的加入和退出,网络性能随着共识节点数量的增加能够保持不变。但Nakamoto共识吞吐量低,以比特币7笔交易每秒的处理速度,难以消化商业场景的日常需求。即使通过次级通道技术(例如闪电网络)将⼤部分交易转移到链下,通道的建⽴与关闭依然受到链上处理速度的制约,在网络拥堵时甚至会影响到次级通道的安全性。Nakamoto共识以区块投票,交易确认速度慢,通常需要10分钟到一个小时,用户体验不佳。在分区的情况下,比特币网络能够继续提供服务,但交易是否被完全确认无法保证,无法满足对交易确定性要求较⾼的商业场景。
经历了30年发展的传统拜占庭容错(Byzantine Fault Tolerance)共识可以实现媲美中心化系统的吞吐量和交易确认速度,但其开放性不佳,节点动态增减难度⼤,网络性能随参与共识的节点数量增加而迅速下降。传统BFT共识对故障的容忍能力较低,在网络分区时节点无法达成一致,网络无法正常提供服务,难以满足公有链对可用性的要求。
比特币是世界上第一个区块链网络,专门为记录现⾦账本设计。比特币账本是比特币区块链网络维护的系统状态,账本中的最小存储单位是UTXO(未花费的交易输出)。用户可以使用钱包花费现有的UTXO,生成新的UTXO,并将其打包成交易,发送到比特币网络中接受验证和共识。UTXO中记录了⾦额以及表达所有权的锁脚本,用户必须提供相应的解锁数据才能够花费UTXO。由于UTXO数据结构以及比特币脚本能力的限制,我们很难使用比特币账本来记录其他类型的资产和数据,只能通过Color-coin、Meta-coin甚至硬分叉这样的方案来满足不同的场景,实现应用的代价很⾼。
以太坊通过智能合约引入通用性计算,创造出了一个基于智能合约实现的生态。以太坊账本是以太坊区块链网络维护的系统状态,账本由账户构成,账户内部可以存放代码,并提供一个256bits KV数据库存放数据,这样存放了代码的账户就是以太坊智能合约。用户在以太坊上可以发出两种类型的交易:一种交易可以创建合约,将用户编写的应用逻辑部署到区块链上,存放到合约账户中;另一种交易可以将用户提供的输入数据发给指定的合约账户,触发账户所保存的代码的执行,由代码产生更新账户内的KV数据库,产生新的内部状态。以太坊智能合约提供了更强⼤的计算能力以及灵活性,在一定程度上解决了比特币的问题,但依然有其局限性:
性能难扩展:以太坊以状态机事件作为设计中心(图1),交易中包含的是状态机事件输入,而不是状态本身,再加上EVM的图灵完备性,节点在处理交易之前难以判断交易相关性,难以对交易进行并行处理。同时,由于交易中没有包含账本状态,分片时还需要额外解决数据可用性难题。
状态不确定性:合约状态由合约代码更新,而合约代码执行又受执行环境影响(例如被调用合约的当前状态)。因此用户在发起交易时无法完全确定交易执行后的结果。
单体合约(Mono-Contract):以太坊智能合约将计算和存储紧紧绑定,形成一个不可更改的整体。用户必须使用账户模型、EVM字节码以及256bits KV数据库范式来实现所有场景,缺乏效率和灵活性。
现有区块链的经济模型也面临着越来越多的挑战。随着用户和应用的增多,区块链上存储的数据也越来越多。现有的经济模型只考虑计算成本,使得用户产生的数据可以无成本的占用所有节点的存储空间。网络中使用的代币价格波动性极⼤,在代币价格上涨时为应用使用者制造了难以承受的⼿续费负担。

综上,我们重新思考并设计了Nervos CKB,提出彻底解耦的分布式应用新范式,以⽀持更普遍的计算和存储需求,获得更好的性能,使经济激励更平衡,对移动设备更友好。我们希望Nervos CKB可以成为全球76亿⼈的共同知识库,承载各种分布式应用。

Nervos Common Knowledge Base
CKB提出一种全新的分布式应用范式,该范式由以下五种元素组成:
· Cell
· Type
· Validator
· Generator
· Identity
通过这五种元素,我们将分布式应用彻底解耦成计算、存储和身份三个方面。在此基础上,计算进一步分化为生成(Generator)和验证(Validator)两个步骤,存储(Cell)也进一步通用化,可以⽀持任意结构化(Type)的数据。CKB中的分布式应用,可以使用Type定义合适的数据结构,将应用数据存放在多个Cells中;应用的执行逻辑由Generator实现,状态验证逻辑由Validator实现;Generator在客户端运行,用户进行操作时生成新的应用状态,新状态被打包在交易中发送到全网;网络中的节点先验证交易发送者的身份,然后使用Validator对交易中新状态的有效性进行验证,验证通过后将新状态保存到CKB中。
CKB以状态为核心设计数据流及经济激励,交易中包含的是新的状态,而不是触发状态机的事件。因此,CKB区块链中直接保存了状态数据,状态随着区块一起同步,无需额外的状态同步协议,降低了系统复杂度,提⾼了系统可用性。分布式应用的状态被剥离到Cells中保存,Validator和Generator内部没有任何状态,计算结果完全依赖输入,因此都是确定性的纯函数(Pure function),容易组合形成更复杂的逻辑。

1、状态生成和验证
Nervos网络可以使用相同的算法进行状态生成和验证。在这个模型中,客户端使用该算法生成新的状态,节点利用交易中记录的依赖状态作为输入,执行同样的算法,对比输出的状态是否与交易中记录的新状态相同,相同则验证通过。
在使用相同算法的情况下,状态生成和验证只有执行环境的差别,没有计算复杂度的差别。将生成和验证分离,生成转移到客户端执行的好处是:
确定性:交易的确定性是分布式应用的核心诉求之一。交易时延的确定性(Hybrid Consensus)已经得到了⼴泛的重视,但交易结果(即由交易产生的新状态)的确定性却往往被忽视。如果状态在节点生成,用户在发起状态生成请求时无法完全确定请求被执行时的环境,由此可能产生用户不希望的执行结果。在CKB中,由于新的状态由用户生成,由用户完全确定新状态之后再⼴播,交易所能触发的状态变更用户可以完全确定。要么交易通过验证,由用户生成并确认的新状态被接受,要么交易没有通过验证,不造成任何状态改变(图2)。
可并行性:如果状态在节点生成,节点在处理交易前无法判断该交易依赖哪些状态,也就无法判断交易的相关性。在CKB中,由于交易显式地包含了交易依赖的旧状态以及生成的新状态,节点可以直接判断交易之间的相关性(Transaction)。无相关性的交易可以通过各种方式并行处理,包括多核并行及分片。并行处理交易是解决区块链性能扩展问题的关键。
计算分布式程度⾼:充分利用客户端计算资源,减轻节点计算负担,整体效率更⾼。
灵活性:虽然使用相同的算法,但是生成和验证可以使用不同的方法实现。客户端可以灵活选择合适的编程语⾔来实现生成算法,计算效率可以更⾼,生成程序可以无缝集成到运行平台中,提供最好的用户体验。
对于许多特定类型的场景,我们可以找到计算复杂度远低于生成算法的验证算法,最典型的例⼦是UTXO账本和非对称签名。还有其他涉及排序和搜索的算法:平均复杂度最好的排序算法QuickSort的计算复杂度是 O(NlogN) ,而验算排序的复杂度总是只有 O(N) ;如果要搜索一个元素在数组中的位置,在数组已经排好序的情况下计算复杂度为 O(logN) ,而验算的复杂度是 O(1) 。对于越复杂的场景,出现生成与验算复杂度不对称情况的概率更⾼。
在可以利用这种不对称性的情况下,节点处理效率会有极⼤的提升,更多的计算细节只存在于客户端,也更有利于算法保护和隐私保护。随着密码学技术的发展,我们可能会发现为通用问题设计非对称生成和验证算法的方法,例如通用的非交互式零知识证明。CKB的状态生成与验证分离架构也能够为其提供恰到好处的⽀持。

2. Cell
下⽂将对CKB的Cell数据模型及交易数据结构作示意性的描述,目的是更好的解释CKB的功能。在CKB的具体实现中,需要考虑包括激励一致、执行效率在内的其它因素,数据结构会更为复杂,相关细节将在专门的技术⽂档中描述。
CKB中数据的可信度来源有两种,一种是数据可以客观验证,一种是数据经过特定身份用户的背书。因此,CKB中数据的最小单元必须包含以下要素:
· 数据本身
· 数据的验证方法
· 数据提交者的身份
Cell是CKB中的最小数据单元,可以存放任意的数据。Cell包含以下基本内容:
type:Cell的数据类型。
capacity:Cell容量,可存放数据的最⼤字节数。
data:Cell实际存储的二进制数据,可以为空。包含data在内,cell占用的字节数总是小于等于capacity。
owner_lock:通过脚本表示的Cell所有者。Cell所有者可以转让Cell。
data_lock:通过脚本表示的Cell使用者。Cell使用者可以更新data。
Cell一旦创建无法更改,是一种不可更改(immutable)的数据单元。对Cell的更新,实质上是通过创建所有权相同的新Cell来实现。用户通过交易提交包含新数据的新Cell,同时使老的Cell失效(见Life Cycle)。因此,CKB也可以看作是一个⽀持版本的数据仓库,最新的Cells代表了数据仓库的当前版本,已经失效的Cells代表了数据仓库的历史。
对Cell的操作权分为两种,所有权和使用权。Cell的owner_lock规定了所有权,即转让Cell capacity的权利;Cell的data_lock规定了使用权,即创建新的Cell来更新Cell内容的权利。Cell capacity可以一次全部转让,也可以部分转让,部分转让会创建新的Cell(比如一个capacity为10的cell变成两个capacity各为5的cell)。Cell capacity的增⻓速度由共识参与度及流动投票决定。
Cell的lock脚本由CKB⽀持的虚拟机执行,用户在更新Cell数据或是转让Cell时需要提供相应的证明作为lock脚本输入,如果lock脚本执行结果为True则证明用户具有相应的权限,可以进行操作。
lock脚本表达了Cell的操作权限,可以代表单用户,也可以是门限签名或者更复杂的权限。Cell具有很好的隐私性,用户通过使用不同的lock脚本,可以很轻松地使用不同的假名(Pseudonomy)来管理自⼰的Cells。Cell的所有者和使用者可以是相同的用户,也可以是不同的用户,这也意味着CKB使用者不需要拥有Cell就可以使用CKB,使用门槛低。
3、Transaction
Transaction表达了Cells的转让和更新。在一个Transaction⾥面用户可以转让Cell,或是更新一个或者多个Cell的内容。
Transaction包括以下基本内容:
· deps 依赖集合,对交易进行验证所依赖的只读数据,只能是P1 Cells的引用或者用户输入。
· inputs 输入集合,包含需要被转让更新的Cells,只能是P1 Cells的引用及相应的解锁脚本。
· outputs 输出集合,包含新产生的P1 Cells。
由于Cell的不可变更性,更新Cell时不会直接修改旧的Cell,而是会产生一个新版本的Cell,这些Cell版本可以前后衔接在一起,形成Cell的“版本链”:某一次Cell capacity转让时创建了这个Cell的第一个版本,对Cell的后续更新形成了这个Cell的一系列历史版本,在版本链的最后(Head)是Cell的最新版本。CKB是所有Cell版本链的集合,所有Cell Heads的集合是CKB的当前版本。
CKB Cell模型和Transaction的设计使CKB对轻节点更友好。由于所有的状态都在区块中,区块同步协议也⽀持了状态同步。轻节点只需要同步区块,不需要计算(生成状态),就可以获得新的状态。如果区块中只保存事件,则需要全节点⽀持额外的状态同步机制。在缺乏激励的情况下,区块链协议之外的额外机制很难⼤范围的部署。在区块链协议内同步状态,使轻节点与全节点之间的地位更平等,系统更加健壮和去中心化。

CKB Transaction中包含的 deps 和 inputs 使节点可以方便地判断交易间的依赖关系,对交易进行并行验证(图4)。Transaction中可以混合多种类型的Cell,可以方便的实现跨类型的原⼦性操作。
4、Generator
Generator是生成程序,用来生成符合类型定义的新的Cells。Generator在发起交易的客户端本地执行,以用户的输入以及现有的Cells作为输入,生成包含新状态的Cells作为输出。Generator用到的输入以及产生的输出共同构成一个Transaction(图5)。
通过定义Data Schema, Validator和Generator,我们可以在CKB中实现任意共同知识的验证和存储。例如,我们可以定义一个 AlpacaCoin 的新类型:
Data Schema = {amount “uint”}
pseudo code of checker check()
1. 检查inputs列表中的项都有正确的解锁数据
2. 计算inputs列表中AlpacaCoin的amount之和IN
3. 计算outputs列表中的AlpacaCoin的amount之和OUT
4. 比较IN和OUT是否相等,并返回结果
Validator = validate(context ctx, inputs, outputs)
pseudo code of generator gen()
1. 查找用户能够花费的,属于AlpacaCoin类型的Cells
2. 根据用户输入的转账地址和⾦额,生成类型为AlpacaCoin的属于收款⼈的Cell和找零Cell
3. 返回被使用的Cells列表,以及新生成的Cells列表,这些Cells将用于构造交易
Generator = gen(context ctx, address to, uint amount, ...)

架构
1、分层网络
在Nervos网络中,CKB和Generator构成上下层的关系。
1.1 Common Knowledge Layer
CKB是Nervos 网络的基础。CKB作为最底层,拥有最⼴泛的共识,为Dapp提供数据存储。CKB只关心Generator产生的新状态,不关心状态产生的具体方式。
1.2 Generation Layer
生成器构成实现应用程序逻辑的数据生成层,可以以许多不同的方式实现(图6)

分层架构将数据与计算分离,使每层都可以获得各自的灵活性与可扩展性,使用不同的共识协议。CKB作为最底层,拥有最⼴泛的共识,是整个Nervos网络的基础。不同的应用所需要的共识范围不同,强制所有应用都在最⼴泛的共识下进行会导致效率低下。在Nervos网络中,业务参与方可以根据自⼰所需的共识范围选择合适的Generator,只在需要与局部共识范围外的其他服务交互时,将局部状态提交到CKB上,使其获得更⼴泛的认同。
Generator可以包括(但不限于)以下⼏种形式:
客户端:在用户设备上直接运行Generator生成新状态。通过轻客户端提供的接⼝或是客户端程序库,生成算法可以用任何编程语⾔实现。
状态服务:用户使用中心化服务,由服务器执行生成算法,生成新状态。目前所有的互联网服务都可以通过状态服务的方式使用CKB,使服务状态数据获得更⼤的信任和流动性。例如,游戏公司可以使用状态服务架构,在中心化服务中执行游戏逻辑,生成道具信息;在CKB中定义道具类型和总量等规则,将生成的道具登记并确权。
结合Nervos Identity Protocol,信息发布机构提供基于身份的可信Oracle,为Nervos网络中的其他服务提供必要的信息。
状态通道:两名或多名用户使用点对点网络连接通信,共同生成新的状态。
状态通道的参与者可以通过CKB登记和获取参与者信息,建⽴通道连接。参与者可以在CKB上提供保证⾦,使其它参与者相信通道能够顺利运行。状态通道参与者之间可以使用共识协议或是多方安全计算技术来生成新状态。
生成链:一个用于生成CKB新状态的区块链。
生成链可以是公有链(例如任何使用EVM的区块链),也可以是许可链(例如CITA以及Hyperledger Fabric)。使用许可链可以将状态计算限定在一定参与范围内,保护计算隐私,同时获得很好的性能。在应用链中,参与者共同执行状态生成并相互验证计算过程,在状态需要更⼴泛共识时,将其提交到CKB中,使之成为接受度更⾼的共同知识。
2、Nervos 节点
Nervos CKB(简称CKB)设计为通用通用知识库(附录:通用知识库)。CKB网络由三种节点组成:
归档节点:CKB网络中的完整节点。它们验证新的块和事务、中继块和事务,并将所有历史事务保存在磁盘上。归档节点可以提⾼系统的整体健壮性,并为历史数据提供查询服务。
共识节点:共识参与CKB网络中的节点。协商一致节点侦听新的事务,将它们打包为块,并在新的块上实现协商一致。协商一致节点不必存储整个事务历史。
Light Clients:用户与CKB网络与光客户交互。它们只存储非常有限的数据,可以在台式电脑或移动设备上运行。
CKB节点组成对等的分布式网络,以中继和⼴播块和事务。协商一致节点运行混合协商一致协议(混合协商一致),在一定的时间间隔内对新创建的块达成一致。新的块将被所有节点识别并添加到CKB区块链的末尾。新块中的事务将更新CKB的状态。
2.1 轻客户端
节点完全对等的区块链架构已经受到了严重的挑战。公有链网络上节点性能参差不⻬,对等节点架构不仅对用户硬件要求越来越⾼,也无法充分发挥⾼性能节点的潜力。越来越多的用户放弃运行全节点,转而使用轻客户端以及中心化客户端。全节点需要对所有区块和交易数据进行验证,对信任依赖最小,但开销最⼤,使用非常不便。中心化客户端则完全信任中心服务器提供的数据,放弃了验证。轻客户端则通过稍微增加对全节点的信任,⼤⼤降低了验证开销,对用户体验有很⼤的提升。
同时,移动设备已经成为⼈们日常使用互联网服务的主要设备,原生应用也越来越流行。因此,对移动设备友好是CKB的设计原则之一,Nervos应用应该能够流畅的运行在移动设备上,与移动平台无缝的衔接。
CKB⽀持轻客户端。CKB使用可证数据结构组织区块头,可以极⼤地加快轻客户端的同步速度。得益于CKB以状态为中心的设计,轻客户端无需重复计算就能够方便地直接同步到最新的状态(P1CS)。使用本地保存用户关心的少量P1Cells及网络带宽,轻客户端可以提供更好的分布式应用体验。
3. 混合共识
在研究和实践中我们认识到,传统BFT算法在正常路径下逻辑简单,但需要以复杂的逻辑应对故障情况;Nakamoto共识则以不变应万变,无论是正常还是故障情况都是同样的逻辑,但也因此影响了正常路径下的系统性能。如果将Nakamoto和传统拜占庭容错两类共识协议有机的结合在一起,新的混合共识在一致性、可用性、公平性及运行开销等方面可以形成最佳组合。
CKB将按照混合共识的思路,设计并实现自⼰的混合共识算法,为交易提供⻅证。通过将Nakamoto共识和传统BFT共识结合,我们既可以保留开放性和可用性,又可以在正常路径下获得传统BFT共识的优秀性能,将交易时延降到最低,最⼤程度的提升系统吞吐量。
CKB混合共识的详细设计请参考CKB Consensus Paper。
CKB Token
1、经济学

一个优秀的经济激励制度应该引导区块链的参与者为这个自治共同体作出贡献,最⼤化区块链的效用。
CKB经济模型应该能够激励用户、开发者和节点运行者合力为共同知识的形成与保存贡献力量。CKB的经济模型同样以状态为核心进行设计,通过Cell Capacity增发和⼿续费两部分奖励产生激励。
CKB状态的形成与存储都需要一定的成本。状态的形成需要节点验证,消耗计算资源,状态的存储则需要节点持续提供存储空间。现有的公有链经济模型只在处理交易时收取一次性⼿续费,一旦数据上链成为共同知识,则可以无需再付出任何成本,永久占用所有节点的本地空间。
在CKB中,Cell是状态的存储单元。未被占用的Cell Capacity可以转让,具有流动性,但是被占用的Capacity不能被转让,失去流动性。因此,Cell的使用者需要为状态的存储⽀付流动性作为成本。Cell的使用时间越⻓,需要付出的流动性成本越⾼。通过使用流动性成本而不是预付费的方式,避免了预付费用完导致Cell被强制回收的问题。Cell Capacity的价格是对CKB中共同知识价值的直接度量。
Cell的使用者和所有者可能是不同的,所有者可以帮使用者⽀付流动性成本。更新Cell中的数据或是转让Cell Capacity则需要⽀付⼿续费。共识节点可以设置自⼰愿意接受⼿续费⽔平,交易⼿续费⾼低是由市场决定的。⼿续费也可以由Cell所有者代替使用者⽀付。
当前主流用户难以使用区块链的一个重要原因是,交易⼿续费必须以原生代币进行⽀付,由此要求用户在使用服务之前自行寻找方法先获取原生代币,提⾼了使用门槛。另一方面,用户已经习惯了基本服务免费,增值服务收费的商业模式,无论做什么都要收费也不符合主流用户习惯。CKB通过允许Cell所有者代替用户付费的设计解决了这两个问题,为应用开发者提供了更多的商业模式选项。
除了用于⽀付共同知识的形成和存储成本,Cell Capacity还可以被用在共识抵押、流动投票等多个场景中。CKB的安全程度与共识节点抵押的代币数量息息相关。共识抵押代币越多,节点作恶成本越⾼,整个系统也更加安全。CKB的Cell Capacity增发调节的目标之一是保证一定的共识保证⾦抵押⽔平,以此保证系统安全。通过调节增发比例,调节共识参与者可以获得的无⻛险收益比例,进而调节共识的参与度。
CKB经济模型的细节请参考Nervos CKB Economic Paper。
2、治理机制
作为Nervos网络的基础设施,CKB必须能够与其所承载的生态同步进化,在不间断运行的同时进行调整运行参数,或是进行更深程度的网络升级。从区块链发展历史中我们能够看到,社区达成共识或是网络升级的成本过⾼将会阻碍创新,使网络难以进化,无法生态发展的需求。
因此,CKB内置了流动投票和热部署机制,使CKB成为一个能够自我进化的分布式网络。
3、流动投票
投票机制对Nervos系统的⻓期稳定至关重要。比如说,CKB的运行依赖一组系统参数,其中有一些能够自动调节,有一些需要进行投票达成共识;CKB的代码中可能会有bug,修复方案有可能需要投票共识;随着Nervos生态的发展,CKB的功能需要持续升级,实现和部署新的功能也需要投票共识。因此,投票工具是CKB⻓期稳定运行必不可少的组件之一。
CKB⽀持流动投票(图7)。每一位Cell所有者都可以参与到与CKB发展有关的决策中来,投票权重由用户所持有的Cell Capacity决定。在流动投票中,用户可以设置自⼰的投票代表,由其进行代理投票。投票代表也可以设置自⼰的投票代表。考虑到提案专业度和参与激励的问题,不同的提案可以设置不同的接受条件,例如参与率和⽀持率。
值得注意的是,CKB流动投票是Nervos社区共识的表达工具,不是共识形成工具。在投票之前,社区应该利用各种沟通工具对提案进行细致的考察,事先形成粗略共识。
CKB流动投票细节请参考Nervos Governance Paper。

得益于Cell数据模型的抽象性,CKB的功能模块可以利用Cell来实现和存放。我们把承担CKB系统功能的Cell称为Neuron,Neuron实质上是一种特殊的Cell类型,其使用者是CKB自身。
在功能变更升级提案被实现为Neuron之后,社区使用流动投票对是否部署进行表决。在获得社区共识后,新的Neuron将被部署到链上,修复系统bug或是提供新的系统功能。细粒度的Neuron升级能够⼤⼤降低CKB的进化难度。
总结
Nervos CKB为一个全新的分布式应用网络提供了共同知识层。Nervos CKB以状态为中心设计,采用更为通用的存储模型,更好的平衡了激励机制,得到了一个更具可扩展性的分布式应用范式。

关于更多Nervos信息:https://www.nervos.org/

更多区块链信息:http://www.qukuaiwang.com.cn/news/
风险提示:区块链投资具有极大的风险,项目披露可能不完整或有欺骗。请在尝试投资前确定自己承受以上风险的能力。区块网只做项目介绍,项目真假和价值并未做任何审核!

文章来源:http://www.qukuaiwang.com.cn/news/13439.html
原文作者:Nervos
特别申明:区块链行业ICO项目鱼龙混杂,投资风险极高;各种数字货币真假难辨,需用户谨慎投资。blockvalue.com只负责分享信息,不构成任何投资建议,用户一切投资行为与本站无关。

1.价值区块链(blockvalue.com)遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.价值区块链的原创文章,请转载时务必注明文章作者和"来源:价值区块链(blockvalue.com)",不尊重原创的行为本站或将追究责任;3.作者投稿可能会经价值区块链编辑修改或补充。