主页 > 最新imtoken官网下载链接 > 区块链百科:比特币的 UTXO 模型

区块链百科:比特币的 UTXO 模型

最新imtoken官网下载链接 2023-01-17 18:46:01

支付宝转账流程大家都知道:打开APP,输入转账地址或扫描二维码,输入转账金额,点击确认并输入密码。

比特币的转移过程是相同的。但比特币和支付宝背后的转账原理其实大相径庭。

支付宝采用账户余额模式。比如大白的支付宝账户有100元,给小黑转账80元,大白的账户余额会减少80元到20元,小黑的账户余额会从0变成80元。而小黑的账户会直接显示一个余额,也就是账户余额模型。

01.UTXO模型介绍

比特币系统是一个点对点的电子现金系统,UTXO模型和我们的现金支付模型有很多共同之处。大白有两张面值50元的现钞。如果他要给小黑80块钱,他需要把这两张50块钱的钞票给小黑,小黑再给大白20块钱。大白和小黑的钱包还剩多少?钱不会像支付宝那样直接显示余额,但需要自己数一数:钱包里有几张钞票,每张的面额,然后加起来。我们可以将现金支付方式视为 UTXO 模型的简化版本。

UTXO 模型和现金支付模型的共同点:

① 每个 UTXO 都有对应的面额,就像每张钞票都有面额一样。

② 一张UTXO必须在交易中整体消耗,就像纸币一样,不能撕开使用(不能把一张100元钞票掰成两半,当成两张50元钞票使用)。

如下图所示:左边的地址是比特币交易的起始地址,右边是2个收款地址,其中一个和左边的起始地址相同,这个转账金额交易为0.26682745 BTC,其中收款人得到0.1732608 BTC,返回原转账地址为0.09356665 BTC(这是找零钱)。

③ UTXO 与现金的最小面额相同。UTXO的最小面额单位是Satoshi(以中本聪命名),1 BTC=10 8th Satoshi,也就是1亿个Satoshi,1 Satoshi=0.00000001 BTC。

UTXO模型与现金支付模型的区别:

①现金支付:由收款人找零;

比特币系统:找零由发起人自己设定。

②现金的面值是固定的(如20元、50元等),UTXO的面值是不固定的,在交易过程中也会发生变化。

比特币的 UTXO 的面值是不固定的。如下图所示,这是历史上第一笔比特币交易。中本聪将 10 BTC 转给 Hal Finney,他花了 50 BTC 的面值。UTXO,变更后获得面值为40 BTC的UTXO。

原本面值为 50 的 UTXO 变成了两个面值分别为 10 BTC 和 40 BTC 的 UTXO。如果中本聪将 15 BTC 转给 Hal Finney,那么面值为 50 BTC 的 UTXO 将变成两个 UTXO,面额分别为 35 BTC 和 15 BTC。

下图是比特币UTXO集合的数据图。从 2009 年到 2019 年,UTXO 集合的数据整体呈现增长趋势。

③ 现金不可能被双花,比特币可能被双花。

同一个比特币被花费两次甚至多次的情况称为双花。作为一种虚拟货币,比特币没有实体,它的本质是数据,同一个比特币可以花两次。

UTXO是Unspend Transaction Output,即未消费的交易输出。每笔比特币交易都会有输入和输出。

当大白向小黑转账80元时,这80元对于大白来说是一笔交易的输出,称为交易输出,对于小黑来说,是一笔交易收入交易输入。如果这80块钱再花掉,那么这80块钱也变成了小黑的交易输出,而小黑还没花掉钱之前,就是一个没有花掉的交易输出。,transaction的缩写是tx,所以Unspend Transaction Output就是UTXO。

我们来看看链上的数据是什么样子的?如下所示:

右上角的确认是确认的意思。这里显示6+,表示本次交易的已确认交易区块数已超过6个。通常,一笔交易的已确认区块数超过6个。此时,该交易被认为是完成状态,不可逆.

这意味着什么?我们先来解释一下确认区块的数量。当一笔交易放入区块并添加到区块链上最新的区块时,此时的区块确认数为1,然后继续会有新的区块添加,获得的区块确认数将变为< @2、3、4、5、6......这样当它后面的块数为5时,即当块数为本次交易获得的区块确认数为 6,我们认为本次交易不可能逆转。6+旁边还有一个锁标志。当该区块的确认次数达到 6 次或更多时,锁将变为锁定状态。

02.改变机制

Satoshi Nakamoto 有一个面值为 50 的 UTXO,将 10 BTC 转移给 Hal Finney。除了 Hal Finney 的收款人地址,他还需要写零钱地址。你想从哪个比特币地址放 40 BTC?它可以是最初发起转账的地址,也可以是另一个比特币地址。你必须写一个找零地址,告诉矿工:剩下的 40 个比特币要存进去。在哪里?

因此,右边有两个交易接收人的地址,一个是 Hal Finney 的地址,另一个是 Satoshi Nakamoto 的地址。中本聪设置的找零地址是发起交易的地址,但通常零地址不会与原始交易发起地址相同,这是出于隐私保护的考虑。

我们知道比特币是一个大型的公共账本,所以如果你总是使用单一地址进行交易,就会存在隐私泄露的风险。例如,当有人检查此地址时,他们可以看到该地址上的所有比特币余额。,知道你的具体资产有多少。因此,为了保护隐私,建议您每次使用比特币进行交易时都使用一个新地址。这样,其他人就无法看到您拥有的其他比特币地址中有多少钱以及您使用它们进行了哪些交易。

上图中的比特币是中本聪的地址。里面有 45 笔交易,大约有 18 个比特币,但这只是他的一个地址。他有多少比特币?我们没有准确的数据。据说中本聪拥有100万比特币,这也是从其他一些信息中隐约推断出来的,也不能完全肯定,因为中本聪不可能总是使用同一个比特币地址。

看上图的上半部分。这三个地址都不相同。当找零地址与发起交易的地址不同时,收款人的两个地址中的哪一个是找零地址?答案是:我不知道,你没办法知道,他到底是转了0.29 BTC换了37.208506 BTC,还是转了37.208506 BTC,找到零0.29 比特币。在区块链的浏览器上,你可以看到它已经对这次交易中转移了哪些比特币进行了估算,称为估算的btc交易。估计0.29 BTC是转账金额。

如果交易中没有写零钱地址,剩下的钱会被系统默认归矿工所有,所有的钱都会给矿工作为帮你打包交易的手续费。如下所示:

上图中这个交易的发起者,不知道是不是搞错了还是什么,我们可以看到这个交易,只有一个收款地址没有找零地址,所以除了0.接收地址收到的@>除了001 BTC,剩下的291.2409 BTC都变成了矿工费。

但是现在的数字货币包软件非常人性化,照顾到一些老是忘记或者不知道需要设置找零地址的人,它会自动帮用户生成找零地址和手续费,如果你如果你觉得钱包自动设置的费用太高,你也可以降低它,或者如果你想尽快确认交易,你可以增加费用。

04. 缺勤验证UTXO

作为矿工比特币余额查询,打包前需要考虑3个问题:

1、发起交易者的地址中是否有足够的UTXO

也就是说,是否有足够的比特币比特币余额查询,矿工会检查交易者的UTXO集合(UTXO集合是矿工保存的所有UTXO的集合),矿工可以检查发起交易的地址是否有足够的余额从这个集合中,如果余额不足,则交易无效。

<@2、本次交易发起者使用的比特币是否为双花

矿工去查询区块链账本上的数据,查看交易发起人之前是否用比特币购买过其他东西。如果使用的 UTXO 已经支付给别人,并且出现了双花问题,那么这个 A 交易就无法通过矿工的交易验证。

3、发起者能否提供有效的私钥签名

合法的私钥签名用于证明发起者对比特币地址有控制权。如果无法提供私钥签名,矿工将判定他发出的交易是非法的,无法通过验证。

脚本语言在区块链中是一个比较抽象的概念,但也是一个非常重要的功能。我们常说比特币系统是图灵完备的,以太坊是图灵完备的,其实就是说他们的脚本是否图灵完备,图灵完备是对计算机能力的描述,指的是实现所有可编程计算机都可以执行的计算逻辑。

图灵完备的脚本语言可以发挥计算机的所有能力,而图灵不完备的语言不能发挥计算机的所有能力。比如在比特币系统中,它的脚本不是图灵完备的,只能接收和发送比特币,而以太坊的脚本是图灵完备的,或者严格来说,它实际上是半图灵完备的,除了发送和发送接收以太币,还可以部署智能合约实现更多功能。比特币的脚本是智能合约的原型,但它不是图灵完备的,但这里有一点:不是图灵完备并不代表它是一个缺陷,因为图灵完备所涉及的技术非常复杂,即容易引起安全。漏洞。

比特币的初衷是成为现实生活中的一种支付货币。货币交易流通的安全性是第一位的。他想保持简单。以太坊的创始人“V神”,曾经和比特币的核心开发团队建议让脚本更丰富,但被拒绝了,于是他用更丰富的脚本语言创建了以太坊。

比特币的脚本系统是先进后出的栈模型,什么是栈?堆栈也是计算机科学中经常使用的一种相对抽象的数据类型。堆栈上的对象都有一个特性,最后放入堆栈的对象总是最先被取出。我们可以把堆栈想象成一个盒子。你在盒子里放了一本书,然后是一顶帽子,最后是一把剪刀。如果要拿出来,顺序是剪刀、帽子、书。

因此,首先进入盒子的东西是最后取出的东西。这是 FIFO 堆栈模型,或 LIFO 堆栈模型。堆栈中最重要的两个操作是 push 和 pop。push 操作是添加一个元素。,pop操作正好相反,就是移除一个元素。

如上图:我们先看一下输入脚本。输入脚本也称为解锁脚本。

第一条指令是push data(71),push data的意思是把数据压入堆栈,71表示这个数据的大小是71字节,用16进制表示。

(16进制,1字节=2个字符,可以数一下。下面这串数据正好是71×2,也就是142个字符,把这142个字符压入栈)。

第二条指令是压栈数据(30.0@>,它将 33 字节(66 字符)的数据压栈)入栈。

那么正在推进的数字是多少?第一条指令推送的数据是私钥签名,第二条指令推送的数据是公钥。现在这个栈里有2层数据,第一层是发起者的私钥签名,第二层是发起者的公钥。

(此公钥为压缩格式:前缀02或03表示压缩格式,前缀04表示未压缩格式)

输出脚本

然后我们看输出脚本输出脚本,输出脚本也叫加锁脚本。

第一条指令是dup,dup是duplicate(重复)的缩写,dup是复制栈顶的数据(即发起者的公钥)。

第二条指令是hash160,即hash160是发起者的公钥,得到公钥hash。

第三条指令是 push data (20.1@>,它将后面 20 个字节(40 个字符)的数据,即公钥哈希值压入堆栈。

验证交易

至此,验证交易是否合法的所有信息都已经入栈,接下来可以进行验证了。

第一步是相等验证(相等指同一个人或事物,verify就是验证),相等验证就是验证两个事物是否相等,这里要判断两个数据是否在比较栈顶是平等的。

0.2@>

为什么要做这一步?栈中第三层公钥哈希值取自输入脚本输入脚本,第四层公钥哈希值取自输出脚本输出脚本。输出脚本也叫lock Script,被锁定脚本的公钥哈希值为地址,区块链上的每个人都可以找到,但输入脚本的公钥哈希值只有拥有对应的公钥。

0.3@>

前面我们提到,非对称加密的私钥和公钥,私钥必须自己保管,公钥可以与他人共享,私钥到公钥是单向推导过程,即无法逆转,但是因为量子计算机的出现,它是一台非常强大的计算机,可以从公钥中推导出私钥。

在设计之初,中本聪直接使用公钥作为地址,非常不安全。后来,程序员将公钥的哈希值编码为地址,而量子计算机没有办法做到这一点。私钥是直接从地址推导出来的。

因此,在现在的比特币区块链上,私钥和公钥并不是所有人都可以轻易共享的。如果要使用地址中的比特币进行转账,首先必须提供相应的公钥。,这样minion就可以检查你是这个地址的所有者,因为你有对应的公钥。第一个检查是将发起者输入脚本中的哈希值与输出脚本中的哈希值进行匹配,看它们是否相同。

接下来是验证的第二步,叫做check sig(校验校验和签名签名),就是使用发起者的公钥来校验签名。检查通过后,可以确认交易是我发起的。