激励诚信,社会共和。
Pre Knowledge
(公钥)数字签名
- 概念:唯有信息的发送者A可产生的,他人无法伪造的一段字符串。
- 生成:$Sign = Sign(H(Plaintext),PriKey_A),messsage = Sign\arrowvert Plaintext$
- 验证:$Verify(Sign,PubKey_A) == H(Plaintext)$
- 作用(特征):
- 报文鉴别:接收者B可以核实发送者对报文的签名。(公开 Pub_A、不同报文的摘要(几乎)不相等)
- 报文的完整性:接收者B不可伪造该签名,或更改报文内容。(他人不知道 Pri_A)
- 不可否认:发送者A事后无法抵赖(对报文的签名)。(只有 A 自己知道 Pri_A)
- 时间戳:(除了对内容和发送方的不可抵赖,)保证了对时间因素的不可抵赖性。
- 由于用户时间易变、不可信赖,故经权威第三方提供数字时间戳服务(DTS)。由于第三方可信,故上述三大作用适用。
- 组成部分:
- 需加时间戳的文件的摘要;
- DTS收到文件的日期和时间;
- DTS的数字签名。
- 产生过程:用户首先将需要加时间戳的文件用Hash编码形成摘要,然后将该摘要发送到DTS,DTS在加入了收到文件摘要的日期和时间信息后再对该文件加密(数字签名),然后送回用户。
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
比特币
- 概念:一种去中心化的(无需第三方担保,直觉如现金的流通一般)完全直接由一方发起并支付给另一方(P2P)的电子现金系统。
如图所示,定义:一枚电子货币,即一串数字签名。(但事实上并不存在所谓的比特币余额,其实质是分散到区块链上的UTXO(未花费的交易输出))该电子货币的交易内容如下:
所有者 A 对 (该货币的前一次交易, 其下一位拥有者B的公钥) 签署一个随机散列的数字签名,并将该签名附于该货币末尾。这样就达成了 A 向 B 发送货币的过程。
- 安全性:(只能确保交易过程本身无误,但)无法确保同一枚货币未被进行双重支付。
-
双重支付的隐患:(在大家都会验证交易本身是否有效的前提下,)攻击者只能对自己所有的货币进行利用。(他只有自己的私钥)
- 通常的解决方案:由可信赖的第三方担保/中心化机构(铸币厂)校验。但当(大家)对这种单一的机构出现信任危机时,交易系统出现问题。(在这样的网络中,其本身至少存在(容许)一个缺点:欺诈与退款风险)
- 该系统解决方案:(基于去中心化这一起因,)让所有参与者对某唯一的历史交易序列达成共识。(也即所有参与者本身充当了铸币厂的角色)
-
由安全问题引出:
-
即时性:比特币网络中,基于PoW的共识机制,及当前区块的合法性取决于下一个区块是否认可这两点使得交易确定速度缓慢。
《精通比特币》中述道,比特币将区块间隔设计为10分钟(动态调整难度),是在更快速的交易确认和更低的分叉概率间做出的妥协:更短的区块产生间隔会让交易清算更快地完成,也会导致出现更加频繁的区块链分叉现象;与之相对地,更长的间隔会减少分叉数量,却会导致更长的清算时间。
-
隐私性:见后。
- 区块链不可能三角:安全性、效率、去中心化
区块链
-
在确保所有交易有效的前提下,以激励机制分散货币、节点尽可能向网络中传播信息,并以共识机制确认链的顺序序列,(理想状态下)所有参与节点本身自觉维护整个交易系统的公正性与稳定性。(去中心化信任网络)
-
??货币发行机构是否充当(怎样的)角色?我觉得这个创意(区块链)在货币交易上的表现不够好
链
前文所提解决方案从时间戳服务器谈起:时间戳服务器通过对以 区块形式存在的一组数据 实施随机散列并加盖上时间戳,将其广播。每个时间戳应当将前一个时间戳纳入其散列值中,这样,每个后来的时间戳都将对之前的一个进行加强,从而形成一条链。
工作量证明 (PoW)
??感觉这玩意弄得不太好?
每个人收到的交易信息和时间不完全一致。如果我们要让大多数节点对某个特定的历史交易记录达成共识,那么总需要某个方式去生成当前区块,并让大多数节点都达成共识。于是引入工作量证明,使某个节点获得记账权,并使得大家都认可:这就是新的区块。
- 概念:在区块中增加一个成分:随机数(Nonce)。通过反复尝试找到某个Nonce使得该区块的哈希值由很多个0开始 (如 hash(block).hexdigest().startswith(b’000…’)) )。这样我们就构建了一个工作量证明机制。
- 只要该节点耗费的工作量能够满足之,那么,除非重新完成相当的工作量,否则该区块的信息就不可更改。由于之后的区块链接于该区块之后,故希望更改某个区块的信息(由于之后区块的成分会变化),则必须完成其后所有区块的全部工作量。
- 用于解决如何确定唯一历史交易记录的问题。作为一种共识机制,它也防止了多数的攻击。(一旦攻击者想要更改(在最长链上)某个区块的信息,则其需与所有的共识节点相竞争,这就导致了 51% 攻击)
- 缺点:工作量证明的难度需要动态适应区块生成的速度、难以保证链的增长速度(即时性)。
-
区块链网络:
1) 新的交易向全网进行广播;
2) 每一个节点都将收到的交易信息纳入一个区块中;(不完全一致)
3) 每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;(可以是其他的共识机制)
4) 当一个节点找到了一个工作量证明,它就向全网进行广播;
5) 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过(非双重支付)的,其他(共识)节点才认同该区块的有效性;
6) 其他节点表示他们接受该区块,而表示接受的方法,则是在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机散列值视为先于新区块的随机散列值。
-
共识节点始终以最长链视为正确链,并以其为工作基础。若有多个节点同时广播不同版本的新区块,其将以首先的区块作为工作基础,并保留其他链条(置于各自维护的待检验交易池中),直到下一个PoW被发现并证实某一链为较长的;所有节点将开始在较长链上工作。这里:当下一个区块被确定,当前区块才称之”合法“。
-
(1) 中所述”全网广播“只要交易信息能够抵达足够多的节点即可。若有被丢弃的信息(没有收到的区块),节点将可以提出下载该确实区块的请求。
- 每个节点在传播每一笔交易前均进行独立验证,无效的交易将会在第一个节点处废弃。(这里似乎可能导致拒绝服务攻击,第一个节点恶意drop正常交易)
- 新节点如何发现网络中的对等节点:客户端会维持一个列表,列出长期稳定运行的节点(被称为”种子节点“)。如果和它们建立连接,好处在于能够通过其快速发现网络中的其他节点。
-
货币来源
激励
- 创币区块:约定每个区块的第一笔交易特殊化,产生一枚由该区块创造者拥有的新的电子货币。(Pow 的一种奖励)
- 交易费:如果某笔交易的输出值小于输入值,差额就是交易费,将被增加到该区块的激励之中。(流通的电子货币数量既定,则激励机制可逐渐转为完全依靠交易费,从而免于通货膨胀)
白皮书中提到,该机制有助于鼓励节点保持诚实:攻击者将发现按规则行事,城市工作更有利可图。
??存疑
??对激励机制,知乎上存疑:激励是否效果和代价不匹配,从而容易造成算力断崖式下跌,btc信用崩溃
交易费
交易费不是强制性的,它相当于一种鼓励机制——这意味着交易费影响处理优先级,多付交易费容易优先处理,没有交易费的交易也可能最终被处理。它与参与交易的比特币值无关,而是由交易的复杂程度、尺寸大小来决定的,起初是一个固定常数,但其结构逐渐被放宽,在2014年的最小交易费被固定在每千字节 0.0001btc。一般来说,钱包会通过测量交易的大小乘每千字节所需的交易费,自动计算适当的交易费用。
价值的组合和分割
为了使得价值易于组合与分割,交易被设计为可以纳入多个输入和输出。一般而言是某次价值较大的前次交易构成的单一输入,或者由某几个价值较小的前次交易共同构成的并行输入,但是输出最多只有两个:一个用于支付,另一个用于找零(如有,指返回购买者;每个UTXO无法少量多次交易)。(创币区块就相当于只有input,没有output)
交易
交易块龄、矿工费和优先级
每个比特币节点需要为交易池中的每笔交易分配一个优先级,选择较高级的交易记录来构建候选区块。交易的优先级是由交易输入所花费的UTXO的“块龄”决定的,交易输出值高、“块龄”大的交易比那些输出值小的、新的交易拥有更高的优先级。如果区块中有足够的空间,高优先级的交易行为将不需要矿工费。
交易的优先级通过输入值和输入的“块龄”乘积之和除以交易的总长度来得到,具体计算公式见《精通比特币》8.5.1。
区块中用来存储交易的前 50K 字节是保留给较高优先级交易的,不管他们是否包含了矿工费;然后选出那些包含最小矿工费的交易,并按照“每千字节矿工费”进行排序,优先选择矿工费高的交易来填充剩下的区块;如果还有剩余空间,节点可以选择那些不含矿工费的交易。(区块大小上限为 MAX_BLOCK_SIZE
)
(区块被填满后,池中的剩余交易会成为下一个区块的候选交易,随着新的区块上链,他们的“块龄”也会增大)
比特币交易中一笔交易现在有效,则其永远有效。但若一笔交易只在全网广播过一次,它只会被保存在一个挖矿节点的内存中——一旦该节点重启,内存池中的数据被完全擦除;而且即使一笔有效交易被传播到了全网,却长时间未被处理,它将从挖矿节点的内存池中消失——如果交易本该在一段时间内被处理却没有,那么钱包应当重新发送交易或重新支付更高的矿工费以提高优先度。
- 全节点:包括路由、区块链数据库、挖矿、钱包这四大服务集合。它保有一份完整的、最新的区块链拷贝,能够独立自主地校验所有交易。
- 轻量级节点(SPV节点):只保留了区块链的一部分,通过”简易支付验证(SPV)“来完成交易验证。
如果是全节点要检查某个交易,那它将会从该区块开始一直回溯到创世区块,将其全都链接起来建立一个完整的UTXO数据库,通过确认该UTXO是否还未被支付来证实交易的有效性。
简单的支付确认
(作为轻量级节点,也叫SPV节点,)在不运行完整网络节点的情况下,也能够对支付进行检验。(通过 Merkle Tree)
一个节点需要保留最长的工作量证明链条的区块头的拷贝,从而不断向网络发起询问直到它确信自己拥有最长的链条,并通过 Merkle 路径通向它被加上时间戳并纳入区块的那次交易。节点想要自行检验该交易的有效性原本是不可能的,但通过追溯到链条的某个位置,它就能看到某个节点曾经接受过它,并且于其后追加的区块也进一步证明全网曾经接受了它。一般在该交易所在的区块之上又生成了六个区块,根据代理网关协议,就可以证明该交易不是双重支付。
当此情形,只要诚实的节点控制了网络,检验机制就是可靠的。但是,当全网被一个计算力占优的攻击者攻击时,将变得较为脆弱。因为网络节点能够自行确认交易的有效性——只要攻击者能够持续地保持计算力优势,简化的机制会被攻击者焊接的(fabricated)交易欺骗。
那么一个可行的策略就是,只要他们发现了一个无效的区块,就立刻发出警报,收到警报的用户将立刻开始下载被警告有问题的区块或交易的完整信息,以便对信息的不一致进行判定。对于日常会发生大量收付的商业机构,可能仍会希望运行他们自己的完整节点,以保持较大的独立完全性和检验的快速性。
注:在比特币区块链网络内,此处的”无效“大概指不满足比特币标准客户端下的AcceptToMemoryPool
, CheckTransaction
, CheckInputs
函数中的条件制定(这些条件是可变动的)。
回收硬盘空间
如果最近的交易已经被纳入了足够多的区块之中,那么就可以丢弃该交易之前的数据,以回收硬盘空间。同时为了确保不损害区块的随机散列值,交易信息被随机散列时,被构建成一棵 Merkle tree,使得只有根被纳入了区块的随机散列值。通过将该树的分支拔除的方法,老区块就能被压缩。而内部的随机散列值是不必保存的。显然这并不影响 Merkle 路径的生成(SPV节点用以确认交易是否在该区块的方法)。
但SPV节点不能验证某个交易不存在,因为它没有所有历史交易的记录。这样的漏洞会被针对SPV节点的拒绝服务攻击或双重支付型攻击所利用。以防御这些攻击,其需要随即连接到多个节点以增加与至少一个可靠节点相连接的概率。(但这种随机连接的需求意味着容易受到网络分区攻击或Sybil攻击,我不知道这些攻击是什么,先列举出来(x)
孤立交易
《精通比特币》 5.5
当一条交易链被整个网络传送时,他们并不能总是按照相同的顺序到达目的地。如果节点首先收到了子交易,却无法找到其参考的父交易,其将被放到”孤立交易池“之中,等待父交易的接收并释放、递归地重新验证。但孤立交易池的可存储交易数量是有限的,一旦抵达上限 MAX_ORPHAN_TRANSACTIONS
,多个被随机选出的孤立交易将被池抛弃,直到池的大小回到限制以内。
隐私
与传统铸币厂模型(难以向可信第三方机构索取信息)不同,区块链的本质决定其必须公开所有交易信息。(比股票信息稍多一些,透露了各方公钥)风险在于,若确定某个公钥属于某人,则可由此追溯其其他交易。一种预防方案是每次交易生成新的地址。
攻击
共识攻击
只能影响最近的区块,并通过拒绝服务来影响未来区块的生成(未来的共识)。
51%攻击
不承认最近的某个交易,并利用算力在该交易之前重构新块,生成新分叉——新共识链,从而实现双重支付;当这笔支付对应的是不可逆的购买行为,则该种攻击有利可图。
整个系统的前提是,节点不会接受无效交易。由于攻击者只知道自己的私钥,故其最多只能修改自己的交易信息并尝试双花攻击。由于笔者没有二叉树随机漫步等概率方面的知识,此处直接摘录译文:成功事件定义为诚实链条延长了一个区块,使其领先性+1,而失败事件则是攻击者的链条被延长了一个区块,使得差距-1。
假定p>q,那么攻击成功的概率就因为区块数的增长而呈现指数化下降。由于概率是攻击者的敌人,如果他不能幸运且快速地获得成功,那么他获得成功的机会随着时间的流逝就变得愈发渺茫。那么我们考虑一个收款人需要等待多长时间,才能足够确信付款人已经难以更改交易了。我们假设付款人是一个支付攻击者,希望让收款人在一段时间内相信他已经付过款了,然后立即将支付的款项重新支付给自己。虽然收款人届时会发现这一点,但为时已晚。
收款人生成了新的一对密钥组合,然后只预留一个较短的时间将公钥发送给付款人。这将可以防止以下情况:付款人预先准备好一个区块链然后持续地对此区块进行运算,直到运气让他的区块链超越了诚实链条,方才立即执行支付。当此情形,只要交易一旦发出,攻击者就开始秘密地准备一条包含了该交易替代版本的平行链条。
然后收款人将等待交易出现在首个区块中,然后在等到z个区块链接其后。此时,他仍然不能确切知道攻击者已经进展了多少个区块,但是假设诚实区块将耗费平均预期时间以产生一个区块,那么攻击者的潜在进展就是一个泊松分布。相关公式及数据不再摘录,可参考相关译文。
比特币系统后被认为扩展性差,限制较大,于是以太坊诞生了:它考察了在密码学货币上建立高级应用的三种方法:建立一个新的区块链、在比特币区块链上使用脚本、在比特币区块链上建立元币协议。建立新区块链的方法可以自由地实现任意的特性,成本是开发时间和培育努力。使用脚本的方法非常容易实现和标准化,但是它的能力有限。元币协议尽管非常容易实现,但是存在扩展性差的缺陷。在以太坊系统中,其目的是建立一个能够同时具有这三种模式的所有优势的通用框架。
一般来讲,以太坊之上有三种应用:
- 金融应用:为用户的资金提供更强大的管理和参与合约的办法。包括子货币、金融衍生品、对冲合约、储蓄钱包、遗嘱,甚至一些种类的全面的雇佣合约。
- 半金融应用:金钱和非金钱的方面各据江山,一个完美的例子是为解决计算问题而设的自我强制悬赏。
- 非金融应用:如在线投票和去中心化治理。