原创: 曾毅 Pallet 6月20日
比特币与区块链技术进阶
AGENDA
交易脚本
扩容与分叉
交易脚本
比特币的交易验证引擎依赖于两类脚本来验证比特币交易:一个锁定脚本和一个解锁脚本
锁定脚本是一个放在一个输出值上的“障碍”,同时它明确了今后花费这笔输出的条件。
解锁脚本是一个“解决”或满足被锁定脚本在一个输出上设定的花费条件的脚本,同时它将允许输出被消费。
脚本参考
比特币脚本语言
比特币脚本语言被称为基于栈语言,因为它使用的数据结构被称为栈。栈是一个非常简单的数据结构,它可以被理解成为一堆卡片。栈允许两类操作:入栈和出栈。入栈是在栈顶部增加一个项目,出栈则是从栈顶部移除一个项目。
脚本语言通过从左至右地处理每个项目的方式执行脚本。数字(常数)被推送至堆栈,操作符向堆栈推送(或移除)一个或多个参数,对它们进行处理,甚至可能会向堆栈推送一个结果。
交易输出——锁定脚本
https://blockchain.info/tx/0327f4669b3eea71ef351c8d89877b037fa1a270095426877d7961a8a4de5892
OP_DUP OP_HASH160 8c7130fa0c30e3f777310a3aa571e529c1d3e15f OP_EQUALVERIFY OP_CHECKSIG
交易输入——解锁脚本
https://blockchain.info/tx/19ebbdd3911e3dede7e2daa158c4f6f0d316f6c73666bf7764ad3a1a013b819d
304502210095c308e3f4c1e3e4da4f13e5b83256aa3103be869b79228e7d9f70cd7c1b7bc202206dab3d3dee125f0971cfa52d2c3fd7273a86e2e2420441968a681d12aca924b801 0206e6e881f5d183cfa4b868dbe7b7eac26569c16df5329400561f272e21f1c739
标准交易类型
P2PKH(Pay-to-Public-Key-Hash)
P2PK(Pay-to-Public-Key)
MS多重签名
数据输出(OP_RETURN操作符)
P2SH(Pay-to-Script-Hash)
P2PKH(PAY-TO-PUBLIC-KEY-HASH)
锁定脚本:
OP_DUP OP_HASH160 OP_EQUAL OP_CHECKSIG
锁定脚本的解锁版脚本是:
P2PK(PAY-TO-PUBLIC-KEY)
P2PK锁定版脚本形式如下:
OP_CHECKSIG
用于解锁的脚本是一个简单签名:
多重签名
多重签名脚本设置了这样一个条件,假如记录在脚本中的公钥个数为N,则至少需提供其中的M个公钥才可以解锁。这也被称为M-N组合,其中,N是记录在脚本中的公钥总个数,M是使得多重签名生效的公钥数阀值(最少数目)。
通用的M-N多重签名锁定脚本形式为:
M ... N OP_CHECKMULTISIG
其中,N是存档公钥总数,M是要求激活交易的最少公钥数。
多重签名示例
2-3多重签名条件:
2 3 OP_CHECKMULTISIG
上述锁定脚本可由含有签名和公钥的脚本予以解锁:
OP_0
数据输出(OP_RETURN操作符)
OP_RETURN脚本的样式:
OP_RETURN
“data”部分被限制为40字节,且多以哈希方式呈现,如32字节的SHA256算法输出。许多应用都在其前面加上前缀以辅助认定。
P2SH(PAY-TO-SCRIPT-HASH)
在P2SH支付中,复杂的锁定脚本被电子指纹所取代,电子指纹为密码学哈希。当一笔交易试图支付UTXO时,要解锁支付脚本,它必须含有与哈希相匹配的脚本。P2SH的含义是,向与该哈希匹配的脚本支付,当输出被支付时,该脚本将在后续呈现。
以2-5多重签名改P2SH为例
不含P2SH的复杂脚本
Locking Script2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
Unlocking ScriptSig1 Sig2
以2-5多重签名改P2SH为例
P2SH复杂脚本
Redeem
Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
Locking Script
OP_HASH160 <20-byte hash of redeem script> OP_EQUAL
Unlocking Script
Sig1 Sig2 redeem script
P2SH的优点
与直接使用复杂脚本以锁定输出的方式相比,P2SH具有以下特点:
在交易输出中,复杂脚本由简短电子指纹取代,使得交易代码变短。
脚本能被编译为地址,支付指令的发出者和支付者的比特币钱包需要复杂工序就可以执行P2SH。
P2SH将构建脚本的重担转移至接收方,而非发送方。
P2SH将长脚本数据存储的负担从输出方(存储于UTXO集,影响内存)转移至输入方(仅存储于区块链)。
P2SH将长脚本数据存储的重担从当前(支付时)转移至未来(花费时)。
P2SH将长脚本的交易费成本从发送方转移至接收方,接收方在使用该笔资金时必须含有赎回脚本。
扩容与分叉
比特币面临的问题
比特币早期加入了每一个区块 1MB 大小的限制(能打包的交易大概是300多笔),导致每天能够容纳的总交易数量有限制。
为什么不把区块不设置的大一点呢?一是出于安全考虑,另外一个是希望所有人都能加进来这个网络,比特币在2009年1月5号诞生,到如今就已经有40万个区块,每个区块只有1M,最多不过400G,即便用个笔记本也能下载所有节点。如果,区块太大,就只有大公司可以用了。
早期比特币交易很少,但随着越来越多人接受和使用比特币,供不应求,就有大量的人等着排队验证交易。
为了让交易得到尽快的确认,使用者需要支付较高的交易费让自己的交易排在前面优先打包到区块得到确认。
扩容方案之争
比特币扩容议题在比特币社区早就争议很久,之前,业内主要针对比特币扩容方案进行争议。在2015年陆续提出了一系列扩容,代表方案有BIP100,BIP101,BIP102,BIP109,BIP248等。
这些方案可以简单地划分为长期规则派和短期搁置派:长期规则派认为应该一部到位,设置一个确定地增长规则,避免以后再次扩容调整;短期搁置派则认为未来发展无非预期,应当设定一个短期扩容策略,后期根据发展进行策略调整。
硬分叉和软分叉
Hard Fork——区块链发生永久性分歧,在新共识规则发布后,部分没有升级的节点无法验证已经升级的节点生产的区块,通常硬分叉就会发生。
Soft Fork——当新共识规则发布后,没有升级的节点会因为不知道新共识规则下,而生产不合法的区块,就会产生临时性分叉。
也有人把硬分叉定义为“permanent divergence(永久性分叉)”,和把软分叉定义为“temporary fork(临时性分叉)”
区块链扩容——BU和SEGWIT
软分叉的升级空间有限,因为目前的比特币交易数据结构和区块数据结构所有字段都已经详细定义好了,你想保证向前兼容,就不可能增加新的字段,否则旧节点就会拒绝你。
硬分叉的升级空间则要大很多,因为硬分叉只要考虑能够接受以前旧节点生产的交易和区块就可以了,硬分叉不需要考虑旧节点是否会接受新节点生产的交易和区块。那硬分叉就可以对交易数据结构和区块数据结构更大胆的修改。
PalletOne——区块链世界的IP协议 高性能分布式账本
官网:https://pallet.one/
Telegram:https://t.me/palletchinese
Github:https://github.com/PalletOne
Facebook:https://www.facebook.com/profile.php?id=100026164972741