区块链技术与应用视频笔记(5-)
第5讲 BTC-实现
基于交易
transaction-based ledger
比特币全节点需要维护一个UTFO(Unspend Transaction Output)的数据结构,用于检测 双花攻击
费用
每次交易可以设置交易费(可选),交易费越高,记账优先级越高
每隔10分钟产生一个新区块,每隔4年出块奖励减半
block例子
来源:https://www.blockchain.com/btc/block/0000000000000000001e11d32315a87083514934f85c538c1efcd54a09a3284f
Block header数据结构
随着时间增加,仅仅更改nonce无法满足调整挖矿难度的需求(搜索空间不够大),需要调整merkle root hash。
调整merkly root的过程示例
将输入脚本和前一个交易的输出脚本配对
外层循环调整noce,内层循环调整coinbase
挖矿分叉和验证
Bernoulli trial: a random experiment with binaty outcome
Bernoulli process: a sequence of independent Bernoulli trials
memoryless 无记忆
Poisson process
exponential distribution
整个系统的出块时间,平均时间为10min,呈指数分布
process free将来还要挖多少时间和已经挖了多少次是无关了,就像掷硬币,下一次结果不受上一次的影响。保证了挖矿的公平性,算力优先
geometric series比特币数量构成几何序列,未来极限是2100w个比特币
Bitcoin is secured by mining
- 如果存在10%的矿工是恶意的,会不会出现偷币的现象?
诚实的节点会不验证 - 防范double spending
诚实节点不会在非法分支继续(诚实节点算力大的情况下)
confirmation,一般要等6个 - 不可篡改性是概率上的,刚写入的区块链存在被篡改的可能,随着时间篡改的概率指数级下降
验证
zero confirmation:诚实节点会优先接受首个被挖出的新区块;交易过程有时延,如购物到发货有时间间隔,卖家发现钱没有到账还是可以取消发货
selfish mining
挖到多个区块之后再发布,会存在被抢先发布的风险
基于账户(以太坊)
accounted-based ledger
第6讲 BTC-网络
第8讲 挖矿
全节点和轻节点
轻节点假设矿工不会挖出非法的交易区块
仅需要转账,轻节点就够了
比特币安全性的保证
- 密码学上的保证,无法伪造签名
- 共识算法
挖矿设备:
- 普通PC(CPU),CPU闲置
- GPU,主要用于大规模通用并行计算。噪音大,部件闲置,比如用于深度学习的浮点数。比特币挖矿需要整数。当前挖矿难度超过GPU的算力
- ASIC: Application Specific Intergrated Circuit. 可以分别为不同的加密货币定制。mining puzzle,merge mining特殊情况。比特币芯片设计时间大概为1年,史上最低之一。
ASIC resistance
矿池、矿工
矿主负责监听交易,矿工只负责挖矿,按照工作量参与分红
可以保证矿工的收入稳定,简化矿工流程
on demand computing(云计算)
on demand mining
share,alomost valid block, 证明工作量
60个0的Nonce为一个share,矿主记录share数目,等到出块之后分配
偷走出块奖励,矿工的任务是由矿主分配的。coinbase的收款地址是矿主,如果地址改变了,提交share时候,矿主不认
矿工捣乱,不提交自己挖到的Nonce,只分享share
矿主分配
矿池攻击
分叉攻击
Boycott
不让某一个地址或账户的交易上链
或者一旦上链,马上分叉攻击,导致其他人不再包含某个账户
第9讲 比特币脚本
交易结构
基于栈的语言
"result": {
"txid": "",
"hash": "",
# 使用的比特币版本号
"version": 1,
# 区块大小
"size": 226,
# 生效时间,大多数情况下为0,表示立即生效
"locktime": 0,
# 输入和输出
"vin": [...],
"vout": [...],
# 交易的区块哈希值
"blockhash": ""
"confirmations": 23,
"time":1530846727,
"blocktime": 1530846727
}
交易的输入
"vin": [{
# 钱的来源
"txid": "",
# 钱来自于txid中第vout个输出
"vout": "",
# 证明你有
"scriptSig":{
"asm": "",
"hex": ""
},
}]
交易的输出
- value 单位可以是btc也可以是cong
- n表示序号,第n个输出
- scriptPubKey 表示输出脚本
- reqSigs 表示需要多少个签名才可以,有的需要多个签名
- type 表示输出类型
- address 输出地址