比特币交易的脚本是如何执行的

学习UTXO中,一笔UTXO包含了一个解锁脚本(pkScript),花费这一笔UTXO时,需要通过该脚本验证,才能够花费这笔UTXO。

如何拥有一个UTXO的使用权

比特币的交易创建的输出并非一个简单的公钥地址,而是一个脚本。如果B给A转账0.5个btc的交易中,其实输出pkScript脚本类似:

OP_DUP OP_HASH160 abcd1234...9876 OP_EQUALVERIFY OP_CHECKSIG

其中abcd1234...9876为A的公钥哈希,其他为指令。当谁能提供一个签名和公钥,让这个脚本运行通过,谁就能花费这笔交易的0.5个btc。

当A需要花费这笔btc时,就需要验证这个脚本,所以当A提供公钥和签名时,实际A已经创建了另一笔交易。

所有人都可以验证A创建的这个新交易是否有效,如果有效,该交易就会被矿工打包进新的区块。

一笔交易单实际数据

In:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd0
4470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446
618c4571d1090db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fd
d7d5d6cc8d25c6b241501

Out:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35
549d OP_EQUALVERIFY OP_CHECKSIG

这是一笔交易单数据,包含了收入来源和支出。当进行一笔交易时,需要在交易中描述这笔交易的来源(in),输出(out)交易金额,以及通过脚本的形式写上接收者的公钥(scriptPubKey)。然后验证你的输出(in)的合法性:通过输入的pre tx和index找到指向的UTXO脚本,使用自己的私钥签名(scriptSig)完成脚本验证,最后广播到网络完成转账。

收入来源In:

  • Previous tx 为收入来源交易单的散列值,连接到上一个交易单。
  • index 指明是收入来源交易单中具体哪个索引的out,从0开始。
  • scriptSig 包含了签名和公钥,用于验证Previous tx和index所指向的UTXO的锁定脚本。

接收对象Out:

  • value 发送的币值,单位为Satoshi,1BTC = 1亿Satoshi
  • scriptPubKey 接收方的锁定脚本,后续使用这笔UTXO需要提供公钥和签名通过该脚本的验证。

交易脚本是如何执行的

现在有签名、公钥,需要执行上一个交易输出的脚本获得该UTXO使用权:

sig: 30450221...ee0e01

pubkey: 042e930f...cabb

script: OP_DUP OP_HASH160 46af3fb4…6829 OP_EQUALVERIFY OP_CHECKSIG

比特币脚本被设计成以栈来运行的虚拟机指令,首先先把签名(sig)和公钥(pubkey)入栈:

然后执行指向的TxOut的脚本:

OP_DUP OP_HASH160 46af3fb4…6829 OP_EQUALVERIFY OP_CHECKSIG

首先执行OP_DUP,这条指令是把栈顶元素复制一份:

紧接着执行OP_HASH160,表示对栈顶进行SHA256/RipeMD160,实际就是计算公钥hash:

然后下一条是直接把数据46af3fb4…6829入栈:

然后执行OP_EQUALVERIFY,比较栈顶两个元素是否相等,如果不相等,整个脚本就执行失败,如果成功:

最后执行OP_CHECKSIG栈顶两个元素进行签名校验,如果相等,出栈返回成功。

作者:暴走的K哥哥
链接:https://www.jianshu.com/p/a57795ec562c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/405845829qq/p/9313215.html

时间: 2024-10-30 04:53:31

比特币交易的脚本是如何执行的的相关文章

【WebSocket】---实现定时推送比特币交易信息

实现定时推送比特币交易信息 实现功能:跟虚拟币交易所一样,时时更新当前比特币的价格,最高价,最低价,买一价等等...... 提示:(1)本篇博客是在上一遍基础上搭建,上一篇博客地址:[WebSocket]---实现游戏公告功能. (2)相关源码会在其它有关websocket案例写完,写在gitHub上,后期会贴上地址. 先看效果演示 当前的信息就是虚拟币交易所最新BTC的数据信息. 我们看到每隔1秒都会更新一次最新的比特币当前信息.(截止到我发这篇博客时,比特币当前价格:6473美元左右) 一.

JavaScript编写自己的比特币交易代码

今天我们将编写第一个比特币交易代码.为了实现这一目标,我们将使用名为bitcore的JavaScript库.JavaScript是最流行的现代编程语言,几乎每个开发人员都知道它,因此它使这篇文章具有普遍性并且对更广泛的受众有用. 在继续阅读本文之前,你应该至少掌握有关比特币区块链如何工作的基本技术知识.如果没有,请花几分钟时间阅读区块链简介.如果你有更多的时间,比如几个小时,我建议你阅读掌握比特币. 让我们从一个具有以下依赖关系的新NPM项目开始: [...] "dependencies&quo

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

〖Linux〗自动连接VPN脚本(开机执行)

最近发现VPN经常会断线.. 环境:Ubuntu 14.04 一.创建VPN配置 单击桌面右上网络图标 -- 编辑连接 -- 添加 -- PPTP -- 新建 (填写上网关.用户名.密码...) 高级 -- 使用点到点加密(MPPE) -- 确定 二.查看刚刚新建网络UUID: nmcli con list 记录下你的VPN连接UUID 三.编写自动连接脚本: sudo vi /etc/init.d/autovpn sudo chmod +x /etc/init.d/autovpn 1 #!/b

高性能网站优化-确保异步加载脚本时保持执行顺序

<高性能网站建设进阶指南> 脚本如果按照常规方式加载,不仅会阻塞页面中其他内容的下载,还会阻塞脚本后面所有元素的渲染.异步加载脚本可以避免这种阻塞现象,从而提高页面加载速度.但是性能的提升是要付出代价的.代码的异步执行可能会出现竞争状态.简单地说就是页面内部的脚本需要的标示符如果是在外部文件中定义的,而当外部文件异步加载的时候,如果没有保证外部文件和内部脚本执行顺序,很有可能会出现未定义标示符的错误 当异步加载的外部脚本与行内脚本之间存在代码依赖时,就需要通过一种保证执行顺序的方法来整合这两个

Android OTA升级包制作脚本详解(五,升级脚本updater-script的执行&lt;1&gt;)

写在前面: 首先当我们执行升级脚本updater-script的时候,就表示我们已经进入了升级安装状态.那么在我们就从实际的安装作为入口开始分析.也就是说我们从install.cpp中的install_package函数开始一步步来分析. 这里主要分析与脚本相关的部分,其他的请参考这位朋友的博文http://blog.chinaunix.net/uid-22028566-id-3533856.html,我也很受启发.这里也借用一张图来帮助流程上的分析. 下面是调用的流程:install_pack

以脚本方式直接执行修改密码的passwd命令

以脚本方式直接执行修改密码的passwd命令: 参考: http://bbs.csdn.net/topics/390001865 http://bbs.chinaunix.net/thread-993455-1-1.html 结论: echo “123456″ | passwd --stdin root

JSFL 获取当前脚本路径,执行其他脚本

Application.jsfl为程序入口,导入其他jsfl [Common.jsfl] function trace() { fl.trace(Array.prototype.join.call(arguments, " ")); } [Application.jsfl] var JSFL_PATH = fl.scriptURI.substr(0,fl.scriptURI.lastIndexOf("/")+1); var included = {}; functi

[Unity-20] Unity不同脚本之间的执行顺序

我们都知道,Unity中某个脚本的执行顺序是Awake.Start.Update.LateUpdate等,但是不同的脚本之间的执行顺序是怎样的呢? 例如我有两个脚本Script1和Script2,那么这两个脚本的Awake执行顺序是怎样的呢? 要知道真相我们就必须了解Unity后台的运行原理,其实Unity后台是单线程执行的,所谓的协程都是伪多线程.不同脚本的Awake在后台的执行真相是这样的: 后台Awake() { 脚本0Awake(); 脚本1Awake(); ........ } Sta