可验证延迟函数(VDF)

2023-11-11

干货 | 可验证延迟函数(VDF)

自从以太坊将可验证延迟函数(Verifiable Delay Function, VDF) 列入研究计划并打算在以太坊 2.0 使用之后,VDF 得到了广泛的关注。VDF 这个概念最初由斯坦福大学密码学教授 Dan Boneh 等人在其论文 Verifiable Delay Function 中给出。该篇文章于 2018 年发表在密码学顶级会议之一的 CRYPTO 上。

 

目前网络上有一些英文中文的文章介绍了 VDF 的概念和原理,但是它们要么无法给出全面直观的解释,要么只是粗浅地谈论应用。本文试图通过浅显的语言和具体的例子来让对密码学和群论不够了解的读者能够全面而直观地理解它的定义和原理。同时,本文还给出了它的可能的应用场景以及目前的研究和应用状况。

简介

VDF 是一类数学函数,能够使得该函数的计算需要至少一段已知的时间,即使是在同时使用少量 CPU 进行并行计算的情况下(这与比特币的 Proof-of-Work (PoW) 不同,后文会详细解释)。VDF 通常会接受一个输入以及一些参数(安全参数、时间参数等),输出一个结果以及相应的证明(可以为空,如果结果能够自带证明)。验证者会依据输入、参数、输出以及结果来判断 VDF 的结果是否正确。

对于未精心设计过的算法,并行计算有可能极大地缩减其计算时间。以比特币的挖矿算法为例,设 0⩽nonce⩽232−10⩽nonce⩽232−1,如果只有一个运算单元,那么可能需要耗费多达 232232 次 SHA-256 计算的时间。如果有两个运算单元,就可以将任务对半分摊,让他们并行地计算哈希值。最多只需要耗费 231231 次 SHA-256 计算的时间。

同时,VDF 满足以下性质:

  1. VDF 的结果的检验应当是非常有效率的。
  2. 唯一性(Uniqueness):对于任意一个 VDF 的输入,应当有唯一的输出结果能够通过检验。也就是说,不存在两个不同的输出,他们有相同的输入。如果输出结果包含“结果”和关于结果的“证明”两部分,那么证明部分可以不具有唯一性,但需要保证“验证者因为证明而验证通过,但是输出结果却不是正确的结果”这件事发生的概率小到可以忽略不计。
  3. 串行性(Sequentiality):攻击者即使能够提前计算很长时间(但不是任意长的时间),并且拥有很多并行处理器(但不是任意多的处理器),利用各种计算方法(确定地计算或是连蒙带猜),能够以少于 tt 的时间计算出 VDF 结果的概率可以小到忽略不计(并不是 0,因为也许攻击者真的就运气好到猜中了呢?)。

VDF 能够抵抗并行计算加速,这意味着为了计算 VDF,应当完成一系列串行才能完成的任务,后一个任务必须依赖于前一个任务。这时,对哈希函数有所了解的读者可能会想到一种方案:连续将一个输入哈希 tt 次。这样的方案的确是无法通过并行算法显著地加速的,但是这样得到的结果,其验证将会非常没有效率:验证者需要重复哈希 tt 次的计算,即使保留一些中间结果,验证的工作量和计算的工作量也是常数级别的差距。从这个例子我们可以看出,在这样的定义下,可验证延迟函数的构造并没有想象中的那么简单。

事实上,对于上面并不严谨的定义,去掉任何一个性质都会导致我们能够非常轻易地构造出可验证延迟函数:

  1. 如果不要求验证结果是高效的,也就是说没有显著地比计算结果更快,那么我们可以通过刚才提到的连续哈希的方案进行构造。
  2. 如果我们不需要它保证唯一性,那么早在 2013 年 Mahmoody 等人的工作 Publicly Verifiable Proofs of Sequential Work 就已经实现了这一点。
  3. 如果它不保证串行性,那么显然构造方法就更多了。

与 PoW 的区别

或许有读者会感觉 VDF 和 PoW 是一类东西,实际上,虽然他们计算起来都不是很容易,但是他们之间有很多关键的区别。

  1. PoW 不抵抗并行计算加速而 VDF 抵抗。实际上,PoW 不抵抗并行计算加速是符合中本聪的“一 CPU 一票”的设想的,而抗并行加速的性质只会与这个目的背道而驰。VDF 会使得多 CPU 的计算者和单 CPU 的计算者相比几乎没有什么优势。
  2. 对于固定的难度设定 dd,PoW 可以有很多合法的解,这也是保证 PoW 共识网络拥有稳定的吞吐量以及刺激矿工进行竞争的前提。而对于给定输入 xx,VDF 拥有唯一的输出(这也是为什么它被称作函数)。

上述两条性质决定了 PoW 直接作为随机数的来源是有缺陷的,同时,VDF 也无法直接替代 PoW。但是这并不能说明 VDF 不可以被用到共识协议里,这一点会在下一个章节详谈。

用途

上一章节我们介绍了 VDF 是什么,以及它具有怎样的性质,这一章节我们关注它的用途。

增强公共可验证随机数的安全性

区块链上的随机数一直是一个热门话题。无论是在一些权益证明(Proof-of-Stake, PoS)共识协议的设计里,还是在智能合约平台,譬如 Ethereum 和 EOS,上一些非常火爆的游戏类应用,随机数都占据了核心的地位。同时,很多这些应用中,实际设计的随机数获取方案还非常不成熟,以至经常会有应用因为不安全的随机数而被黑客攻击的新闻出现。

VDF 对于一些从公共来源获取随机数的方法非常有用。比如从股票市场或者是从 PoW 区块链上获取。这些随机源拥有足够的随机性(更严格地讲,是最小熵)。但是高频交易者可以影响股价,同时,PoW 区块链的矿工也可以通过不广播自己挖出的区块来降低自己不想要的随机数结果的出现概率。但是这样的攻击方式成立的前提条件是攻击者有时间在其他诚实参与者之前预测出随机数结果。VDF 恰好能阻止这一点。如果将 VDF 的时间参数 tt 设置到足够长(比如 10 个块的间隔),将最新的区块头作为输入扔进 VDF 中,输出作为随机数结果。那么攻击者只能在 10 个块之后才能知道随机数的结果是什么,那个时候想要再改变结果已经很难了(需要 fork 10 个区块)。

此外,VDF 也可以增强一些多方参与的随机数方案。比如 Commit-and-Reveal 方案中,攻击者可以拖到 Reveal 阶段的最后再决定是否揭示自己的承诺。如果我们去掉 Commit 阶段,并且协议的最后整合所有人的输入之后不直接作为随机数结果,而是放入 VDF 中,并且将 VDF 的时间参数 tt 设置到足够长(晚于最后提交期限),那么即使是最后一刻提交的人也无法知道随机数的结果,操纵结果也就无从谈起。与之相比较,其他的多方参与方案通常最多容忍小于一半的恶意节点,并且交互的开销要比上述方案更大。

解决 Nothing-at-stake Attack

正如上一节所述,VDF 可以用于增强随机数生成方案的安全性,因此,在一些使用了随机数来选取 Leader 的共识协议中也可以使用 VDF 在增强其安全性。一些节约能源的共识协议,例如 PoS,空间证明(Proof-of-Space)以及存储证明(Proof-of-Storage),为了防止 Nothing-at-stake attack,需要使用随机选举每隔一段时间选举出一个 Leader。这些协议使用的随机数方案大多只在诚实参与者占据大多数时保持安全。利用 VDF 可以降低这样的限制到至少存在一个诚实参与者。

Nothing-at-stake Attack

PoS 区块链发生分叉时,共识参与者为了自己的利益会选择在不同的分叉链上同时进行抵押资产参与出块,这样分叉链有可能会一直存在并且分叉越来越多,严重危害系统的一致性,这样的攻击被叫做 Nothing-at-stake attack。在 PoW 链上进行这样的攻击需要分散算力,因此这样的攻击只适用于“节约能源”的共识协议。

除了随机选举之外,还有一种叫做 Proofs of Space and Time 的方案可以防止这种攻击。实际上该方案模拟了 PoW 的挖矿过程:挖出区块的时间是不确定的,并且每个矿工都在互相竞争成为最早挖出区块的人。不一样的地方在于,模拟挖矿过程实际上并不需要消耗大量的并行计算资源(Proof-of-Time),只有在进入挖矿时有一定的门槛(Proof-of-Space)。具体来讲,整个挖矿过程按照时间顺序被分成不同的区间,每一个区间都有一个公共随机的挑战 cc(举个例子,可以是前一个区间挖出的块的哈希值)。假设某个矿工拥有的空间单位为 NN,他需要生成一个证明 ππ 来证明他拥有这 NN 单位的空间,并且专门用于该区块链的挖矿,这一点由 Proof-of-Space 保证。矿工的目标为找到最小的 τ=H(c,π,i),1⩽i⩽Nτ=H(c,π,i),1⩽i⩽N,然后将 cc 作为输入计算一个 VDF(事实上是增量 VDF),该 VDF 的时间参数与 ττ 正相关。这样的设计中,拥有空间越多的矿工找到更小的 ττ 的可能性更大,同时,VDF 保证了一段时间的流逝,使矿工大量分叉需要消耗大量的时间。

减轻 Long-range Attack

几乎所有的 PoS 方案都面临 Long-range attack 的问题。目前 PoS 协议依赖于外部的时间戳服务来帮助他们解决这个问题——只要能判断哪一条链更老,就能阻止这样的攻击发生。VDF 能够帮助 PoS 解决这样的问题。VDF 相当于一种时间流逝的证明,对于给定的 VDF,该 VDF 至少需要多久才能得出结果是一个公共知识。因此,只需要在 PoS 链上包含 VDF 的输入与输出即可证明给定区块的历史。

Long-range Attack

在 PoS 协议中,任意时刻都有一组权益相关者拥有按照权益多少分配的投票权。PoS 假设大多数权益相关者并没有理由对系统造成破坏,因为这样反而会损害自己的权益。但是如果这些权益相关者在某一个时间点出售了自己的权益,这样的激励对他们来讲是无效的。这些已经出售了自己权益的曾经的权益相关者仍然可以在曾经某一个时间点轻易对(那时他们占据大多数权益) PoS 链分叉达到原有链的的长度,从中攫取额外的利益,这样的攻击被称作 Long-range attack。它在 PoW 上不太可能发生,因为对于 PoW 来讲,无论从哪一个时间点进行分叉,都必须要付出相应的算力才能追上原有的链,想要分叉的区块越多,付出的算力也就越多。

但是必须要指出的是,这样的方法并不是完美的,因为 VDF 仍然是可以被特殊硬件加速的(尽管是常数级的)。如果攻击者获得了诚实节点 10 倍的计算速度,那么攻击者可以用 1 年的时间伪造出 10 年以前的区块,从而用 1 年的时间获得一条有 10 年历史的链。这样的加速对于使用 VDF 作证明的 PoS 链是不可接受的。

10 倍的加速对于随机数生成的场景无所谓,因为该场景下,不需要保证“攻击者算得没有诚实节点快”,只需要保证攻击者无法在某个时间点(随机数来源再也无法更改的时间点,例如股市闭市)之前无法计算出结果即可。从而在随机数生成的场景,我们可以选取一个足够长的时间参数,使得攻击者即使加速也无法操纵随机数。

副本证明(Proof of Replication)

副本证明所需要解决的问题是,服务器如何向客户端证明自己在某一专门的存储介质上存储了指定的数据,即使这样的数据是可以从别的存储来源轻易获得的。注意副本证明是为了证明服务器拥有一份数据的副本,而不是证明它有这样的数据。举个例子,云存储服务提供商声称自己为客户的数据做了额外的两份冗余备份来保证用户数据的 availability,因此客户需要为这样的冗余备份交更多的钱。但是怎么证明云服务提供商有一共三份副本而不是两份或者只有一份呢?这就需要用到副本证明。一种思路是利用在时间上不对称的编码方案(也就是编码很慢,但是解码很快),VDF 可以做到这一点(事实上是可解码 VDF)。身份为 idid 的服务器首先将文件分成 bb-bit 大小的文件块 Bi,1⩽i⩽nBi,1⩽i⩽n,然后计算 Bi⊕H(id||i)Bi⊕H(id||i) 并将结果作为输入放进 VDF 计算得到 yi,1⩽i⩽nyi,1⩽i⩽n,其中 HH 是输出长度为 bb-bit 的防碰撞哈希函数。服务器存储所有的 yiyi,客户端不断随机挑选 ii 进行轮询要求服务器返回 yiyi,服务器在规定时间内需要响应给客户端相应的结果,而客户端可以在很短的时间内通过解码 yiyi 得到 BiBi 完成验证。如果服务器没有存储 yiyi ,那么想要正确响应客户端必须计算 yiyi,然而这样的计算无法在规定的时间内完成。服务器也可以只存储一部分 yiyi(比例为 ρρ),由于客户端是随机轮询,每一次服务器成功欺骗客户端的概率为 ρρ。只要客户端重复 kk 次这样的轮询,就可以将服务器欺骗成功的概率降到 ρkρk。需要补充的一点是,服务器可以不存储 BiBi,由于 yiyi 解码很快,即使只存储 yiyi 也不会太影响性能。

基本原理

既然 VDF 是一个函数,那么它就必然具有这样的形式:f:X→Yf:X→Y。为了实现前文所述的功能,即“抵抗并行计算的延迟”以及“可验证的结果”,VDF 中必然包含一个用于计算结果的算法以及一个用于验证结果的算法。同时,这样的密码学工具通常还包含一个配置阶段,用来确定后续需要使用的参数。因此,VDF 被描述为三个算法的一个三元组 (Setup,Eval,Verify)(Setup,Eval,Verify)。

每个算法的定义如下:

  • Setup(λ,t)→pp=(ek,vk)Setup(λ,t)→pp=(ek,vk) 接受安全参数 λλ 以及时间参数 tt,生成一个公共参数 pppp,这个参数是所有人都可以看到的。公共参数 pppp 包含了一个用于计算的参数 ekek 和一个用于验证的参数 vkvk。
  • Eval(ek,x)→(y,π)Eval(ek,x)→(y,π) 接受计算参数 ekek 和输入 x∈Xx∈X,计算出输出 y∈Yy∈Y 和证明 ππ
  • Verify(vk,x,y,π)→{accept,reject}Verify(vk,x,y,π)→{accept,reject} 接受 vkvk,xx,yy 以及 ππ,输出 acceptaccept(验证通过)或者 rejectreject(验证失败)。

如图 1 所示我们可以看到 VDF 通常的运行流程。

img

图 1:可验证延迟函数

以上几个算法有一些需要补充说明的地方:

  • 关于 SetupSetup
    1. SetupSetup 的运行时间不能太久,它被安全参数 λλ 所限制。
    2. SetupSetup 这个阶段通常会需要随机数作为参数以保证安全性,如果随机数是私下选择的,也就是不可公开的,那么这个阶段就会需要一个可被信任的一方来进行随机数的选择,称之为 trusted setup。相反,如果随机数可以是公共随机数,那么这个阶段就不需要这样的 trusted setup。显然,我们希望尽量避免 trusted setup。
  • 关于 EvalEval
    1. 证明 ππ 不是必须的,如果仅仅通过 yy 就能验证的话。
    2. 在 yy 的计算中,不允许有随机数的引入(为了保证唯一性),但是在 ππ 的生成过程中可以引入。
    3. 为了保证串行性,EvalEval 在拥有不超过关于 tt 的多项式对数(Poly-log)个并行处理器时,运行时间必须为 tt。
    4. 为什么 EvalEval 要允许一定程度的并行计算达到时间 tt 呢?因为可能并没有构造能够完美地让并行和串行计算时间完全相同,所以我们需要容忍一定量的不太显著的并行加速。
  • 关于 VerifyVerify
    1. VerifyVerify 中不引入随机数,也就是说,它是确定性算法。
    2. VerifyVerify 的运行时间要比 tt 小得多,具体来讲,他们在运行时间上拥有指数级别的差距(Exponential gap)

基于上述定义,VDF 还有一些拥有特殊性质的变种:

  1. 可解码 VDF(Decodable VDF):如果对于一个 VDF 方案,存在一个算法对于任意 x∈Xx∈X 能够从 y∈Yy∈Y 反向计算出 xx,那么这个 VDF 就是可解码 VDF。在这样的情况下,证明 ππ 是不需要的。当然,一个平凡的构造是,将 ππ 放进 yy 里面。
  2. 增量 VDF(Incremental VDF):如果在 SetupSetup 算法中,参数 tt 没有被唯一确定,而是允许在 EvalEval 的输出之一 ππ 中指定,这样的 VDF 被称作增量 VDF。一种效果类似的构造是,在 SetupSetup 中设定 tt 为一个单位的时间,如果想要在计算阶段达到不同的延迟时间,例如 T=ntT=nt,只需要串行 nn 次 EvalEval 即可。但是这样的构造会导致 nn 倍的证明长度,增量 VDF 不会产生额外的证明。
  3. 陷门 VDF(Trapdoor VDF):如果某个 VDF 方案存在一个算法,使得知道某一秘密值 sksk 的人能够通过这个算法迅速由 EvalEval 的输入得到 EvalEval 的输出,那么这个 VDF 是陷门 VDF。更直观的理解是,陷门 VDF 有一个后门可以让人绕过延迟限制迅速算出结果。
  4. 弱 VDF(Weak VDF):如果我们放宽限制,允许“即使在 EvalEval 中使用多项式(Polynomial)个并行处理器才能在 tt 时间算出结果”这样的情况出现,这样的 VDF 被称作弱 VDF。弱 VDF 在实际应用中会更加消耗诚实参与者的算力(因为相比 VDF 而言需要更多的并行处理器才能达到 tt 时间)。但如果将 VDF 用于生成公共可验证的随机数,可以将计算任务交给一个诚实参与者,其他参与者等着验证。这时,这样的唯一计算者是可能拥有足够多的处理器的。

一种简单的构造方式

上文提到了使用连续的哈希操作是一种防止并行的计算加速的手段,但是这样的手段非常低效,不符合 VDF 的定义。我们希望能够找到一种验证更加迅速的防并行的构造方式。考虑这样的一个例子:

首先选择一个数 λ=161λ=161 ,然后然后对于任意的输入 xx,我们执行下面的操作 tt 次:

  1. 计算 k=x2k=x2
  2. 取 kk 除以 λλ 的余数得到 ll
  3. 令 xx 取 ll,返回第一步,如果是最后一次操作,输出结果 yy

假设我们的输入 x=11x=11,t=8t=8,那么结果为 9595,事实上,如果我们让 tt 取不同的值,把结果都记录下来,可以得到下述表格

tt 1 2 3 4 5 6 7 8
yy 121 151 100 18 2 4 16 95

更一般地讲,如果 a≡bmodma≡bmodm 代表 aa 和 bb 分别除以 mm 的余数相同的话,那么上述操作实际上就是计算

y≡x2tmodλy≡x2tmodλ

如果我们知道 λλ 的因式分解,例如 161=7×23161=7×23,那么我们可以通过两次指数运算来快速计算出 yy 的值。首先计算函数 ϕ(161)=(7−1)×(23−1)=132ϕ(161)=(7−1)×(23−1)=132,然后计算 2t2t 除以 ϕ(161)ϕ(161) 的余数

28≡124mod13228≡124mod132

然后计算 x124x124 除以 λλ 的余数

11124≡1126+25+24+23+22≡4×2×18×100×151≡95mod16111124≡1126+25+24+23+22≡4×2×18×100×151≡95mod161

上述过程比起连续平方 8 次看似没有减轻多少工作量,但实际上当 tt 和 λλ 非常大(t≈230t≈230)时,远比连续平方快得多。一般地,函数 ϕ(n)=∏ri=1pki−1i(pi−1)ϕ(n)=∏i=1rpiki−1(pi−1),如果 n=pk11pk22⋯pkrrn=p1k1p2k2⋯prkr。这个函数被称之为欧拉函数(Euler’s Totient Function)。上述例子可以一般化为

e≡2tmodϕ(λ),y≡xemodλe≡2tmodϕ(λ),y≡xemodλ.

因此,如果没有任何人知道 λλ 的因式分解,也就无法快速计算出 ϕ(λ)ϕ(λ),从而只能重复 tt 次平方操作使用

x→x2→x22→⋯→x2tmodλx→x2→x22→⋯→x2tmodλ

计算出 yy。

事实上,这个构造可以使用群论得到更加本质的解释。我们发现,由于模运算 yy 的值是小于 λλ 的,而所有小于 λλ 且与 λλ 互素的数一起组成了一个群(Group),这个群被称作整数模 λλ 乘法群,记作 (Z/λZ)∗(Z/λZ)∗。这个群的阶(Order),也就是元素个数就等于欧拉函数 ϕ(λ)ϕ(λ) 的值。因此,关键问题落在了如何生成这样的不知道阶的群。

目前主要有两种方法:

  1. 使用 RSA 群
  2. 使用虚二次域的类群(The class group of an imaginary quagratic number field)

RSA 群的生成与 RSA 加密算法类似,选取大素数 pp 和 qq,其中 p=2m+1p=2m+1,q=2n+1q=2n+1 且 mm,nn 均为素数。令 N=pqN=pq,则 (Z/NZ)∗(Z/NZ)∗ 即为所需群。然而一个很显然的问题是,这其中涉及到了 trusted setup,我们必须相信生成 NN 的参与者不会泄露 pp 和 qq。我们也可以使得群生成算法使用公共随机数来直接选取足够大的 NN 使得因式分解 NN 非常困难,但是这样的 NN 需要非常大以至于这样的方法非常不现实。第二种方法解决了第一种方法的问题,但是由于第二种方法解释起来涉及概念较多,本篇文章不会涉及。同时,对于结果 yy 的快速验证需要用到证明系统,有兴趣的读者可以参考 Boneh 的一篇综述

研究与应用现状

学术界第一次正式提出 VDF 的概念是在 Boneh 的论文中,他在论文中给出了 VDF 的应用场景以及形式化的模型,安全分析和一般构造方法。之后出现了分别出现了两篇 VDF 的构造论文,分别是 Wesolowski 的 Efficient VDF 以及 Pietrzak 的 Simple VDF。两者都利用在不知道阶的群中连续做平方运算的方法来构造 VDF,不同的是,他们生成证明的构造有所区别。简单来讲,Wesolowski 的证明更短,验证更快;但是 Pietrzak 的构造中,生成证明的速度更快,同时证明系统依赖的安全假设更弱。2019 年 Feo 等人使用超奇异同源 (Supersingular Isogenies) 以及双线性对(Bilinear Pairings)构造 VDF。相比于 Wesolowski 和 Pietrzak 的工作,他们的构造本身就是非交互的,不需要经过转换,同时不需要证明 ππ 即可完成验证,但是他们的构造中 SetupSetup 耗费的时间更长,更为主要的是,目前还只能进行 trusted setup。

在应用领域,Chia Network 计划使用 VDF 来支持他们的 Proof-of-Space;以太坊研究团队也打算在以太坊 2.0 中引入 VDF,以期在以太坊 2.0 信标链中使用 RANDAO + VDF 随机选取出块人。最初以太坊计划使用 RANDAO + VDF 的方案。但由于以太坊 2.0 的计划瞬息万变,截至文章最后修改前,以太坊信标链计划将区块间隔限制到 6 秒,64 个区块为一个 epoch,因此一个 epoch 为 6.4 分钟,每一个 epoch 需要进行一次出块人切换,因此 VDF 的时间参数最少应设置为 6.4 分钟,但是目前以太坊计划将其设置为 102.4 分钟,目的是防止潜在的攻击者利用特殊硬件加速 VDF。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可验证延迟函数(VDF) 的相关文章

  • 文储研习社第17期

    文储研习社是文储区块链技术人员自发组织的学习交流社区 旨在于追踪区块链时下最新热点 解码热点蕴含的未知领域 享受思想交流的碰撞 欢迎志同道合的小伙伴加入我们 共同学习与成长 第17期 为了提高考证通过率 不小心搭了条链 作者 Bingo 你
  • Fisco Bcos 答疑

    问 测试8的结果 集群中有4个节点 其中宕机3个 发起一笔交易 交易失败 然后启动宕机的3个节点 还是交易失败 但如果有一笔新的交易执行 会激活上一笔交易 交易失败的那一笔 最后失败的那一笔会交易成功 这种情况下的交易原理是怎样的 答 不存
  • 在区块链世界中的token到底是什么?

    token的概念很广泛 在计算机领域中 无论是基础的网络架构还是服务系统的身份验证等 都有涉及到token的概念 然而在这里我想阐述的是在区块链世界中的token是什么 相信对区块链有些了解的朋友 都或多或少的听过或者看过关于token的描
  • 以太坊系列之十五: 以太坊数据库

    以太坊数据库中都存了什么 以太坊使用的数据库是一个NOSQL数据库 是谷歌提供的开源数据leveldb 这里尝试通过分析以太坊数据库存储了什么来分析以太坊可能为我们提供哪些关于区块链的API 存储内容 NOSQL是一个key value数据
  • 以太坊区块链学习之在私链上部署合约

    上一篇博客介绍了如何搭建私链并在私链上创建账户 挖矿 查看余额 本篇将介绍在私链上部署合约并与之交互 本篇开发环境为MacOS 10 12 建议读者使用macOS系统或者Ubuntu系统 第一步 进入geth客户端 启动私链 进入geth客
  • 2018年区块链人才趋势:降温、调节、蓄势待发

    2018年 戊戌年 是一个不平静的年份 自960年前的戊戌年王安石变法 到最近两百年的四个戊戌年 其间发生的大事无不与 变革 息息相关 年初 从科技圈 金融圈里 引爆出一个叫 区块链 的公众热点 从技术角度而言 这并非新生事物 但因其巨大的
  • 浅析『链上数据分析』 : 区块链 + 数据分析

    什么是链上数据分析 01 区块链 02 链上数据 03 为什么要分析链上数据 04 数据分析思维 05 数据分析技能 06 数据分析工具 07 业务逻辑理解 什么是链上数据分析 链上数据分析 顾名思义 就是对区块链上的数据进行分析 其实就是
  • 区块链数据的存储和更新

    目录 1 引言 2 主要流程 2 1数据库读取 2 1 1 从数据库加载块数据 2 1 2从数据库读取账户信息 2 2 区块链数据更新与回滚 2 2 1 交易数据 2 2 2 块数据 1 引言 在第一篇文章里我们从静态的角度讲解了以太坊的数
  • 如何使用区块链技术保护个人隐私和数据安全

    区块链技术是一种分布式账本技术 它具有不可篡改 去中心化 透明度高等特点 区块链技术能够实现数据的可信存证 隐私保护和交易安全 并且能够通过智能合约的自动执行 因此被广泛应用于金融 电商 物流 社交网络等领域 区块链技术的核心是 分布式账本
  • 交易的本质 什么样的信仰,决定什么样的交易人生

    什么样的信仰 决定什么样的生活 同样 什么样的理念 也决定了什么样的交易 多数的交易员都把能否在交易市场稳定化盈利归结于自己从事这个行业的时间 通常很多人会说五年入门 十年小成等等 好像只要坚持个五年十年就能够在交易市场找到自己的位置 你信
  • 圆石说│彭一鸣:运用区块链技术赋能实体旅游产业;微软开放6万项专利包括一个开源区块链项目……

    智联招聘 区块链岗位需求主要集中在一线和新一线城市 智联招聘报告显示 从目前区块链职位的城市分布来看 该领域的岗位需求主要集中在一线和新一线城市中 其中 北京 上海和深圳位于第一梯队 职位占比分别达到24 20 和10 杭州 广州和成都紧随
  • 自己动手部署以太坊联盟链

    一个区块链学习项目 GitHub https github com xianfeng92 Love Ethereum 假设已经在Ubunbu 14 04 LTS上安装好了以太坊客户端Geth 使用Geth部署以太坊联盟链 以太坊Geth客户
  • "我为区块链赋能实体经济代言"第二批代言人:复旦大学张江研究院教授陈文君

    我为区块链赋能实体经济代言 推出以来 颇受行业关注 为进一步规范行业发展 落实区块链赋能实体经济的目标 为行业发展 正本清源而发声 新一轮的 我为区块链赋能实体经济代言 于9月3日重磅启动 我为区块链赋能实体经济代言100人第二批 第3位代
  • 使用web3和infura开发以太坊ethereum区块链

    web3 Github https github com ethereum web3 js web3 js是以太坊提供的一个Javascript库 它封装了以太坊的RPC通信API 提供了一系列与区块链交互方法 使js与以太坊交互变得简单
  • 《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖

    你是否曾想过 元宇宙是如何融入世界上最具代表性的品牌和名人的战略中的 在本期的 开箱元宇宙 系列中 我们与 Madballs 的战略顾问 Derek Roberto 一起聊聊 Madballs 如何在 90 分钟内售罄 2 000 个人物化
  • Sui生态DeFi将参加Builder DAO举办的活动,为期三天畅谈如何Build on Sui

    LeadUp the Night是一个定期举办的MeetUp活动 由Builder DAO邀请区块链各方项目开发者 VC担任本活动的讲师 这个活动旨在促进区块链技术的发展和应用 让参与者有机会开发创新的区块链应用 探索区块链技术的潜力 12
  • 工业互联网会是制造业数字化发展的未来吗?

    新工业革命正逐步形成 你认为工业互联网会是制造业数字化发展的未来吗 从这几年的工业互联网发展政策措施 就能看到答案 早在近三年前 工业互联网创新发展行动计划 2021 2023年 就提出了五方面 11项重点行动和10大重点工程 着力解决工业
  • 股指期权开通要什么条件?

    股指期权是一种金融衍生工具 它赋予持有者在未来某一特定日期按照约定的价格买入或卖出标的资产的权利 对于投资者来说 开通股指期权账户需要满足一定的条件 那么股指期权开通要什么条件 本文来自 财顺期权 开通股指期权账户需要的条件是 申请前20个
  • 期权开户最低多少钱个人可以开?

    大家新年好 现在2024年龙年 很多想玩期权的小伙伴都知道期权开通需要50万的门槛 那么今天来给大家详细介绍下期权开户最低多少钱个人可以开 本文将对期权开户最低金额进行探讨 帮助投资者更好地了解期权交易的投资门槛 本文来自 期权酱 一 期权
  • 英国金融时报关注TRX登陆Mercado Bitcoin交易所:波场TRON强化南美洲布局,国际化进程持续加速

    近日 波场TRON网络原生代币TRX正式上线巴西最大的合规加密交易所Mercado Bitcoin 英国金融时报 Decrypt Blockworks等财经及加密行业权威媒体对该话题进行了报道 表示此次合作是波场TRON全球业务增长的有力证

随机推荐

  • ML2 Plugin框架说明

    在H版本中 ML2 Plugin被添加意图取代所有的Core Plugin 它采用了更加灵活的结构进行实现 下图即为ML2 Plugin的实现框架 作为一个Core Plugin ML2自然会实现network subnet port三种核
  • SpringBoot入门到精通(十一):整合Swagger3.0-定制RESTful与统一接口返回值

    整合Swagger3 0 定制RESTful与统一接口返回值 一 整合Swagger3 0 随着Spring Boot Spring Cloud等微服务的流行 在微服务的设计下 小公司微服务工程jar小的几十个 大公司大的工程拆分jar多则
  • C到C++的升级

    前言 C到C 的升级 是一次很有利的升级 他从一个面向过程的语言走向了一个面向对象的语言 他是对C很多的优化 解决了C中存在的许多不合适的地方 他的两个加号 一个是增加了新的类型 一个是增加了面向对象 他是对效率的一种提升 C当时的设计主要
  • 如何进行性能分析

    一 性能分析的常用手段 1 空间换时间 利用内存缓存从磁盘上取出的数据 CPU可以直接访问内存 从而比从磁盘读取数据更高的效率 2 时间换空间 当空间成为瓶颈的时候 切开数据分批次处理 用更少空间完成任务的处理 3 分而治之 把任务切分 分
  • C++ 中的sort()排序函数原理、用法看这一篇就够了

    C 中的sort 排序函数原理 用法用法看这一篇就够了 sort first pointer first pointer n cmp 该函数可以给数组 或者链表list 向量排序 原理 sort并不是简单的快速排序 它对快速排序进行了优化
  • CT2A

    1 CString转为char char szAsciiIP 64 memcpy szAsciiIP CT2A m pEncoder gt m strIP sizeof szAsciiIP 2 详见MSDN http msdn micros
  • 异地远程访问本地SQL Server数据库【无公网IP内网穿透】

    iOS开发上架主页 在强者的眼中 没有最好 只有更好 我们是移动开发领域的优质创作者 同时也是阿里云专家博主 关注我们的主页 探索iOS开发的无限可能 我们与您分享最新的技术洞察和实战经验 助您在移动应用开发领域取得成功 欢迎访问我们的微信
  • CheckReturn(检查返回值)

    Loki库提供了一种方法 要求函数返回后 使用者必须对其进行检查或则赋值 以必须判断指针为例进行说明 自己写的代码简化了很多 CheckReturn h pragma once include
  • TSubclassOf

    在蓝图或C 层面调用SpawnActor创建一个actor对象 或者调用SpawnActorDeferred 延迟创建一个actor对象时 都需要一个class类型的参数 如果在C 层面 对象类型是我们自己在蓝图里做的蓝图类 那么C 层面需
  • 【智能优化算法】基于败者淘汰机制的烟花算法LOTFWA求解单目标烟花优化问题附matlab代码...

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 作为一种新兴的群体智能优化算法 烟花算法通过模拟烟花在空中爆炸产生火花的过程来进行最
  • 软件工程作业四

    2 用面向数据流的方法设计下列系统的软件结构 1 储蓄系统 参见习题2第2题
  • webpack学习4:热模替换、devtool、准备生产环境、清除打包文件目录

    热模替换功能 之前的webpack dev server是全部刷新 热模替换是局部刷新 详细配置见官网 指南 gt 模块热替换 修改devServer配置devServer contentBase resolve dirname build
  • Solr 实体嵌套

    公司主要测业务是 城市档案馆建设 一份案卷包含一个或多个业务实现 现在需要solr 索引库能够已经相关业务事项的 证号 单位 来进行相关功能检索 相关功能业务实现 以案卷为主表嵌套其他业务事项表 在solr的 data config xml
  • jmeter用循环控制器和计数器,直接查询数据库获取数据作为后续接口的参数

    一 导入mysql驱动jar包 二 添加线程组 jdbc配置文件 三 添加jdbc请求 设置参数变量 四 添加循环控制器 然后在其中加入计数器如下 五 用函数助手生成 V buyer code M 和 V buyer shortname N
  • 蓝桥杯JAVA B组 2022第四题 最少刷题数

    一 题目描述 二 思路分析 1 对输入的刷题数进行排序 2 分情况考虑 奇数情况下 超过中间值才能满足全班刷题比他多的学生数不超过刷题比他少的学生数 偶数情况下需要等于中间偏大的值就可以满足条件 三 代码 import java util
  • 西门子s300编程实例_plc西门子s300编程 西门子编程1000例

    西门子PLCS 200与S300 400系列编程电缆可以同意吗 西门子PLC S 200与S300 400系列编程电缆 如果是USB原装的 可以通用 价格2000元左右 西门子PLC S 200编程线型号PC PPI或者USB PPI 山寨
  • React 窗口防抖

    假如有这种需求 浏览器的窗口不断缩小变大 此时页面的布局不会自动刷新 需要手动刷新页面才会自适应大小 此时我们立马就会想到使用windows的onresize方法 window onresize gt 重新渲染画面 root render
  • 一起学nRF51xx 22 -  实现一个具体SVC调用功能的demo

    前言 上一节 一起学nRF51xx 21 蓝牙项目工程的初始化流程解读 讲到nordic的蓝牙协议栈是通过SVC来实现APP与协议栈之间通接口调用的 那么如何来实现一个具体SVC调用功能的程序呢 本节将带大家解决这个问题 示例详解 基于硬件
  • 【Python实战】数据预处理(数据清理、集成、变换、归约)

    Python实战 数据预处理 前言 数据预处理概述 数据清理 异常数据处理 1 异常数据分析 2 异常数据处理方法 缺失值处理 噪声数据处理 数据集成 1 实体识别 2 冗余属性 3 数据不一致 数据变换 1 使用简单的数学函数对数据进行变
  • 可验证延迟函数(VDF)

    干货 可验证延迟函数 VDF 自从以太坊将可验证延迟函数 Verifiable Delay Function VDF 列入研究计划并打算在以太坊 2 0 使用之后 VDF 得到了广泛的关注 VDF 这个概念最初由斯坦福大学密码学教授 Dan