
零知识证明:从入门到入土
文章共8000字,预计阅读时间30-35分钟。这篇博客的灵感来源于我的好朋友Kokii(Joey),感谢他通俗、详尽且充满趣味的介绍! 在谈论「零知识证明」之前,首先需要明确其定义:证明者(Prover)向验证者(Verifier)证明一个命题成立,同时「不泄露其他任何知识」,这种就被称为「零知识证明」。鉴于「零知识证明」这个词太长,简称「zk」。文章是个人对于zk的理解,欢迎讨论。为什么要zk隐私一个用户如果用过加密货币,就会发现,它并不像传说中的那么「保密」。「不保密」的原因显然,加密货币的信息都在区块链上,任何人都查询的到。虽然比特币等一部分加密货币出于隐私考虑,会给用户分配一个随机的地址,但这更像是「假名」,而不是号称的「匿名」,一旦用户到交易所将加密货币换成了法币,「假名」就和现实中的人对应上了。「假名」就像「风清扬」,初看无意义,但如果某次偶然,你发现「风清扬」对应着马云,之后再看到署名「风清扬」的邮件你就能想到那张大脸。「匿名」像大专院校的「校园墙」,墙上所有消息都是不署名的,对隐私的保护也更强。如果我们需要证明自己在「校园墙」上发过消息,但不想透露发的是什么消息,...

开发智能合约的极简主义配置:vscode+remix+github
⌈工欲善其事,必先利其器⌋,本文将介绍一套极简的智能合约开发配置,只需要vscode、remix和github就能够进行以太坊合约的开发、部署、测试和代码保存,欢迎交流。vscode编辑器下载智能合约开发主要使用solidity语言,本文选用插件丰富的vscode作为编辑器,点击下载vscode。选择合适的下载版本安装插件vscode下载安装后,点击左侧扩展,在上方依次搜索并安装⌈Chinese(Simplified)⌋、⌈Ethereum Remix⌋和⌈solidity⌋三个插件,之后重启vscode。vscode安装插件指定workspace新建一个文件夹作为workspace,vscode重启如下所示,依次⌈打开文件夹⌋-⌈选择新建的文件夹⌋-⌈新建文件⌋-⌈命名XXX.sol⌋,之后就可以正常编写sol文件,⌈solidity⌋插件会提供语法高亮等支持。新建workspace和.sol文件remix合约编写完成后需要remix进行编译、部署和测试。开启本地remix⌈Ethereum Remix⌋-⌈Start remixed client⌋-⌈Start⌋开启本地连接...

纳瓦尔宝典是不是成功学?
我们生活在一个成功学遍地开花的时代,形形色色的人在向我们兜售着成功的秘诀,但其中的大部分人都是靠教人如何成功来攫取财富的,而他们在书中刻意忽略了这一点,这才是他们「成功」的真正秘诀。那么《纳瓦尔宝典》是一本成功学书籍吗?有人认为是,有人认为不是,在这里个人更愿意把它称为「职业生涯指北」。 纳瓦尔宝典中最有价值的部分应该是职业发展,他将职业发展分成三个阶段。第一阶段:以领取月薪的打工者为起点,志存高远;第二阶段:积累杠杆,包括资本杠杆(能够低成本获取资金的人脉等)、劳动力杠杆(熟悉外包)、技术杠杆(代码等零边际成本产品)和影响力杠杆(编织的社群网络);第三阶段:承担责任,提升判断力,充分利用杠杆。 这解释了很多问题,例如有的朋友厌恶重复劳动,选择开一家精品咖啡店,这在纳瓦尔看来就不是一个好生意,因为它并没有利用杠杆。第一没有资本杠杆,因为咖啡店的初始投资一般是来源于创始人的个人积蓄;第二没有劳动力杠杆,很少有咖啡店在一开始就选择雇人,主要是店主提供服务,是自我雇佣;第三没有技术杠杆,这并不是说手冲咖啡没有技术,而是说技术不能够零成本复制,如果咖啡店需要扩张,那么技术将会成为瓶颈;第...
人一生中90%是废话,这里是另外的10% https://linktr.ee/choovybi

零知识证明:从入门到入土
文章共8000字,预计阅读时间30-35分钟。这篇博客的灵感来源于我的好朋友Kokii(Joey),感谢他通俗、详尽且充满趣味的介绍! 在谈论「零知识证明」之前,首先需要明确其定义:证明者(Prover)向验证者(Verifier)证明一个命题成立,同时「不泄露其他任何知识」,这种就被称为「零知识证明」。鉴于「零知识证明」这个词太长,简称「zk」。文章是个人对于zk的理解,欢迎讨论。为什么要zk隐私一个用户如果用过加密货币,就会发现,它并不像传说中的那么「保密」。「不保密」的原因显然,加密货币的信息都在区块链上,任何人都查询的到。虽然比特币等一部分加密货币出于隐私考虑,会给用户分配一个随机的地址,但这更像是「假名」,而不是号称的「匿名」,一旦用户到交易所将加密货币换成了法币,「假名」就和现实中的人对应上了。「假名」就像「风清扬」,初看无意义,但如果某次偶然,你发现「风清扬」对应着马云,之后再看到署名「风清扬」的邮件你就能想到那张大脸。「匿名」像大专院校的「校园墙」,墙上所有消息都是不署名的,对隐私的保护也更强。如果我们需要证明自己在「校园墙」上发过消息,但不想透露发的是什么消息,...

开发智能合约的极简主义配置:vscode+remix+github
⌈工欲善其事,必先利其器⌋,本文将介绍一套极简的智能合约开发配置,只需要vscode、remix和github就能够进行以太坊合约的开发、部署、测试和代码保存,欢迎交流。vscode编辑器下载智能合约开发主要使用solidity语言,本文选用插件丰富的vscode作为编辑器,点击下载vscode。选择合适的下载版本安装插件vscode下载安装后,点击左侧扩展,在上方依次搜索并安装⌈Chinese(Simplified)⌋、⌈Ethereum Remix⌋和⌈solidity⌋三个插件,之后重启vscode。vscode安装插件指定workspace新建一个文件夹作为workspace,vscode重启如下所示,依次⌈打开文件夹⌋-⌈选择新建的文件夹⌋-⌈新建文件⌋-⌈命名XXX.sol⌋,之后就可以正常编写sol文件,⌈solidity⌋插件会提供语法高亮等支持。新建workspace和.sol文件remix合约编写完成后需要remix进行编译、部署和测试。开启本地remix⌈Ethereum Remix⌋-⌈Start remixed client⌋-⌈Start⌋开启本地连接...

纳瓦尔宝典是不是成功学?
我们生活在一个成功学遍地开花的时代,形形色色的人在向我们兜售着成功的秘诀,但其中的大部分人都是靠教人如何成功来攫取财富的,而他们在书中刻意忽略了这一点,这才是他们「成功」的真正秘诀。那么《纳瓦尔宝典》是一本成功学书籍吗?有人认为是,有人认为不是,在这里个人更愿意把它称为「职业生涯指北」。 纳瓦尔宝典中最有价值的部分应该是职业发展,他将职业发展分成三个阶段。第一阶段:以领取月薪的打工者为起点,志存高远;第二阶段:积累杠杆,包括资本杠杆(能够低成本获取资金的人脉等)、劳动力杠杆(熟悉外包)、技术杠杆(代码等零边际成本产品)和影响力杠杆(编织的社群网络);第三阶段:承担责任,提升判断力,充分利用杠杆。 这解释了很多问题,例如有的朋友厌恶重复劳动,选择开一家精品咖啡店,这在纳瓦尔看来就不是一个好生意,因为它并没有利用杠杆。第一没有资本杠杆,因为咖啡店的初始投资一般是来源于创始人的个人积蓄;第二没有劳动力杠杆,很少有咖啡店在一开始就选择雇人,主要是店主提供服务,是自我雇佣;第三没有技术杠杆,这并不是说手冲咖啡没有技术,而是说技术不能够零成本复制,如果咖啡店需要扩张,那么技术将会成为瓶颈;第...
人一生中90%是废话,这里是另外的10% https://linktr.ee/choovybi

Subscribe to choovybi

Subscribe to choovybi
Share Dialog
Share Dialog


<100 subscribers
<100 subscribers
以太坊的目的是创建一个用于建立去中心化应用的替代协议,我们认为提供一套不同的折衷方案对大量去中心化应用非常有用,尤其是那些强调快速开发、小型和不常用应用的安全性,以及应用间高效交互能力的程序。——Vitalik Buterin
比特币之后,市面上出现了许多使用区块链技术的加密货币,但其中的大部分最后都消失了。究其原因,是这些空气币发行之初并没有明确的目标,人们不明白为什么非它不可。与其用XX币,为什么不用比特币呢?这是新生的加密货币都亟需回答的问题。而上面这段Vitalik写在以太坊白皮书中的话,很大程度上解释了人们的疑惑,即“为什么是以太坊”?
抽象的来说,去中心化的加密货币都可以用两个系统来表示:
状态系统
共识系统
其中状态系统包含:状态表示,状态转移;共识系统包含:区块创建、证明方式、激励等等。状态系统用来表示人们转账、支付等经济行为如何改变各自的状态;共识系统用来表示状态的改变如何被公众所认可。
以比特币为例,比特币状态系统的核心是UTXO。比特币的状态表示是指特定地址拥有多少UTXO,而状态转移则是指UTXO被消耗并生成新的UTXO的过程。

比特币使用工作量证明(POW)来进行区块的创建,使用Merkel根来防止交易被篡改,同时加入了“挖矿”激励,人们出于利益驱使会信任包含最多工作量的那条链,这使得“共识”得以产生。
但中本聪在创建比特币时可能是出于匿名性的考虑,使用的是UTXO配合不断变换的地址,而不是使用固定地址的钱包来表示状态,这带来了一些问题:
状态的数量太少:UTXO的状态只能是已使用或未被使用(1或者0)
价值盲:UTXO使用时要么全部使用,要么为0
区块链盲:UTXO看不到区块链上的信息,看到也无用,因为状态数太少没有办法处理这些信息
脚本图灵不完备:比特币虽有脚本语言,但是图灵不完备,脚本无法实现无限循环等功能,运行效率低下
为了应对比特币上述的种种问题,同时也为了创建一个去中心化应用友好的替代协议,以太坊诞生了。
以太坊和比特币系统的差异很大,接下来分状态系统、共识系统这两方面来说,下图是以太坊的结构示意图:

不同于比特币用UTXO来表示状态,以太坊的世界状态由外部账户和合约账户组成,他们都采用普通记账(即余额,而不是UTXO)的方式来记账。
外部账户的地址由公钥哈希产生,外部账户通过私钥可以被外部用户所控制,一般被当作用户存钱的账户;合约账户的地址在创建时刻通过创建者地址和随机数生成,合约账户自动运行无人控制,一般被当作部署自动化应用的账户。
这些世界状态只存在记账节点和验证节点运行的以太坊虚拟机(EVM)中,在区块链中我们只能看到世界状态的默克尔帕特里夏根(MPT root)。
以太坊的状态转移有两种方式:交易和消息。
先说消息,消息是世界状态内账户之间发送的信息,仅仅在 EVM 上存在,消息不会被记录在区块链上。根据发送账户和接受账户的不同,共有四种消息:外部账户-外部账户,外部账户-合约账户,合约账户-外部账户,合约账户-合约账户。
而交易是外部用户发送给以太坊的信息,交易会被记录在区块链上,交易共有两种类型:
合约创建交易:该类型交易,接收者的地址为0,数据部分为“ EVM 合约创建标志符”和初始代码,以太坊节点运行的 EVM 在收到该交易后会按要求创建一个合约账户;
消息调用交易:该类型交易,接收者为160bits地址,数据部分需要提供标志符和消息调用的具体信息(例如图中的输入数据),以太坊节点运行的 EVM 在收到该交易后会按要求往接收者地址所在位置进行消息调用(例如图中“输入数据”更改了合约账户的存储)。
节点的 EVM 在收到交易进行状态转移时会按照以下步骤操作
检测交易是否有效,交易格式是否正确
计算 gas fee,从交易发送账户扣除 gas fee 并增加发送账户的随机数
根据交易中的每个字节,扣除 gas
将交易金额从发送账户转移到接收账户,如果接收账户不存在,创建接收账户;如果接收账户是合约账户,则运行该合约的代码,直到代码运行结束或 gas 耗尽(如果接收账户不是合约账户,只需要付每个字节的 gas)
如果因为 gas 耗尽导致交易失败,回滚所有状态,并把 gas 支付给矿工;如果交易成功,则将剩余 gas 退还给发送账户,消耗的 gas 支付给矿工。
以太坊和比特币在共识系统上的差别没有像在状态系统上那么大,他们都是使用工作量证明 POW(以太坊预计2022年9月中合并成质押证明 POS )来达成共识,即工作量最大的子串最被节点所相信,节点会选择在最长子串上进行挖矿等等。具体可以看之前写的关于比特币的共识系统,这里主要介绍他们共识系统上的不同。
以太坊的节点进行挖矿和验证的过程比比特币更复杂。
以太坊区块验证:
检查父区块是否有效
检查当前时间戳是否有效
检查当前区块的编号、难度、gas、交易根、叔根等是否有效
检查当前区块的工作量证明是否有效
按照上面所提到的步骤,根据区块体中包含的交易进行世界状态转移
最后添加支付给矿工的区块奖励
检查当前区块的状态根和最终状态是否匹配
以太坊节点进行挖矿:
记录父区块
记录当前时间戳
记录当前区块的编号、难度、gas、交易根,添加叔根
进行哈希碰撞来完成工作量证明
根据区块体中包含的交易进行世界状态转移(完成交易、运行智能合约代码)
记录支付给矿工(即挖矿节点自己)的区块奖励
记录当前区块的状态根
广播已完成挖矿的区块
也不同于在比特币中,每个节点只是一个记账本。在以太坊中,每一个节点都运行着一个 EVM 用来实现交易、运行智能合约以实现状态的转移,EVM 无论在状态系统还是共识系统都处在核心位置。EVM 的详细结构在这里不赘述,但需要了解的是,EVM 是图灵完备的,他跟我们日常使用的windows虚拟机的计算能力是一样的。很多人会将以太坊称作“世界计算机”,就是因为每个节点运行一个 EVM 这样的设计。
Valtalik提到,以太坊一个很大的进步在于 EVM 是图灵完备的。我们在电脑上能实现的功能,放到 EVM 上都可以实现,这就使得链上游戏、链上APP等成为了可能。
然而图灵完备的计算机没有办法解决“停机问题”,即:我们无法根据程序的代码描述和输入来判断程序会终止还是会永远运行下去。
“停机问题”无解的证明,基于罗素的“理发师悖论”。
理发师悖论:有一个理发师,只为不给自己理发的所有人理发,那么这位理发师为自己理发吗?如果他为自己理发,那么根据理发师“只为不给自己理发的所有人理发”的原则,他就不给自己理发;如果他不为自己理发,那么根据理发师“只为不给自己理发的所有人理发”的原则,他就为自己理发;均矛盾。
我们先假设“停机问题”有解,即存在一个函数 f 能判断程序是否停机
def f(code):
if (code stops):
return True # 如果code会终止,返回True(停机)
else:
return False # 如果code不终止,返回False
那么我们可以定义另一个函数 g
def g(code):
if (f(code) == True):
while(1) # 如果code会终止,g死循环
if (f(code) == False):
return # 如果code不终止,g返回值
这样我们就获得了一位“理发师”,假设函数 g 的代码我们记作 code_g 。那么 g(code_g) 会怎么样呢?
如果 f(code_g) 返回 True,则说明函数 g 会终止,而此时函数 g while(1) 进入死循环,矛盾
如果 f(code_g) 返回 False,则说明函数 g 不终止,而此时函数 g return 返回了值,矛盾
通过反证法,能得出结论,解决“停机问题”的函数 f 不存在。
EVM 既然是图灵完备的,那么在 EVM 上运行的程序,也是无法事先被判断能否终止的。如果攻击者向网络中注入死循环的恶意程序,就可以迫使矿工卡住,使得节点无法完成处理、验证交易这样的正常功能。
以太坊使用gas fee和回滚机制来解决程序死循环的问题。EVM 上程序每运行一步,都要消耗gas,当gas耗尽程序如果还没有结束运行,则程序会回滚,并且把消耗的gas fee支付给矿工。通过引入gas fee,以太坊使得 EVM 在图灵完备的同时,节点不会被恶意程序卡死,维持了整个以太坊网络的安全。
以太坊认可了叔叔节点,来降低节点产生陈腐区块的风险。在比特币中,假设两个节点同时挖出了当前最新的区块并广播了出去,那么收到广播的其他节点会短暂分叉,然后在新一轮区块挖掘中,必定有一个分叉获胜先挖出了下一区块,这时所有的节点会转移到获胜的分叉上进行挖矿,则失败的分叉就产生了陈腐区块。
当个人算力与网络整体算力相比微乎其微时,个人挖掘的区块大多数情况下都是陈腐区块,在这种情况下,个体挖矿者常常不得不加入一个大的矿池与他人一起挖矿,比特币事实上挖矿层面重新变成了中心化结构。同时,陈腐区块本身也蕴含着庞大的工作量,如果完全忽略陈腐区块,我们对区块链所包含的工作量的估计会出现严重的偏差,这也违背了工作量证明的初衷。
而以太坊允许新区块 B 在创建的时候包含 2-7 代内的叔块 U ,对于区块 B 中的每个叔块 U,区块 B 的矿工获得额外 3.125% 的铸币奖励,而叔块 U 的矿工获得 93.75% 的标准铸币奖励。因为限制了叔块必须是 2-7 代之内,所以以太坊也有效避免了矿工一直在陈腐的分叉上进行挖矿。
正如Vitalik在白皮书中所说的,以太坊为大量去中心化应用提供了一个不同的折衷方案,以太坊通过其强大的 EVM 实现了这一点。但 EVM 的具体结构,以及节点如何运行虚拟机进行交易的验证,在本文中都没有详细展开,因为我认为 EVM 过于重要,且内容非常丰富,值得接下来再写一篇博客来认真描述。
今天就到这里,再见。
subscribe://
以太坊的目的是创建一个用于建立去中心化应用的替代协议,我们认为提供一套不同的折衷方案对大量去中心化应用非常有用,尤其是那些强调快速开发、小型和不常用应用的安全性,以及应用间高效交互能力的程序。——Vitalik Buterin
比特币之后,市面上出现了许多使用区块链技术的加密货币,但其中的大部分最后都消失了。究其原因,是这些空气币发行之初并没有明确的目标,人们不明白为什么非它不可。与其用XX币,为什么不用比特币呢?这是新生的加密货币都亟需回答的问题。而上面这段Vitalik写在以太坊白皮书中的话,很大程度上解释了人们的疑惑,即“为什么是以太坊”?
抽象的来说,去中心化的加密货币都可以用两个系统来表示:
状态系统
共识系统
其中状态系统包含:状态表示,状态转移;共识系统包含:区块创建、证明方式、激励等等。状态系统用来表示人们转账、支付等经济行为如何改变各自的状态;共识系统用来表示状态的改变如何被公众所认可。
以比特币为例,比特币状态系统的核心是UTXO。比特币的状态表示是指特定地址拥有多少UTXO,而状态转移则是指UTXO被消耗并生成新的UTXO的过程。

比特币使用工作量证明(POW)来进行区块的创建,使用Merkel根来防止交易被篡改,同时加入了“挖矿”激励,人们出于利益驱使会信任包含最多工作量的那条链,这使得“共识”得以产生。
但中本聪在创建比特币时可能是出于匿名性的考虑,使用的是UTXO配合不断变换的地址,而不是使用固定地址的钱包来表示状态,这带来了一些问题:
状态的数量太少:UTXO的状态只能是已使用或未被使用(1或者0)
价值盲:UTXO使用时要么全部使用,要么为0
区块链盲:UTXO看不到区块链上的信息,看到也无用,因为状态数太少没有办法处理这些信息
脚本图灵不完备:比特币虽有脚本语言,但是图灵不完备,脚本无法实现无限循环等功能,运行效率低下
为了应对比特币上述的种种问题,同时也为了创建一个去中心化应用友好的替代协议,以太坊诞生了。
以太坊和比特币系统的差异很大,接下来分状态系统、共识系统这两方面来说,下图是以太坊的结构示意图:

不同于比特币用UTXO来表示状态,以太坊的世界状态由外部账户和合约账户组成,他们都采用普通记账(即余额,而不是UTXO)的方式来记账。
外部账户的地址由公钥哈希产生,外部账户通过私钥可以被外部用户所控制,一般被当作用户存钱的账户;合约账户的地址在创建时刻通过创建者地址和随机数生成,合约账户自动运行无人控制,一般被当作部署自动化应用的账户。
这些世界状态只存在记账节点和验证节点运行的以太坊虚拟机(EVM)中,在区块链中我们只能看到世界状态的默克尔帕特里夏根(MPT root)。
以太坊的状态转移有两种方式:交易和消息。
先说消息,消息是世界状态内账户之间发送的信息,仅仅在 EVM 上存在,消息不会被记录在区块链上。根据发送账户和接受账户的不同,共有四种消息:外部账户-外部账户,外部账户-合约账户,合约账户-外部账户,合约账户-合约账户。
而交易是外部用户发送给以太坊的信息,交易会被记录在区块链上,交易共有两种类型:
合约创建交易:该类型交易,接收者的地址为0,数据部分为“ EVM 合约创建标志符”和初始代码,以太坊节点运行的 EVM 在收到该交易后会按要求创建一个合约账户;
消息调用交易:该类型交易,接收者为160bits地址,数据部分需要提供标志符和消息调用的具体信息(例如图中的输入数据),以太坊节点运行的 EVM 在收到该交易后会按要求往接收者地址所在位置进行消息调用(例如图中“输入数据”更改了合约账户的存储)。
节点的 EVM 在收到交易进行状态转移时会按照以下步骤操作
检测交易是否有效,交易格式是否正确
计算 gas fee,从交易发送账户扣除 gas fee 并增加发送账户的随机数
根据交易中的每个字节,扣除 gas
将交易金额从发送账户转移到接收账户,如果接收账户不存在,创建接收账户;如果接收账户是合约账户,则运行该合约的代码,直到代码运行结束或 gas 耗尽(如果接收账户不是合约账户,只需要付每个字节的 gas)
如果因为 gas 耗尽导致交易失败,回滚所有状态,并把 gas 支付给矿工;如果交易成功,则将剩余 gas 退还给发送账户,消耗的 gas 支付给矿工。
以太坊和比特币在共识系统上的差别没有像在状态系统上那么大,他们都是使用工作量证明 POW(以太坊预计2022年9月中合并成质押证明 POS )来达成共识,即工作量最大的子串最被节点所相信,节点会选择在最长子串上进行挖矿等等。具体可以看之前写的关于比特币的共识系统,这里主要介绍他们共识系统上的不同。
以太坊的节点进行挖矿和验证的过程比比特币更复杂。
以太坊区块验证:
检查父区块是否有效
检查当前时间戳是否有效
检查当前区块的编号、难度、gas、交易根、叔根等是否有效
检查当前区块的工作量证明是否有效
按照上面所提到的步骤,根据区块体中包含的交易进行世界状态转移
最后添加支付给矿工的区块奖励
检查当前区块的状态根和最终状态是否匹配
以太坊节点进行挖矿:
记录父区块
记录当前时间戳
记录当前区块的编号、难度、gas、交易根,添加叔根
进行哈希碰撞来完成工作量证明
根据区块体中包含的交易进行世界状态转移(完成交易、运行智能合约代码)
记录支付给矿工(即挖矿节点自己)的区块奖励
记录当前区块的状态根
广播已完成挖矿的区块
也不同于在比特币中,每个节点只是一个记账本。在以太坊中,每一个节点都运行着一个 EVM 用来实现交易、运行智能合约以实现状态的转移,EVM 无论在状态系统还是共识系统都处在核心位置。EVM 的详细结构在这里不赘述,但需要了解的是,EVM 是图灵完备的,他跟我们日常使用的windows虚拟机的计算能力是一样的。很多人会将以太坊称作“世界计算机”,就是因为每个节点运行一个 EVM 这样的设计。
Valtalik提到,以太坊一个很大的进步在于 EVM 是图灵完备的。我们在电脑上能实现的功能,放到 EVM 上都可以实现,这就使得链上游戏、链上APP等成为了可能。
然而图灵完备的计算机没有办法解决“停机问题”,即:我们无法根据程序的代码描述和输入来判断程序会终止还是会永远运行下去。
“停机问题”无解的证明,基于罗素的“理发师悖论”。
理发师悖论:有一个理发师,只为不给自己理发的所有人理发,那么这位理发师为自己理发吗?如果他为自己理发,那么根据理发师“只为不给自己理发的所有人理发”的原则,他就不给自己理发;如果他不为自己理发,那么根据理发师“只为不给自己理发的所有人理发”的原则,他就为自己理发;均矛盾。
我们先假设“停机问题”有解,即存在一个函数 f 能判断程序是否停机
def f(code):
if (code stops):
return True # 如果code会终止,返回True(停机)
else:
return False # 如果code不终止,返回False
那么我们可以定义另一个函数 g
def g(code):
if (f(code) == True):
while(1) # 如果code会终止,g死循环
if (f(code) == False):
return # 如果code不终止,g返回值
这样我们就获得了一位“理发师”,假设函数 g 的代码我们记作 code_g 。那么 g(code_g) 会怎么样呢?
如果 f(code_g) 返回 True,则说明函数 g 会终止,而此时函数 g while(1) 进入死循环,矛盾
如果 f(code_g) 返回 False,则说明函数 g 不终止,而此时函数 g return 返回了值,矛盾
通过反证法,能得出结论,解决“停机问题”的函数 f 不存在。
EVM 既然是图灵完备的,那么在 EVM 上运行的程序,也是无法事先被判断能否终止的。如果攻击者向网络中注入死循环的恶意程序,就可以迫使矿工卡住,使得节点无法完成处理、验证交易这样的正常功能。
以太坊使用gas fee和回滚机制来解决程序死循环的问题。EVM 上程序每运行一步,都要消耗gas,当gas耗尽程序如果还没有结束运行,则程序会回滚,并且把消耗的gas fee支付给矿工。通过引入gas fee,以太坊使得 EVM 在图灵完备的同时,节点不会被恶意程序卡死,维持了整个以太坊网络的安全。
以太坊认可了叔叔节点,来降低节点产生陈腐区块的风险。在比特币中,假设两个节点同时挖出了当前最新的区块并广播了出去,那么收到广播的其他节点会短暂分叉,然后在新一轮区块挖掘中,必定有一个分叉获胜先挖出了下一区块,这时所有的节点会转移到获胜的分叉上进行挖矿,则失败的分叉就产生了陈腐区块。
当个人算力与网络整体算力相比微乎其微时,个人挖掘的区块大多数情况下都是陈腐区块,在这种情况下,个体挖矿者常常不得不加入一个大的矿池与他人一起挖矿,比特币事实上挖矿层面重新变成了中心化结构。同时,陈腐区块本身也蕴含着庞大的工作量,如果完全忽略陈腐区块,我们对区块链所包含的工作量的估计会出现严重的偏差,这也违背了工作量证明的初衷。
而以太坊允许新区块 B 在创建的时候包含 2-7 代内的叔块 U ,对于区块 B 中的每个叔块 U,区块 B 的矿工获得额外 3.125% 的铸币奖励,而叔块 U 的矿工获得 93.75% 的标准铸币奖励。因为限制了叔块必须是 2-7 代之内,所以以太坊也有效避免了矿工一直在陈腐的分叉上进行挖矿。
正如Vitalik在白皮书中所说的,以太坊为大量去中心化应用提供了一个不同的折衷方案,以太坊通过其强大的 EVM 实现了这一点。但 EVM 的具体结构,以及节点如何运行虚拟机进行交易的验证,在本文中都没有详细展开,因为我认为 EVM 过于重要,且内容非常丰富,值得接下来再写一篇博客来认真描述。
今天就到这里,再见。
subscribe://
No activity yet