UTXO详解

2023-11-05

UTXO详解

https://blog.csdn.net/ztemt_sw2?t=1

https://blog.csdn.net/yzpbright/article/details/82218759

 

比特币交易中的基础构建单元是交易输出。

交易输出是比特币不可分割的基本组合,记录在区块上,并被整个网络识别为有效。 比特币完整节点跟踪所有可找到的和可使用的输出,称为“未花费的交易输出”(unspent transaction outputs),即UTXO。用户的比特币“余额”是指用户钱包中可用的UTXO总和,而他们可能分散在数百个交易和区块中。比特币钱包通过扫描区块链并聚集所有属于该用户的UTXO来计算该用户的余额 。大多数钱包维护一个数据库或使用数据库服务来存储所有UTXO的快速参考集,这些UTXO由用户所有的密钥来控制花费行为。

一个UTXO可以是1“聪”(satoshi)的任意倍数(整数倍)。就像美元可以被分割成表示两位小数的“分”一样,比特币可以被分割成八位小数的“聪”。尽管UTXO可以是任意值,但一旦被创造出来,即不可分割。这是UTXO值得被强调的一个重要特性:UTXO是面值为“聪”的离散(不连续)且不可分割的价值单元,一个UTXO只能在一次交易中作为一个整体被消耗。如果一个UTXO比一笔交易所需量大,它仍会被当作一个整体而消耗掉,但同时会在交易中生成零头。例如,你有一个价值20比特币的UTXO并且想支付1比特币,那么你的交易必须消耗掉整个20比特币的UTXO,并产生两个输出:一个支付了1比特币给接收人,另一个支付了19比特币的找零到你的钱包。类似的,一笔比特币交易可以是任意金额,但必须从用户可用的UTXO中创建出来。用户不能再把UTXO进一步细分,就像不能把一元纸币撕开而继续当货币使用一样。用户的钱包应用通常会从用户可用的UTXO中选取多个来拼凑出一个大于或等于一笔交易所需的比特币量。

详细的解释请参见:UTXO详解

交易输入的数据结构

交易输入:被交易消耗的UTXO

交易输入被定义在类class CTxIn中。

1)Prevout  

是指前一个交易的输出,也就是父交易。

COutPoint prevout;//前一个交易的输出

其中COutPoint是一个类:

class COutPoint

{

public:

uint256hash;//前一个交易的hash值,即父hash

uint32_t n;//4个字节,前一个交易输出索引好,从0开始

};

中包括两个字段:

uint256 hash;//前一个交易的hash值,即父hash

int32_t n;//4个字节,前一个交易输出索引好,从0开始

2) scriptSig

解锁脚本,通过密钥可以解锁这个交易输入(UTXO),并使用这个UTXO(J交易输出)

CScript scriptSig;//解锁脚本

3)nSequence

指定交易什么时候可以被写到区块链中。其参数设置下面在详细分析

uint32_t nSequence;//序列号,表示什么时候去执行这个交易

具体参数定义如下:

static const uint32_t SEQUENCE_FINAL = 0xffffffff;

//如果nSequence被赋值为这个值,交易立刻执行,nLockTime无效,无需考虑锁定时间和要到达那个区块号再执行

static const uint32_t SEQUENCE_FINAL = 0xffffffff;

//如果nSequence被赋值为这个值,交易立刻执行,nLockTime无效,无需考虑锁定时间和要到达那个区块号再执行

static const uint32_t SEQUENCE_LOCKTIME_DISABLE_FLAG = (1<< 31);

//如果nSequence设置了这个标志为,交易序列号nSequence不是被锁定为相对时间staticconst uint32_t SEQUENCE_LOCKTIME_TYPE_FLAG = (1 << 22);

//如果nSequence设置了相对锁定时间,并且设置SEQUENCE_LOCKTIME_TYPE_FLAG值,则将已512秒为一个基本单位,否则将已一个区块为单位

static const uint32_t SEQUENCE_LOCKTIME_MASK = 0x0000ffff;

//如果nSequence设置了相对锁定时间,锁定时间依据sequence字段而定

static const int SEQUENCE_LOCKTIME_GRANULARITY = 9;

//区块生成时间。

4)scriptWitness

隔离见证。

CScriptWitness scriptWitness; //! Only serialized through

5 交易输出数据结构

交易输出:由交易创建的UTXO

交易输出的类在class CTxOut中

1)比特币数量

CAmount nValue;//比特币数量

CAmount定义在CAmount.h中,64bit,8个字节

typedef int64_tCAmount;

2)锁定脚本

CScript scriptPubKey;

//锁定脚本,锁定脚本对应输入脚本中的解锁脚本,在锁定脚本中,我们通过私钥对该交易输出进行锁定,当这笔交易作为其他交易的输入时,需要通过私钥来解锁,即通过前面输入交易中提到的解锁脚本来实现。

6 锁定时间

const uint32_t nLockTime;

//锁定时间定义了能被加到区块链里的最早的交易时间,在大多数交易里,它被设定为0,用来表示即可执行,如果锁定时间不是0,并且小于5亿,就被视为区块高度,意指在这个指定区块高度之前的交易没有被包含在这个区块链里。如果锁定时间设定为大于5亿,则它被当作是一个unix纪元时间戳(从1970年1月1日)以来的秒数,并且在这个指定的时间之前的交易没有被包含这个区块链里



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

 

我们常规的理解是,账户,余额,支出,收入。比如,银行账户,我们有1万元,收入1万,则余额为2万,支出5000,余额为1万5000元。但比特币里实际上是没有账户和余额的概念的。只有一个概念叫utxo,实际上就是你能够支配的,并且还没有被使用的btc,这些btc作为一个整体(无论比特币的数值是多少,都做为一个整体)保存在比特币系统网络里,而且这个utxo能用且只能用一次。

我们可以把utxo类比成支票。支票的数额可以是1元或者1亿元。utxo的数额可以是1聪btc,也可以是1万个btc,但都是一个整体,不可分割。

假设A有一张支票,价值1万元,需要付款给B5000元,那么,B会得到一张5000元的支票,交易费用是100元,作为一张支票给第三方,A自己得到一张支票,价值4900元。原来的1万支票已经使用过,不能再次使用,A,B,第三方分别得到一张新的支票,都是未被使用过的。三个人分别对这三张支票有使用权。

同样的,A有一个utxo,价值1万个btc,需要付款给B5000个btc,那么B会得到一个utxo(价值5000个btc),矿工得到一个utxo(矿工费1btc),A也会得到一个utxo(价值4999btc)。原来的含1万个btc的utxo被系统标记过使用过,任何人不能在使用。而A,B,矿工分别得到一个utxo。他们分别对自己名下的utxo有使用权。

如下图所示,A有一个UTXO_1,价值1万btc,给B5000个btc以后,B得到一个utxo_2,价值5000个btc,矿工得到一个utxo_3,价值1个btc,A自己得到一个utxo_4,价值4999btc。原来的utxo_1,被系统标记未使用过。不能再次使用,即不能被双花。以此类推,当A在给C1000个btc时,C得到一个utxo_5,价值1000个btc,矿工得到一个utxo_6,价值0.2btc,A得到一个utxo_7,价值3999.8btc。

此时,系统中,未经使用的交易输出(utxo)包括:

B的utxo_2(价值5000btc),

矿工的utxo_3(价值1btc)和uxto_6(价值0.2btc),

C的utxo_5(价值1000btc)

A的utxo_7(价值3999.8btc)

原来的utxo_1,utxo_4,是已经被使用过的交易输出,不能再次使用。

因此,在比特币的系统中,并没有账户和余额的概念。系统中只有utxo,谁有这个utxo的密钥和签名,谁就拥有这个utxo。

在类CTransaction中

static const int32_t CURRENT_VERSION=2; //表示当前的版本信息。使客户端知道是那个版本的资料

static const int32_t MAX_STANDARD_VERSION=2; // 最大的版本信息

const int32_t nVersion:  //设置的版本信息

const std::vector vin;    //不定长的字节,交易输入

const std::vector vout;  //不定长的字节,交易输出

const uint32_t nLockTime;    //交易锁定时间(区块号)

上面这些参数被定义成常量,目的是在没有更新缓存hash值的时候,本地参数不会被意外修改。

1  版本信息

static const int32_t CURRENT_VERSION=2;

static const int32_t MAX_STANDARD_VERSION=2

const int32_t nVersion

前两个是静态全局变量

CURRENT_VERSION:默认的交易版本信息。0.13版本以前的代码是1,从0.14版本开始版本是2

MAX_STANDARD_VERSION:标准交易的最高版本,为的是兼容原来的版本。这个参数是从0.12的版本出现的。

nVersion:当前的交易版本,在初始化的时候,默认的初始值是 CURRENT_VERSION。

在Transaction.cpp中初始化这个值

CTransaction::CTransaction() : vin(), vout(), nVersion(CTransaction::CURRENT_VERSION),nLockTime(0), hash() {}



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

https://steemit.com/utxo/@electroman/utxo

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UTXO详解 的相关文章

  • 协同过滤算法_《推荐系统实践》3.基于物品的协同过滤算法

    基于物品的协同过滤算法 item based collaborative filtering 以下简称ItemCF 算法思想 给用户推荐那些和他们之前喜欢的物品相似的物品 不过 ItemCF算法并不利用物品的内容属性计算物品之间的相似度 它
  • android二级菜单ui,Android UI 之实现多级树形列表TreeView示例

    所谓TreeView就是在Windows中常见的多级列表树 在Android中系统只默认提供了ListView和ExpandableListView两种列表 最多只支持到二级列表的实现 所以如果想要实现三级和更多层次的列表 就需要我们自己来
  • python pandas使用pipe管道增强代码可读性

    pandas dataframe的pipe文档链接 https pandas pydata org docs reference api pandas DataFrame pipe html 使用pipe可以像水流一样 有顺序的执行data
  • 三子棋【C语言实现】

    三子棋 让我们一起用C语言来玩一场三子棋的游戏吧 文章目录 三子棋 前言 一 基本步骤 二 具体实现 1 菜单界面 2 创建棋盘 3 棋盘初始化 4 打印棋盘 5 玩家落子 6 电脑落子 7 判断输赢 8 运行演示 1 玩家获胜 2 电脑获
  • Android apk安装管理(PackageManagerService 分析)

    Android apk安装管理 PackageManagerService 分析 本篇主要分析了系统启动阶段包管理服务的启动流程 其中的几个接口在apk安装时也会被调用 包管理服务启动时主要做的工作大致有如下几方面 1 建立java层的in
  • python安装pywin32报错问题的解决。

    前几天在win7系统安装pywin32 报错提示dll动态库找不到 在网上查找各种资料 均未解决 后来发现是缺少vcruntime140 1 dll 下载后复制到Windows的system32文件夹下 完美解决 注意是vcruntime1
  • python机器学习模型选择&调参工具Hyperopt-sklearn(1)——综述&分类问题

    针对特定的数据集选择合适的机器学习算法是冗长的过程 即使是针对特定的机器学习算法 亦需要花费大量时间和精力调整参数 才能让模型获得好的效果 Hyperopt sklearn可以辅助解决这样的问题 主页 http hyperopt githu
  • python学习:静态方法,类方法,property装饰,抽象类

    1 静态方法 关键词为 staticmethod def func 在类实例化之前使用 如Class func 使用场景 如检测是否满足实例化的条件 2 类方法 关键词为 classmethod def func return cls 类方
  • Android使用ProgressBar实现加载动画

    项目需要做一个加载转圈的效果 给了一张菊花图 首先想到的是使用补间动画的旋转效果 在anim目录中创建loading xml
  • WPF加载大量控件的优化

    WPF 应用程序从两个线程开始 一个用于处理呈现 一个用于管理 UI 呈现线程有效地隐藏在后台运行 而 UI 线程则接收输入 处理事件 绘制屏幕以及运行应用程序代码 UI 线程对一个名为 Dispatcher 的对象内的工作项进行排队 Di
  • 如何快速掌握Redis跳跃表源码技巧?阿里架构师让你秒懂

    我们再来学习如何从跳跃表中查询数据 跳跃表本质上是一个链表 但它允许我们像数组一样定位某个索引区间内的节点 并且与数组不同的是 跳跃表允许我们将头节点L0层的前驱节点 即跳跃表分值最小的节点 zsl gt header level 0 fo
  • php 微信支付V3接口

    注意事项 1 请求接口签名方式 RSA 用到了API证书序列号 后缀为key pem的密钥文件 cert文件要用java自己生成 具体参考 https developers weixin qq com community develop d
  • mysql安装图解 mysql图文安装教程(详细说明)

    下面的是MySQL安装的图解 用的可执行文件安装的 详细说明了一下 打开下载的mysql安装文件mysql 5 0 27 win32 zip 双击解压缩 运行 setup exe 出现如下界面 mysql安装图文教程1 mysql安装向导启
  • Linux——信号的发送,自己实现结束进程的kill命令

    信号的发送 Linux提供了一种系统调用 2 不是kill命令 kill 可以向指定的进程发送指定的信号 int kill pid t pid int signType signType是要发送的信号 kill方法的pid参数有四种不同的情
  • PID 控制保姆级培训教程下-全国大学生电子设计大赛赛前必备

    紧接上回 PID 控制保姆级培训教程上 全国大学生电子设计大赛赛前必备 http t csdn cn TY4eB 上回介绍到 书接上回 实操设计 干货满满 3 数字控制器的模拟化设计 3 1 数字PID 3 1 1 DDC系统的组成原理 D
  • FastAPI从入门到实战(6)——请求体与嵌套模型

    前面记录的是路径参数和查询参数的内容 那两种形式的数据都不算的发送的数据 都是存在路径中的数据 请求体是客户端发给接口的参数 不存在于路径中 本文就主要记录FastAPI中的请求体应用内容 一个发送请求体的接口 创建一个数据模型 class
  • Linux 使用rpm方式安装最新mysql(5.7.16)步骤以及常见问题解决

    前几天在阿里云买了个服务器 准备自己玩玩 现将最新版mysql 5 7 16 安装步骤 以及遇到问题及解决过程分享如下 第一步 下载rpm包 mysql官网下载 http dev mysql com downloads mysql 但如果你
  • 2021年网络安全省赛--web隐藏信息探索解析(中职组)

    2021年省赛web隐藏信息探索 解析 任务环境说明 Web20200529 服务器场景操作系统 未知 关闭连接 1 通过本地PC中渗透测试平台Kali对服务器场景Web20200529中的网站进行访问 找到登录界面中的FLAG 并将FLA
  • 专属于程序员的知识仓库:开发者导航

    一个专属于开发者的导航网站 收录丰富 内容详实 更新频繁 废话不多说 先上几张图吧 网站还收录了很多惊喜类目 比如最近很火的ChatGPT和AI绘画 开发者导航网至少收录了20多个 大部分都是免魔法 国内直接可以访问的 娱乐区还包括很多影视
  • 金蝶显示服务器异常,金蝶连接云服务器异常怎么回事

    金蝶连接云服务器异常怎么回事 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 ELB的常见异常返回码有400 403 50

随机推荐

  • 派查查 :一个WearOS智能手表系统上的快递查询应用

    目录 前言 项目概述 设计背景 系统架构 接口介绍 即时查询请求 即时查询回复 前言 在学习面向对象程序设计课程的时候 收获颇多 最后的课程报告选题选择了 Android开发 但是安卓手机上好的应用数不胜数 自己不想重蹈覆辙做别人做过不知道
  • 前端常用工具库整理

    功能库 lt lt lt Axios 一个基于 promise 的 HTTP 库 可以用在浏览器和 node js 中 http www axios js com Lodash 一个一致性 模块化 高性能的 JavaScript 实用工具库
  • 小程序使用 svg

    封装组件 components下新建svgIcon文件 wxml
  • node内置模块——Buffer模块(缓冲区)

    文章目录 Buffer 缓冲区 创建Buffer 利用字符串创建buffer Buffer from 使用Buffer方法创建buffer Buffer alloc Buffer allocUnsafe size Buffer元素的操作 B
  • CSS选择器(nth-child)

    nth child 这个选择符括号内可以写 an b a b均为整数 或者关键字 因为工作中有遇到要隐藏列表第三个子元素之后的所有子元素 所以有用到这个选择器 记录一下 1 nth child a 当括号里只写一个数字 比如 list li
  • OSI七层参考模型和数据封装

    OSI七层参考模型和数据封装 一 网络基础原理 1 分层思想 二 OSI七层参考模型 三 TCP IP协议簇和OSI参考模型 1 TCP IP五层模型常见协议 2 ARP是地址解析协议 3 RARP是反地址解析协议 四 PDU协议数据单元数
  • Flash概念简述

    1 Flash全名叫做Flash Memory Flash存储芯片的一种 通过特定的程序可以修改里面的数据 Flash属于非易失性存储设备 Non volatile Memory Device 与此相对应的是易失性存储设备 Volatile
  • RK3568 HDMI EDID处理过程

    一 简介 EDID是什么 EDID的全称是Extended Display Identification Data 扩展显示标识数据 VGA DVI的EDID由主块128字节组成 HDMI的EDID增加扩展块 128字节 扩展块的内容主要是
  • Jupyter notebook 如何设定默认的保存目录?

    前言 做智能车的时候 Jupter Notebook的默认保存在可怜的C盘 本来就很紧张的C肯定受不了 要改到别的地方 网上找了一些参考 说变更一下配置地址就可以了 照着做 99 的博客说 设置完了 关闭重启就好了 试了几次 根本不是关闭重
  • Proxmox VE 使用ACME 自动获取证书(DNSPOD)

    前言 PVE中自带了ACME 的支持 但是在国内对DNSPOD的支持似乎不是很好 所以只能采取手动的方式 一 使用步骤 以下步骤均在pve 的管理界面中 打开节点的shell 窗口中执行 安装ACME wget O acme1 sh htt
  • 页面访问量和网站访问量的统计

    网页点击计数器 以下是实现一个简单的基于 Servlet 生命周期的网页点击计数器需要采取的步骤 在 init 方法中初始化一个全局变量 每次调用 doGet 或 doPost 方法时 都增加全局变量 如果需要 您可以使用一个数据库表来存储
  • c++ 四元数转欧拉角

    c 四元数转欧拉角 两种方法 供你选择 方法 输入 x y z w 为四元数 输出 roll pitch yaw欧拉角 static void toEulerAngle const double x const double y const
  • FPGA驱动0.96oled显示屏 (4线 SPI) verilog语言

    之前也陆陆续续看了很多博客 也都能在自己的屏幕上显示出来 但是问题就是不知道怎么修改代码显示自己希望显示的东西 而且由于没注释原因看不太懂 最终的实现效果最终实现效果视频 b站视频链接1 评论区有人给了源码的百度网盘链接 csdn博客链接1
  • 1、若依服务网关

    文章目录 一 基础介绍 二 使用网关 1 添加依赖 2 resources application yml 配置文件 3 网关启动类 三 路由规则 1 Datetime 2 Cookie 3 Header 4 Host 5 Method 6
  • LeetCode Week 2

    LeetCode Week 2 保护好你的身体 和病痛比起来 其他的困难都不值一提 问题集合 1 Invert Binary Tree Easy 226 Invert a binary tree 4 2 7 1 3 6 9 to 4 7 2
  • Navicat远程连接MySQL服务器

    文章目录 一 准备 二 配置Navicat允许远程连接MySQL数据库 1 使用Navicat直接连接MySQL 2 使用 Navicat 通过 SSH 远程登录后再本地方式连接 MySQL 3 查看连接 为什么使用ssh登录 1 便捷性
  • AI工程师职业经验指南——转转推荐算法部负责人告诉你如何能够成为一名合格的机器学习算法工程师

    文章转载自 程序员杂志 2017 11 成为一名合格的开发工程师不是一件简单的事情 需要掌握从开发到调试到优化等一系列能力 这些能力中的每一项掌握起来都需要足够的努力和经验 而要成为一名合格的机器学习算法工程师 以下简称算法工程师 更是难上
  • 网络内安全试验场第三次CTF答题夺旗赛

    最近参加了网络内安全试验场第三次CTF答题夺旗赛 写wp 以后要做一个每次比赛完立马写wp的菜鸡 个人习惯 我做题一般喜欢从杂项 隐写开始 第一题 下载完成之后发现是个word 打开时需要密码 但是在题目中给提示了 所以直接输入密码 我以为
  • 自己手动搭建ssm框架实现增删改查、图片的上传、排序的移动所遇到问题的总结

    如图所示实现的增删改查 上移和下移 总结一下自己的不足之处 以前的公司都是自己有封装的框架而且有一段时间没做mvc了对此没有那么的熟悉 1 controller层返回的ModelAndView 后面希望能够改成String 然后再通过视图解
  • UTXO详解

    UTXO详解 https blog csdn net ztemt sw2 t 1 https blog csdn net yzpbright article details 82218759 比特币交易中的基础构建单元是交易输出 交易输出是