第18讲:Bitcoin Script脚本系统
💡 想象比特币是一台自动贩卖机,你不仅可以投币买东西,还可以设置各种条件:"只有两个人同时插钥匙才能打开"、"只有在特定时间才能使用"、"必须输入正确密码"。这就是比特币脚本的魅力——让数字货币变得可编程。
目录
前言:比特币的可编程货币基因
很多人认为比特币只是"数字现金",但实际上比特币从诞生之初就具备了可编程性。Bitcoin Script是比特币内置的脚本语言,它让比特币不仅仅是转账工具,更是可编程的数字合约平台。
现实世界的类比:
- 支票:可以设置收款人、金额、有效期
- 信托:可以设置复杂的资金释放条件
- 保险箱:可以设置多把钥匙同时使用
Bitcoin Script的能力:
- 条件支付:只有满足特定条件才能花费
- 多重签名:需要多个签名才能动用资金
- 时间锁定:在特定时间后才能使用
- 复杂逻辑:组合多种条件创造智能合约
Script语言设计哲学
核心设计原则
class BitcoinScriptDesign:
def __init__(self):
self.design_principles = {
"确定性": {
"原则": "相同输入产生相同输出",
"实现": "禁止随机数生成器",
"目的": "确保所有节点执行结果一致",
"例子": "不允许获取当前时间作为变量"
},
"简单性": {
"原则": "保持语言简单易验证",
"实现": "有限的操作码集合",
"目的": "减少实现错误和安全漏洞",
"例子": "只有100多个操作码"
},
"安全性": {
"原则": "优先考虑安全而非功能",
"实现": "禁用危险操作",
"目的": "保护网络免受攻击",
"例子": "禁用了乘法和字符串操作"
},
"非图灵完备": {
"原则": "不支持无限循环",
"实现": "没有循环结构",
"目的": "防止无限执行消耗资源",
"例子": "无法编写死循环程序"
}
}
def script_limitations(self):
"""脚本限制说明"""
return {
"禁用的操作码": [
"OP_CAT: 字符串连接(安全风险)",
"OP_SUBSTR: 子字符串提取",
"OP_MUL: 乘法操作",
"OP_RSHIFT: 右移位操作"
],
"执行限制": [
"最大脚本大小: 10,000字节",
"最大栈大小: 1,000项",
"最大操作码数量: 201个",
"最大签名验证次数: 20个"
],
"设计考虑": [
"防止DoS攻击",
"确保快速验证",
"维护网络稳定性",
"保证向前兼容性"
]
}
栈式执行模型
class BitcoinScriptStack:
def __init__(self):
self.stack = []
self.alt_stack = []
def execute_script(self, script_ops):
"""执行脚本操作序列"""
for op in script_ops:
if self.is_push_data(op):
self.stack.append(op['data'])
else:
self.execute_opcode(op['opcode'])
# 脚本成功执行当且仅当栈顶为真(非零值)
return len(self.stack) > 0 and self.stack[-1] != b'\x00'
def execute_opcode(self, opcode):
"""执行具体操作码"""
if opcode == 'OP_DUP':
# 复制栈顶元素
if len(self.stack) < 1:
raise Exception("Stack underflow")
self.stack.append(self.stack[-1])
elif opcode == 'OP_HASH160':
# SHA256 + RIPEMD160 哈希
if len(self.stack) < 1:
raise Exception("Stack underflow")
data = self.stack.pop()
hash_result = self.hash160(data)
self.stack.append(hash_result)
elif opcode == 'OP_EQUALVERIFY':
# 验证栈顶两个元素相等,相等则继续,不等则失败
if len(self.stack) < 2:
raise Exception("Stack underflow")
a = self.stack.pop()
b = self.stack.pop()
if a != b:
raise Exception("EQUALVERIFY failed")
elif opcode == 'OP_CHECKSIG':
# 验证数字签名
if len(self.stack) < 2:
raise Exception("Stack underflow")
pubkey = self.stack.pop()
signature = self.stack.pop()
# 简化的签名验证
result = self.verify_signature(signature, pubkey)
self.stack.append(b'\x01' if result else b'\x00')
def demonstrate_p2pkh_execution(self):
"""演示P2PKH脚本执行过程"""
print("📝 P2PKH脚本执行演示:")
print("=" * 40)
# 输入脚本 (scriptSig): <signature> <pubkey>
print("步骤1: 执行输入脚本")
print("操作: 推入签名和公钥")
self.stack = [b'signature', b'pubkey']
print(f"栈状态: {[item.decode() for item in self.stack]}")
print()
# 输出脚本 (scriptPubKey): OP_DUP OP_HASH160 <pubkey_hash> OP_EQUALVERIFY OP_CHECKSIG
print("步骤2: 执行输出脚本")
# OP_DUP
print("OP_DUP - 复制栈顶元素")
self.stack.append(self.stack[-1])
print(f"栈状态: {[item.decode() for item in self.stack]}")
# OP_HASH160
print("OP_HASH160 - 哈希栈顶元素")
pubkey = self.stack.pop()
pubkey_hash = b'pubkey_hash' # 模拟哈希结果
self.stack.append(pubkey_hash)
print(f"栈状态: {[item.decode() for item in self.stack]}")
# 推入目标公钥哈希
print("推入目标公钥哈希")
self.stack.append(b'pubkey_hash')
print(f"栈状态: {[item.decode() for item in self.stack]}")
# OP_EQUALVERIFY
print("OP_EQUALVERIFY - 验证哈希相等")
hash1 = self.stack.pop()
hash2 = self.stack.pop()
if hash1 == hash2:
print("✅ 公钥哈希验证通过")
else:
print("❌ 公钥哈希验证失败")
print(f"栈状态: {[item.decode() for item in self.stack]}")
# OP_CHECKSIG
print("OP_CHECKSIG - 验证数字签名")
pubkey = self.stack.pop()
signature = self.stack.pop()
# 模拟签名验证成功
self.stack.append(b'\x01') # True
print("✅ 数字签名验证通过")
print(f"最终栈状态: {[hex(ord(item)) if len(item)==1 else item.decode() for item in self.stack]}")
return len(self.stack) > 0 and self.stack[-1] == b'\x01'
操作码系统详解
操作码分类
def bitcoin_opcodes_reference():
"""比特币操作码参考手册"""
return {
"常量操作": {
"OP_0 (OP_FALSE)": "推入空字节数组",
"OP_1-OP_16": "推入数字1-16",
"OP_1NEGATE": "推入-1",
"OP_PUSHDATA1-4": "推入不同长度的数据"
},
"栈操作": {
"OP_DUP": "复制栈顶元素",
"OP_DROP": "删除栈顶元素",
"OP_SWAP": "交换栈顶两个元素",
"OP_ROT": "栈顶三个元素循环左移",
"OP_PICK": "复制栈中第n个元素到栈顶",
"OP_ROLL": "移动栈中第n个元素到栈顶"
},
"算术运算": {
"OP_ADD": "加法运算",
"OP_SUB": "减法运算",
"OP_1ADD": "加1",
"OP_1SUB": "减1",
"OP_NEGATE": "取负数",
"OP_ABS": "取绝对值",
"OP_MIN": "取最小值",
"OP_MAX": "取最大值"
},
"逻辑运算": {
"OP_NOT": "逻辑非",
"OP_BOOLAND": "逻辑与",
"OP_BOOLOR": "逻辑或",
"OP_EQUAL": "相等比较",
"OP_EQUALVERIFY": "相等验证(失败则脚本失败)",
"OP_LESSTHAN": "小于比较",
"OP_GREATERTHAN": "大于比较"
},
"密码学操作": {
"OP_RIPEMD160": "RIPEMD160哈希",
"OP_SHA1": "SHA1哈希",
"OP_SHA256": "SHA256哈希",
"OP_HASH160": "SHA256+RIPEMD160",
"OP_HASH256": "双SHA256",
"OP_CHECKSIG": "验证ECDSA签名",
"OP_CHECKMULTISIG": "验证多重签名"
},
"条件执行": {
"OP_IF": "条件分支开始",
"OP_NOTIF": "反条件分支开始",
"OP_ELSE": "条件分支的else部分",
"OP_ENDIF": "条件分支结束",
"OP_VERIFY": "验证栈顶为真"
},
"时间锁定": {
"OP_CHECKLOCKTIMEVERIFY": "验证绝对锁定时间",
"OP_CHECKSEQUENCEVERIFY": "验证相对锁定时间"
}
}
复杂操作码示例
class AdvancedScriptOpcodes:
def __init__(self):
self.current_block_height = 866000
self.current_timestamp = 1725894000
def demonstrate_multisig(self):
"""演示多重签名脚本"""
# 2-of-3 多重签名脚本
multisig_script = [
'OP_2', # 需要2个签名
'pubkey1', # 公钥1
'pubkey2', # 公钥2
'pubkey3', # 公钥3
'OP_3', # 总共3个公钥
'OP_CHECKMULTISIG' # 验证多重签名
]
# 对应的解锁脚本
unlock_script = [
'OP_0', # 由于CHECKMULTISIG的bug,需要额外的值
'signature1', # 第一个签名
'signature3' # 第三个签名(跳过第二个)
]
return {
"类型": "2-of-3多重签名",
"解锁脚本": unlock_script,
"锁定脚本": multisig_script,
"说明": "需要3个公钥中的任意2个对应私钥签名"
}
def demonstrate_timelock(self):
"""演示时间锁定脚本"""
# 绝对时间锁定:只能在特定时间后花费
absolute_timelock = [
'1735689600', # 2025年1月1日的时间戳
'OP_CHECKLOCKTIMEVERIFY', # 验证当前时间大于指定时间
'OP_DROP', # 移除时间值
'OP_DUP', # 标准P2PKH后续操作...
'OP_HASH160',
'pubkey_hash',
'OP_EQUALVERIFY',
'OP_CHECKSIG'
]
# 相对时间锁定:必须在指定区块数后才能花费
relative_timelock = [
'144', # 144个区块(约1天)
'OP_CHECKSEQUENCEVERIFY', # 验证相对锁定时间
'OP_DROP',
'OP_DUP', # 标准P2PKH后续操作...
'OP_HASH160',
'pubkey_hash',
'OP_EQUALVERIFY',
'OP_CHECKSIG'
]
return {
"绝对时间锁": {
"脚本": absolute_timelock,
"用途": "在指定日期后才能花费资金",
"场景": "定期释放、遗嘱执行"
},
"相对时间锁": {
"脚本": relative_timelock,
"用途": "在UTXO创建一定时间后才能花费",
"场景": "支付通道、争议解决"
}
}
def demonstrate_hash_lock(self):
"""演示哈希锁定脚本"""
# 哈希锁定:需要提供特定数据的原像
hash_lock_script = [
'OP_HASH256', # 对栈顶数据做双SHA256
'3044022...hash_value', # 预设的哈希值
'OP_EQUAL' # 验证哈希值相等
]
# 解锁需要提供原像
unlock_script = [
'secret_data' # 能够产生指定哈希值的原始数据
]
return {
"锁定脚本": hash_lock_script,
"解锁脚本": unlock_script,
"应用场景": [
"原子交换(Atomic Swap)",
"支付通道路由",
"条件支付",
"隐私保护机制"
],
"工作原理": "只有知道秘密数据的人才能花费资金"
}
常见脚本模式
标准脚本类型
def standard_script_patterns():
"""标准脚本模式分析"""
return {
"P2PKH (Pay-to-Public-Key-Hash)": {
"锁定脚本": "OP_DUP OP_HASH160 <pubkey_hash> OP_EQUALVERIFY OP_CHECKSIG",
"解锁脚本": "<signature> <pubkey>",
"优点": "简单、安全、隐私保护好",
"缺点": "功能单一",
"使用率": "约60%的交易",
"地址格式": "1开头的地址"
},
"P2SH (Pay-to-Script-Hash)": {
"锁定脚本": "OP_HASH160 <script_hash> OP_EQUAL",
"解锁脚本": "<sig1> <sig2> ... <redeemScript>",
"优点": "支持复杂脚本、转移复杂度到花费方",
"缺点": "脚本大小限制、费用可能较高",
"使用率": "约25%的交易",
"地址格式": "3开头的地址"
},
"P2WPKH (Pay-to-Witness-PubkeyHash)": {
"锁定脚本": "OP_0 <pubkey_hash>",
"见证数据": "<signature> <pubkey>",
"优点": "交易费用低、解决延展性",
"缺点": "需要SegWit支持",
"使用率": "约30%的交易",
"地址格式": "bc1q开头的地址"
},
"P2WSH (Pay-to-Witness-Script-Hash)": {
"锁定脚本": "OP_0 <script_hash>",
"见证数据": "<sig1> <sig2> ... <witnessScript>",
"优点": "支持复杂脚本、费用低、无延展性",
"缺点": "较为复杂",
"使用率": "约2%的交易",
"地址格式": "bc1q开头的长地址"
},
"P2TR (Pay-to-Taproot)": {
"锁定脚本": "OP_1 <taproot_output>",
"解锁方式": "密钥路径或脚本路径",
"优点": "隐私性最佳、效率高、功能强大",
"缺点": "相对新颖、支持还在增长",
"使用率": "约3%的交易(持续增长)",
"地址格式": "bc1p开头的地址"
}
}
高级脚本应用
原子交换脚本
class AtomicSwapScript:
def __init__(self):
self.hash_lock = "a91420f69d...hash_value"
self.alice_pubkey = "03a1b2c3...alice_key"
self.bob_pubkey = "03d4e5f6...bob_key"
self.locktime = 1735689600 # 2025-01-01
def create_htlc_script(self):
"""创建哈希时间锁定合约(HTLC)"""
htlc_script = f"""
OP_IF
OP_HASH160 {self.hash_lock} OP_EQUALVERIFY
{self.alice_pubkey} OP_CHECKSIG
OP_ELSE
{self.locktime} OP_CHECKLOCKTIMEVERIFY OP_DROP
{self.bob_pubkey} OP_CHECKSIG
OP_ENDIF
"""
return {
"脚本": htlc_script.strip(),
"功能说明": {
"条件1": "Alice提供秘密原像,可以立即花费",
"条件2": "超时后,Bob可以赎回资金",
"用途": "跨链原子交换的核心机制"
},
"安全特性": [
"要么交换成功,要么全部回滚",
"不存在一方得利另一方损失的情况",
"通过时间锁定防止资金永久锁定"
]
}
def atomic_swap_process(self):
"""原子交换完整流程"""
return {
"参与方": {
"Alice": "拥有Bitcoin,想要Litecoin",
"Bob": "拥有Litecoin,想要Bitcoin"
},
"步骤1_准备": [
"Alice生成秘密值S和其哈希值H = hash(S)",
"双方商定交换金额和时间锁定参数",
"Alice创建Bitcoin HTLC,锁定1 BTC",
"Bob验证Bitcoin HTLC正确性"
],
"步骤2_响应": [
"Bob在Litecoin上创建相同哈希值H的HTLC",
"Bob锁定50 LTC(假设汇率1:50)",
"Alice验证Litecoin HTLC正确性"
],
"步骤3_执行": [
"Alice使用秘密值S解锁Litecoin HTLC,获得50 LTC",
"此时秘密值S暴露在Litecoin区块链上",
"Bob看到秘密值S,用它解锁Bitcoin HTLC,获得1 BTC"
],
"结果": "双方都获得了想要的币种,交换成功完成"
}
支付通道脚本
class PaymentChannelScript:
def __init__(self):
self.alice_pubkey = "03a1b2..."
self.bob_pubkey = "03b2c3..."
self.channel_capacity = 1.0 # 1 BTC
def funding_transaction_script(self):
"""资金锁定交易脚本"""
# 2-of-2多重签名锁定资金
funding_script = f"""
OP_2
{self.alice_pubkey}
{self.bob_pubkey}
OP_2
OP_CHECKMULTISIG
"""
return {
"类型": "2-of-2多重签名",
"脚本": funding_script.strip(),
"功能": "需要Alice和Bob都签名才能花费",
"用途": "锁定支付通道的初始资金"
}
def commitment_transaction_script(self):
"""承诺交易脚本(可撤销)"""
# Alice的输出(可被Bob在延迟期内撤销)
alice_output = f"""
OP_IF
{self.bob_pubkey} OP_CHECKSIGVERIFY
OP_ELSE
144 OP_CHECKSEQUENCEVERIFY OP_DROP
{self.alice_pubkey} OP_CHECKSIG
OP_ENDIF
"""
return {
"Alice输出": alice_output.strip(),
"功能说明": {
"立即花费": "Bob可以立即用撤销密钥花费(惩罚机制)",
"延迟花费": "Alice必须等待144个区块后才能花费"
},
"安全机制": "防止Alice广播旧的承诺交易"
}
def htlc_payment_script(self):
"""HTLC支付脚本"""
# 通过支付通道进行条件支付
htlc_script = f"""
OP_IF
OP_HASH160 <payment_hash> OP_EQUALVERIFY
{self.bob_pubkey} OP_CHECKSIG
OP_ELSE
1008 OP_CHECKSEQUENCEVERIFY OP_DROP
{self.alice_pubkey} OP_CHECKSIG
OP_ENDIF
"""
return {
"脚本": htlc_script.strip(),
"用途": "在支付通道中进行条件支付",
"路由": "可以通过多个通道路由支付",
"时间锁": "1008个区块(约1周)的超时机制"
}
实战演练:编写Bitcoin脚本
class BitcoinScriptBuilder:
def __init__(self):
self.script = []
self.stack_trace = []
def add_op(self, opcode, data=None):
"""添加操作码"""
if data:
self.script.append(f"{opcode} {data}")
else:
self.script.append(opcode)
return self
def push_data(self, data):
"""推入数据"""
self.script.append(data)
return self
def build_custom_script(self, scenario):
"""构建自定义脚本"""
if scenario == "escrow":
return self.build_escrow_script()
elif scenario == "lottery":
return self.build_lottery_script()
elif scenario == "will":
return self.build_digital_will_script()
else:
raise ValueError("Unknown scenario")
def build_escrow_script(self):
"""构建托管脚本"""
# 三方托管:买方、卖方、仲裁方
buyer_key = "03buyer..."
seller_key = "03seller..."
arbitrator_key = "03arbitrator..."
escrow_script = [
"OP_2", # 需要2个签名
buyer_key, # 买方公钥
seller_key, # 卖方公钥
arbitrator_key, # 仲裁方公钥
"OP_3", # 总共3个公钥
"OP_CHECKMULTISIG" # 2-of-3多重签名
]
return {
"脚本": escrow_script,
"使用场景": [
"买卖双方都同意:直接完成交易",
"买方和仲裁方同意:买方获得商品",
"卖方和仲裁方同意:卖方获得货款"
],
"优势": "去中心化的托管服务"
}
def build_lottery_script(self):
"""构建彩票脚本"""
# 基于区块哈希的简单彩票
lottery_script = [
"OP_DUP", # 复制提交的数字
"OP_HASH256", # 哈希处理
"<target_hash>", # 目标哈希值
"OP_EQUAL", # 比较是否相等
"OP_IF", # 如果匹配
"<winner_pubkey>", # 中奖者公钥
"OP_CHECKSIG", # 验证签名
"OP_ELSE", # 如果不匹配
"576", # 4小时后
"OP_CHECKSEQUENCEVERIFY", # 时间锁定
"OP_DROP", # 清理栈
"<organizer_pubkey>", # 组织者公钥
"OP_CHECKSIG", # 验证签名
"OP_ENDIF"
]
return {
"脚本": lottery_script,
"规则": "提交正确哈希原像的人获奖",
"公平性": "基于未来区块哈希,无法预测",
"时间限制": "4小时内无人中奖则退还给组织者"
}
def build_digital_will_script(self):
"""构建数字遗嘱脚本"""
# 简单的数字遗嘱:一定时间不活动则继承人可以使用
will_script = [
"OP_IF", # 如果是所有者
"<owner_pubkey>", # 所有者公钥
"OP_CHECKSIG", # 验证所有者签名
"OP_ELSE", # 如果是继承人
"52560", # 1年 = 52560个区块
"OP_CHECKSEQUENCEVERIFY", # 检查相对锁定时间
"OP_DROP", # 清理栈
"<heir_pubkey>", # 继承人公钥
"OP_CHECKSIG", # 验证继承人签名
"OP_ENDIF"
]
return {
"脚本": will_script,
"功能": "所有者可随时使用,1年未使用则继承人可用",
"应用": "数字资产传承",
"注意": "需要定期'刷新'来重置时间锁定"
}
def script_workshop():
"""脚本编程工作坊"""
print("🛠️ Bitcoin Script编程工作坊")
print("=" * 40)
builder = BitcoinScriptBuilder()
# 演示各种脚本场景
scenarios = ["escrow", "lottery", "will"]
for scenario in scenarios:
print(f"\n📝 场景: {scenario.upper()}")
script_info = builder.build_custom_script(scenario)
print("脚本内容:")
for i, op in enumerate(script_info["脚本"]):
print(f" {i+1}. {op}")
if "使用场景" in script_info:
print("\n使用场景:")
for scene in script_info["使用场景"]:
print(f" • {scene}")
if "规则" in script_info:
print(f"\n规则: {script_info['规则']}")
if "功能" in script_info:
print(f"\n功能: {script_info['功能']}")
print("-" * 30)
if __name__ == "__main__":
script_workshop()
常见问题
❓ 为什么Bitcoin Script不是图灵完备的?
设计考虑:
- 安全性:防止无限循环导致的DoS攻击
- 可预测性:确保脚本执行时间有上限
- 简单性:降低实现复杂度和错误风险
- 共识:确保所有节点执行结果一致
❓ Bitcoin Script能实现智能合约吗?
能力与限制:
def script_smart_contract_capabilities():
"""Script智能合约能力分析"""
return {
"可以实现": [
"多重签名钱包",
"时间锁定支付",
"条件支付(哈希锁)",
"简单的托管服务",
"原子交换",
"支付通道"
],
"无法实现": [
"复杂的状态管理",
"动态数据存储",
"外部数据获取(Oracle)",
"复杂的计算逻辑",
"循环和递归结构"
],
"与以太坊对比": {
"Bitcoin Script": "简单、安全、有限功能",
"以太坊Solidity": "图灵完备、功能强大、复杂度高"
}
}
❓ 如何调试Bitcoin脚本?
调试工具和方法:
- Bitcoin Core测试网:在测试环境验证脚本
- 脚本模拟器:离线模拟脚本执行
- 栈跟踪:记录每步操作的栈状态
- 单元测试:编写测试用例验证逻辑
常见问题解答
Q1: Bitcoin Script和以太坊智能合约有什么区别?
A: 它们的设计理念完全不同:
- Bitcoin Script:简单、安全、有限功能,专注于支付条件
- 以太坊智能合约:复杂、图灵完备,可以做任何计算
- 比喻:前者像保险箱的密码锁,后者像一台完整的电脑
Bitcoin更像是"有条件的支付",以太坊更像是"去中心化的计算平台"。
Q2: 为什么Bitcoin Script不支持循环?
A: 这是故意的安全设计:
- 防止死循环:避免脚本永远执行下去消耗资源
- 确保执行时间:每个脚本都能在有限时间内完成
- 网络稳定:防止恶意脚本攻击网络
就像银行的密码锁,功能简单但绝对可靠。
Q3: 普通用户需要学习Bitcoin Script吗?
A: 看你的需求:
- 普通转账:完全不需要,钱包会自动处理
- 多重签名:需要基本了解,但有现成工具
- 高级应用:如果要做闪电网络、原子交换等,最好了解
- 开发者:必须掌握,这是基础技能
Q4: Bitcoin Script能做智能合约吗?
A: 能做,但功能有限:
- 简单合约:多重签名、时间锁定、条件支付等
- 复杂应用:闪电网络、原子交换、去中心化交易所
- 局限性:不能做复杂计算,不能访问外部数据
- 补充方案:Layer 2方案(如闪电网络)扩展功能
Q5: 如何学习Bitcoin Script编程?
A: 循序渐进的学习路径:
- 理解基础:先了解比特币交易原理
- 学习操作码:掌握常用的脚本操作
- 分析实例:研究现有的脚本模式
- 动手实践:在测试网上编写和部署脚本
- 阅读源码:研究Bitcoin Core的脚本实现
结语
Bitcoin Script是比特币可编程性的核心,它在安全性和功能性之间取得了巧妙的平衡:
🏛️ 设计哲学
- 安全优先:宁可功能受限也要确保安全
- 简单可靠:通过简单性实现可靠性
- 确定性执行:确保网络共识的一致性
- 可扩展性:通过软分叉添加新功能
🔧 技术特色
- 栈式执行:简单高效的执行模型
- 有限操作码:精心选择的操作集合
- 条件逻辑:支持复杂的支付条件
- 密码学集成:内置的签名和哈希操作
🚀 实际价值
掌握Bitcoin Script后,你能够:
- 理解比特币交易的底层机制
- 设计复杂的支付条件和智能合约
- 分析和审计比特币脚本安全性
- 为Layer 2解决方案开发应用
虽然Bitcoin Script看起来功能有限,但它为比特币提供了足够的可编程性来支持各种创新应用。从最初的简单支付到现在的DeFi应用,都离不开Script的强大支撑。
理解和掌握Bitcoin Script,就是理解比特币作为可编程货币的本质。它不仅仅是数字现金,更是一个可以承载复杂金融逻辑的平台。
🌟 代码实践:本章的完整脚本示例代码请查看:script_examples.py