比特币的交易-交易脚本(三)

虽然数字签名能够满足普通的交易需求,但没有太多扩展性。比特币中创建了一种脚本语言,来满足交易中的一些多样性的需求,如:

  • 制造一枚的在指定时间才能使用比特币
  • 制造一枚任何人可以花费的比特币
  • 作废一枚比特币

比特币脚本

比特币脚本是一种基于栈(Stack)的、从左到右运行的、非图灵的脚本语言,用于校验交易。

栈是一种数据结构,只有两种基本操作:push 和 pop:

  • push:将数据放入栈的顶端。
  • pop:将栈的顶端的数据推出。
image.png

脚本会从左到右执行,每次操作都会修改全局的栈。如果执行完成后,没有错误且栈顶的值为真,那么就交易校验通过,否则交易校验不通过。一个最简单的例子是:

OP_0 OP_1 OP_ADD
脚本 描述
OP_0 OP_1 OP_ADD script 的含义是 0 + 1
0 OP_1 OP_ADD 将 0 push 到 stack 中
0 1 OP_ADD 将 1 push 到 stack 中
1 pop 两个 stack 的值,并进行相加,然后结果 push 到 stack 中

该 script 运行的结果是 1,因此通过了验证通过。

锁定脚本与解锁脚本

用于验证交易是否通过的脚本由两部分组成:

  • 解锁脚本:本次交易的 input 中的 scriptSig
  • 锁定脚本:上次交易的 output 中的 scriptPubKey

在比特币交易的最初的设计中,使用的是 pay-to-pubkey。那时候,并没有引入地址 address 的概念。验证交易是否合法,就是验证由 scriptSig 脚本和
scriptPubKey 组成的脚本执行结果是否为 1。

scriptSig: <sig>
scriptPubKey: <pubKey> OP_CHECKSIG
脚本 描述
<sig> <pubKey> OP_CHECKSIG 将 scriptSig 和 scriptPubKey 结合成脚本
<sig> <pubKey> OP_CHECKSIG 将 <sig> <pubKey> push 到 stack 中
1 OP_CHECKSIG pop stack 顶端的连个参数,并使用数字签名验证函数验证,并将结果 push 到 stack 中。

这种 pay-to-pubkey 脚本,在上一笔交易中就将电子货币所有者的公钥暴露出来了,这降低了数字签名的安全性。比如,可以利用提早暴露公钥,暴力来破解私钥。

checkSig(pubKey, tryToKnowPrivateKey)

P2PKH(Pay-to-Public-Key-Hash)

为了解决提前暴露公钥带来的安全性隐患,BitCoin Core 团队引入了地址 Address 的概念。比特币网络处理的大多数交易都是 P2PKH 这种模式。

image.png
scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>
脚本 描述
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 将 scriptSig 和 scriptPubKey 结合成脚本
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 将 <sig> <pubKey> push 入栈
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 复制一份栈顶的值
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 对栈顶的值进行一次 hash160 运算
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 将 <pubKeyHash> push 入栈
<sig> <pubKey> OP_CHECKSIG 判断栈顶的两个值是否相等
true 使用数字签名验证函数验证栈顶的两个值
image.png

脚本带来的多样性

由于脚本的存在,所以比特币交易的多样性就变得更多了,比如

  • 制造一枚的在指定时间才能使用比特币
scriptPubKey: <expiry time> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>
  • 制造一枚任何人可以花费的比特币
 scriptPubKey: (empty)
 scriptSig: OP_TRUE
  • 作废一枚比特币
 scriptPubKey: OP_RETURN {zero or more ops}

总结

  • 比特币脚本用于校验交易
  • 比特币脚本包括:scriptSig 和 scriptPubKey
  • 比特币脚本常用的是 P2PKH 模式

The Bitcoin Script Playground

JavaScript implementation of Script, Bitcoin's scripting language.

Bitcoin Wiki Script

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351