merkle tree储存在每个区块中,当一个轻节点需要验证某个交易是否录入时,需要从叶子节点一边计算一边通过请求全节点中另一边的哈希值不断合并得到根节点的哈希值,以作对比。

proof of membership
proof of inclusion
使用sorted merkle tree可以快速验证nonmembership
double spending question

每个block header都包含这些内容,我们要找到的nonce和对比的target也存在里面
取哈希只需要对头取,因为头部里的merkle已经保证了body里的交易。

progress free 过去消耗的时间对平均出矿时间不做累计计算,出矿概率不因为过去累积的计算改变
防止分支攻击的方法是multi confirmation

全节点
- 一直在线
- 在本地硬盘上维护完整的区块链信息
- 内存里维护UTXO集合,以便快速检验交易的合法性
- 监听比特币上交易信息,验证每个交易合法性
- 决定那些交易会被打包到区块
- 监听别的矿工挖出来的区块,验证合法性
- 挖矿
轻节点
- 和全节点大小差1000倍
- 只验证与自己相关交易的合法性
- 可以验证挖矿的难度
- 无法检测网上发布的区块的正确性,因为轻节点保存了块头
- 只能检测哪个是最长链不知道那个是合法最长链
- 不需要挖矿的话,节点都是轻节点
安全性:
共识机制
密码学机制
对不同的协议标准认同不同会导致社区分裂,彼此支持不同的规则。

硬分叉是新合约增大了节点规模导致旧节点不认可新节点一直制造旧合约的节点并且向自己的链不断拓展,这样会导致一条合约分叉链的产生。
软分叉是缩小了节点规模,所以旧节点也认可新节点挖出来的节点,这样新节点会产生一条分叉,然后旧节点会在最长的合法链后继续挖久而久之那条旧链就会被抛弃。
零知识证明:
一方向另一方无须提供除了称述以外的任何信息,另一方可以判断这个陈述是否正确。
同态隐藏:



如何避免银行在验证时关联你的身份?
方法 1:盲签使用可重用的签名格式
在盲签协议中,银行不会在签署时加入与你身份相关的信息,而是使用标准化的签名格式,例如:
- RSA 盲签
- 椭圆曲线盲签(ECC-based blind signature)
银行只签名一个通用的盲化数据,而不会在签名中嵌入任何可识别的信息,因此:
✅ 商户可以验证签名是否有效
✅ 银行无法知道这个支票是你的
换句话说,银行签名的只是一个数学对象,而不是“你账户上的某个唯一识别符”。
方法 2:你可以在使用支票前“重新洗牌”
即使银行对盲化后的支票签名,你仍然可以用一种叫做**“盲签翻转”**(Re-randomization)的技术,让支票在验证时变得完全不同,但签名仍然有效。
流程如下:
- 你获得银行的盲签后,先不直接使用,而是对签名数据进行随机变换(数学处理),让它变成一个新的但等效的签名。
- 这个新的签名仍然可以被验证,但它与原来的盲签完全不同,银行无法将它与你最初的申请关联。
这样,即使商户去银行验证这张支票,银行也无法知道它是你原先申请的那张。
✅ 你申请时的签名 ≠ 你最终使用的签名
✅ 银行无法匹配两者
这种技术被用于电子现金(E-Cash)和匿名认证系统,例如:
- David Chaum 的匿名电子货币系统
- Zcash 的零知识证明交易
方法 3:商户直接验证,而不是让银行验证
另一种方法是让商户自己验证银行签名,而不是把支票交回银行验证,这样银行根本不会知道支票何时被使用。
流程如下:
- 你拿着银行盲签的支票去找商户。
- 商户使用公开的银行验证密钥来验证签名。
- 如果签名有效,商户就接受这张支票,而不需要联系银行。
✅ 银行不会知道支票的使用情况
✅ 银行不会知道你的身份
这种方法适用于去中心化的匿名支付,比如:
- 离线电子现金(DigiCash)
- Zcash 这样的区块链隐私支付
以太坊:

ASIC resistance
状态树用Merkle Patricia trie树维护,唯一性,快速访问,快速插入。Patricia trie是经过了路径压缩的trie树,这种树极大的利用了trie的特性并且降低了储存和查找的性能。
以太网使用bloom filter来辅助单节点来验证交易是否不存在
以太坊的出块时间远低于比特币,所以导致出现orphan block的概率大大增加,个体矿工的权益下降,所以使用了一种叫GHOST的协议。当你挖到orphan block还是会给你一些奖励,这种block被称为uncle block。uncle block能得到7/8的奖励。uncle block可以被包含进主链中,主链会得到剩下1/8的收益。这种机制有利于鼓励分叉及时进行合并。
叔叔区块不能无限向前推进,往前一代奖励会减少1/8。减少到2/8以后就不再继续向前追认叔叔区块。最多七代,合法的叔叔只有六代。合并叔叔分块的奖励都是1/32,且叔叔区块后不能有链,因为如果包含链则导致分叉攻击的失败成本降低。


Proof of work → Proof of stake通过投票进行分配,而不是挖矿,但是还没实行。
难度炸弹,用一个指数函数和矿块标号来指数性增加挖矿难度,以实现从挖矿向权益证明转移。由于权益证明协议开发比预期缓慢导致难度炸弹提前爆炸,所以使用一个公式里的虚假标号来计算难度,并且把一个区块奖励从5→3
权益证明:
TWH Terawatt hours
KWH Kilowatt hours
一次比特币交易的能耗差不多是1014KWT,每年总收入61E UDT,费用差不多是31E UDT,以太坊一次交易只需要67度电,因为以太坊的出币速度快,所以平均下来的能耗就更低。
virtual mining
以太坊中准备使用的权益证明协议是 Casper the Friendly Finality Gadget
也是需要和工作量证明合作使用,为工作量证明提供finality
它引入了一个概念validator,每挖出100个区块作为一个epoch,对它是否能成为一个finality进行投票。第一轮投票是一个prepare message,第二轮投票是commit message。每一轮投票都要保证2/3以上的验证者才能通过。这个是按照保证金的金额大小来算的。

并且验证者,投票不作为需要施加惩罚,减少保证金。每个验证者有一定的任期,任期满了要经过一定时间的等待期,让其他节点验证是否有不良行为,如果等待期过了就可以取回保证金以及应该得到的奖励。
通过验证达成的finality
加密货币提供了一种将额外电能储存为货币的方式。
智能合约:





以太坊中的交易具有原子性,一旦出错会整个交易进行回滚。
汽油费只有挖到矿的矿工才能得到补偿,其他的矿工反而需要付出执行合约的汽油费。


智能合约很容易出问题,一定要在模拟平台上实验。
以太币的DAO组织出现了一次巨大的合约漏洞,被黑客盗取了1/3DAO上的以太币,所以导致以太坊进行硬分叉,其中拒绝执行回滚的用户挖的被称为ETC,强制执行回滚的用户被称为ETH。两条链使用chainId区分不同链上的交易。THE DAO之所以要全部回滚,是因为正常账户上的合约也同样有BUG,只修复黑客账户不可行。
Smart contract is anything but smart.
Irrevocability is a double edged sword.
Nothing is irrevocable.
Is solidity the right programming language?
Many eyeball fallacy.
Decentralized ≠ distributed
状态机最早的应用场景是一些 mission critical application:air traffic control/stock exchange/space shuttle.
相对来说状态机的机器数目越多,系统运行越慢,这也是和大多数分布式系统的区别,相对而言加密货币是一种少见的分布式系统。EVM并非大规模计算和存储的,智能合约是用来编写控制逻辑的。只有在那些互不信任的实体之间建立共识的操作才需要写入智能合约。
总结:
去中心化的方式和中心化的方式各有利弊,加密货币只能用于解决现有支付手段所欠缺的方面,而非与现有支付手段竞争。
.png?table=block&id=e721439b-67f8-4fde-8e9a-291fca4d6796&cache=v2)