激励诚信,社会共和。

Pre Knowledge

(公钥)数字签名

Merkle Tree

就是一棵二叉树,根节点是 Hash(Hash0, Hash1),子节点为 Hashi = hash(Hash_leftson, Hash_rightson), 最终归结为节点 Hash(Li) <- Li这样;如果只有奇数个叶子节点,最后的节点将被复制一份以构成偶数个。其优势在于:寻找某个文件出错 $O(log(n))$;只需验证根哈希是否一致即可验证所有数据是否相同。

对比特币资料的一些想法

怎么说呢,感觉还差点味儿。

顺序并不一定按照原文叙述,很多内容是直接摘抄的译文。

主要参考:比特币白皮书译文、《精通比特币》中文译本

http://www.idgui.com/wiki/bitcoin-a-peer-to-peer-electronic-cash-system/、https://zhuanlan.zhihu.com/p/25039679、https://bitcoinbook.info/wp-content/translations/cmn/book.pdf

比特币

transaction

如图所示,定义:一枚电子货币,即一串数字签名。(但事实上并不存在所谓的比特币余额,其实质是分散到区块链上的UTXO(未花费的交易输出))该电子货币的交易内容如下:

​ 所有者A对 该货币的前一次交易和其下一位拥有者B的公钥 签署一个随机散列的数字签名,并将该签名附于该货币末尾。这样就达成了 A 向 B 发送货币的过程。

由安全问题引出:

区块链

前文所提解决方案从时间戳服务器谈起:时间戳服务器通过对以 区块形式存在的一组数据 实施随机散列及加盖上时间戳,并将其广播。每个时间戳应当将前一个时间戳纳入其散列值中,这样,每个后来的时间戳都将对之前的一个进行加强,从而形成一条链。

times

工作量证明 (PoW)

??感觉这玩意弄得不太好?

每个人收到的交易信息和时间不完全一致。如果我们要让大多数节点对某个特定的历史交易记录达成共识,那么总需要某个方式生成当前区块,并让大多数节点都达成共识。于是引入工作量证明,使某个节点获得记账权,并使得大家都认可:这就是新的区块。

pow

货币来源

激励

白皮书中提到,该机制有助于鼓励节点保持诚实:攻击者将发现按规则行事,城市工作更有利可图。

??存疑

??对激励机制,知乎上存疑:激励是否效果和代价不匹配,从而容易造成算力断崖式下跌,btc信用崩溃

交易费

交易费不是强制性的,它相当于一种鼓励机制——这意味着交易费影响处理优先级,多付交易费容易优先处理,没有交易费的交易也可能最终被处理。它与参与交易的比特币值无关,而是由交易的复杂程度、尺寸大小来决定的,起初是一个固定常数,但其结构逐渐被放宽,在2014年的最小交易费被固定在每千字节 0.0001btc。一般来说,钱包会通过测量交易的大小乘每千字节所需的交易费,自动计算适当的交易费用。

价值的组合和分割

为了使得价值易于组合与分割,交易被设计为可以纳入多个输入和输出。一般而言是某次价值较大的前次交易构成的单一输入,或者由某几个价值较小的前次交易共同构成的并行输入,但是输出最多只有两个:一个用于支付,另一个用于找零(如有,指返回购买者;每个UTXO无法少量多次交易)。(创币区块就相当于只有input,没有output)

交易

交易块龄、矿工费和优先级

每个比特币节点需要为交易池中的每笔交易分配一个优先级,选择较高级的交易记录来构建候选区块。交易的优先级是由交易输入所花费的UTXO的“块龄”决定的,交易输出值高、“块龄”大的交易比那些输出值小的、新的交易拥有更高的优先级。如果区块中有足够的空间,高优先级的交易行为将不需要矿工费。

交易的优先级通过输入值和输入的“块龄”乘积之和除以交易的总长度来得到,具体计算公式见《精通比特币》8.5.1。

区块中用来存储交易的前 50K 字节是保留给较高优先级交易的,不管他们是否包含了矿工费;然后选出那些包含最小矿工费的交易,并按照“每千字节矿工费”进行排序,优先选择矿工费高的交易来填充剩下的区块;如果还有剩余空间,节点可以选择那些不含矿工费的交易。(区块大小上限为 MAX_BLOCK_SIZE

(区块被填满后,池中的剩余交易会成为下一个区块的候选交易,随着新的区块上链,他们的“块龄”也会增大)

比特币交易中一笔交易现在有效,则其永远有效。但若一笔交易只在全网广播过一次,它只会被保存在一个挖矿节点的内存中——一旦该节点重启,内存池中的数据被完全擦除;而且即使一笔有效交易被传播到了全网,却长时间未被处理,它将从挖矿节点的内存池中消失——如果交易本该在一段时间内被处理却没有,那么钱包应当重新发送交易或重新支付更高的矿工费以提高优先度。

如果是全节点要检查某个交易,那它将会从该区块开始一直回溯到创世区块,将其全都链接起来建立一个完整的UTXO数据库,通过确认该UTXO是否还未被支付来证实交易的有效性。

简单的支付确认

(作为轻量级节点,也叫SPV节点,)在不运行完整网络节点的情况下,也能够对支付进行检验。(通过 Merkle Tree)

一个节点需要保留最长的工作量证明链条的区块头的拷贝,从而不断向网络发起询问直到它确信自己拥有最长的链条,并通过 Merkle 路径通向它被加上时间戳并纳入区块的那次交易。节点想要自行检验该交易的有效性原本是不可能的,但通过追溯到链条的某个位置,它就能看到某个节点曾经接受过它,并且于其后追加的区块也进一步证明全网曾经接受了它。一般在该交易所在的区块之上又生成了六个区块,根据代理网关协议,就可以证明该交易不是双重支付。

paymentverify

当此情形,只要诚实的节点控制了网络,检验机制就是可靠的。但是,当全网被一个计算力占优的攻击者攻击时,将变得较为脆弱。因为网络节点能够自行确认交易的有效性——只要攻击者能够持续地保持计算力优势,简化的机制会被攻击者焊接的(fabricated)交易欺骗。

那么一个可行的策略就是,只要他们发现了一个无效的区块,就立刻发出警报,收到警报的用户将立刻开始下载被警告有问题的区块或交易的完整信息,以便对信息的不一致进行判定。对于日常会发生大量收付的商业机构,可能仍会希望运行他们自己的完整节点,以保持较大的独立完全性和检验的快速性。

注:在比特币区块链网络内,此处的”无效“大概指不满足比特币标准客户端下的AcceptToMemoryPool, CheckTransaction, CheckInputs 函数中的条件制定(这些条件是可变动的)。

回收硬盘空间

如果最近的交易已经被纳入了足够多的区块之中,那么就可以丢弃该交易之前的数据,以回收硬盘空间。同时为了确保不损害区块的随机散列值,交易信息被随机散列时,被构建成一棵 Merkle tree,使得只有根被纳入了区块的随机散列值。通过将该树的分支拔除的方法,老区块就能被压缩。而内部的随机散列值是不必保存的。显然这并不影响 Merkle 路径的生成(SPV节点用以确认交易是否在该区块的方法)。

但SPV节点不能验证某个交易不存在,因为它没有所有历史交易的记录。这样的漏洞会被针对SPV节点的拒绝服务攻击或双重支付型攻击所利用。以防御这些攻击,其需要随即连接到多个节点以增加与至少一个可靠节点相连接的概率。(但这种随机连接的需求意味着容易受到网络分区攻击或Sybil攻击,我不知道这些攻击是什么,先列举出来(x)

reclaimdisk

孤立交易

《精通比特币》 5.5

当一条交易链被整个网络传送时,他们并不能总是按照相同的顺序到达目的地。如果节点首先收到了子交易,却无法找到其参考的父交易,其将被放到”孤立交易池“之中,等待父交易的接收并释放、递归地重新验证。但孤立交易池的可存储交易数量是有限的,一旦抵达上限 MAX_ORPHAN_TRANSACTIONS,多个被随机选出的孤立交易将被池抛弃,直到池的大小回到限制以内。

隐私

与传统铸币厂模型(难以向可信第三方机构索取信息)不同,区块链的本质决定其必须公开所有交易信息。(比股票信息稍多一些,透露了各方公钥)风险在于,若确定某个公钥属于某人,则可由此追溯其其他交易。一种预防方案是每次交易生成新的地址。

攻击

共识攻击

只能影响最近的区块,并通过拒绝服务来影响未来区块的生成(未来的共识)。

51%攻击

不承认最近的某个交易,并利用算力在该交易之前重构新块,生成新分叉——新共识链,从而实现双重支付;当这笔支付对应的是不可逆的购买行为,则该种攻击有利可图。

整个系统的前提是,节点不会接受无效交易。由于攻击者只知道自己的私钥,故其最多只能修改自己的交易信息并尝试双花攻击。由于笔者没有二叉树随机漫步等概率方面的知识,此处直接摘录译文:成功事件定义为诚实链条延长了一个区块,使其领先性+1,而失败事件则是攻击者的链条被延长了一个区块,使得差距-1。

atk

假定p>q,那么攻击成功的概率就因为区块数的增长而呈现指数化下降。由于概率是攻击者的敌人,如果他不能幸运且快速地获得成功,那么他获得成功的机会随着时间的流逝就变得愈发渺茫。那么我们考虑一个收款人需要等待多长时间,才能足够确信付款人已经难以更改交易了。我们假设付款人是一个支付攻击者,希望让收款人在一段时间内相信他已经付过款了,然后立即将支付的款项重新支付给自己。虽然收款人届时会发现这一点,但为时已晚。

收款人生成了新的一对密钥组合,然后只预留一个较短的时间将公钥发送给付款人。这将可以防止以下情况:付款人预先准备好一个区块链然后持续地对此区块进行运算,直到运气让他的区块链超越了诚实链条,方才立即执行支付。当此情形,只要交易一旦发出,攻击者就开始秘密地准备一条包含了该交易替代版本的平行链条。

然后收款人将等待交易出现在首个区块中,然后在等到z个区块链接其后。此时,他仍然不能确切知道攻击者已经进展了多少个区块,但是假设诚实区块将耗费平均预期时间以产生一个区块,那么攻击者的潜在进展就是一个泊松分布。相关公式及数据不再摘录,可参考相关译文。

比特币系统后被认为扩展性差,限制较大,于是以太坊诞生了:它考察了在密码学货币上建立高级应用的三种方法:建立一个新的区块链、在比特币区块链上使用脚本、在比特币区块链上建立元币协议。建立新区块链的方法可以自由地实现任意的特性,成本是开发时间和培育努力。使用脚本的方法非常容易实现和标准化,但是它的能力有限。元币协议尽管非常容易实现,但是存在扩展性差的缺陷。在以太坊系统中,其目的是建立一个能够同时具有这三种模式的所有优势的通用框架。

一般来讲,以太坊之上有三种应用:

  1. 金融应用:为用户的资金提供更强大的管理和参与合约的办法。包括子货币、金融衍生品、对冲合约、储蓄钱包、遗嘱,甚至一些种类的全面的雇佣合约。
  2. 半金融应用:金钱和非金钱的方面各据江山,一个完美的例子是为解决计算问题而设的自我强制悬赏。
  3. 非金融应用:如在线投票和去中心化治理。