主页 > imtoken钱包最新版本 > 比特币交易详解(上)

比特币交易详解(上)

imtoken钱包最新版本 2023-06-22 07:16:07

日本和中国是市场,对世界人民来说,汇聚世界货物,贸易和撤退,各得其所。——《易经·下》

亚当·斯密和国富论的核心见解是,交易双方都可以从交易中获利,只要交易是自愿的,没有互惠互利就没有交易。- 米尔顿弗里德曼,“自由选择”

交易是比特币最重要的部分,比特币结构中的一切都是为了确保交易顺利进行并最终存储在区块链中。本文将详细介绍比特币交易。

(公元前3400年左右,美索不达米亚产生了楔形文字。这些写在泥板上的文字比特币网上怎么交易,记载最多的信息就是账目,也就是交易。我国的伟大史书《史记》专门写了一篇《商品传》介绍如何做生意。)

比特币交易可以像传统的在线支付一样支付到一个地址(P2PKH);也可以“付给脚本”(P2SH)——类似于智能合约,合约在满足一定条件时才会执行,极大地扩展了比特币交易的灵活性。本文内容安排如下:

1个比特币地址

1.1与支付宝的类比

1.2地址类型和特征

1.3 地址生成

2.基本 P2PKH 交易

2.1事务的结构

2.2 事务生成

2.3 交易验证

2.4 交易被传播并记录在块中

3.比特币复杂交易

3.1多个脚本

3.2 P2SH(“pay to script”,pay to script hash)交易

3.3 时间锁

4.隔离见证

4.1 什么是隔离见证

4.2 隔离见证交易与传统比特币交易的区别

比特币地址

比特币建立在密码学之上,主要涉及哈希函数、公钥密码学和数字签名。但令人惊讶的是,比特币中的密码学主要不是关于加密,而是关于证明所有权。在比特币中,节点之间传递的消息没有加密。相反,知道这些消息的节点越多越好。

1.1与支付宝的类比

生活中,如果你使用支付宝,你就会有一个支付宝账号和密码(password)。账号用于收付款,密码用于证明所有权。只有知道密码,我们才能把账户里的钱花掉。同样,比特币中使用数字签名来证明所有权。与传统账户对应的概念是“比特币地址”。

分类

支付对象

证明所有权

支付宝

帐户

密码

比特币

比特币网上怎么交易

地址(从公钥或脚本生成)

数字签名(只有在你有私钥的情况下才能生成)

上述公钥和私钥是椭圆曲线密码学中的概念,属于公钥密码学。密钥成对出现,由公钥和私钥组成。公钥要向所有人公布,而私钥只有你自己知道。

数字签名类似于生活中的签名和公司印章的概念,只能用私钥生成。

如上表所示,比特币地址不止一个,有的由公钥生成,有的由脚本生成。在这里,脚本是一个程序,可以看作是一个智能合约。当设定的条件满足时,合约将自动执行。

1.2地址类型和特征

首先,我给大家一个链接btc.com/,在这里可以查询区块和交易,这样我们可以直观的看到区块和交易是什么样的。打开链接后,搜索630000,这是比特币第三次减产后的第一个区块。查看交易,我们可以看到交易地址分为三种:

地址类型

姓名

特征

手续费

1 开始

支付公钥哈希地址 (P2PKH)

原地址

高的

3 次开始

支付脚本哈希 (P2SH)

可用于多重签名或 segwit 兼容地址

中间

以 bc1 开头

本地隔离见证地址 (P2WPKH/P2WSH)

可用于隔离见证

低的

地址类型

姓名

特征

手续费

1 开始

支付公钥哈希地址 (P2PKH)

原地址

高的

比特币网上怎么交易

3 次开始

支付脚本哈希 (P2SH)

可用于多重签名或 segwit 兼容地址

中间

以 bc1 开头

本地隔离见证地址 (P2WPKH/P2WSH)

可用于隔离见证

低的

以 1 开头的地址是比特币第一次使用的地址。P2PKH 是通过 Base58 编码生成公钥的哈希值:base58(hash160(公钥))。大多数交易所可以使用此地址进行交易。

3开头的地址是Base58编码生成的脚本的hash值:base58(hash160(script))。P2SH 的意思是“支付给匹配此哈希的脚本,稍后在花费输出时使用”。

脚本是可以被视为智能合约的程序。合同只有在满足设定条件时才有效。该脚本可以是多签交易:一个P2SH地址由3个人控制,其中任意2人同意发起转账。一些 P2SH 地址也兼容隔离认证。

bc1 开头的地址是通过哈希值对应的 bech32 编码生成的。

P2WPKH 是 Bech32(hash160(公钥));P2WSH 是 Bech32 (hash256 (hash256 (script))) 专用于隔离见证。只有少数交易所可以使用这种类型的地址。SegWit 在本文的第 4 节中有详细说明。

1.3 地址生成

比特币地址的形式有很多种,但都是用公钥或脚本散列编码得到的,过程大同小异。我们以P2PKH地址为例,看看比特币地址是如何产生的。

P2PKH 地址由公钥生成。具体流程分为5个步骤:

①使用随机数发生器生成合适的随机数作为私钥k;

②利用椭圆曲线SECP256K1根据私钥k生成公钥K;

③ 对公钥K进行hash160运算,得到公钥哈希hash160(K)=RIPEMD160(SHA256(K));

④在公钥哈希前加上版本号0X00,然后做两次SHA256运算,即SHA256(SHA256(0X00

公钥hash)),两次SHA256运算结果的前四个字节作为校验码;

⑤ 对“0X00+公钥哈希+前四字节校验码”进行Base58编码,得到P2PKH地址。

我们可以下载比特币核心程序并生成我们自己的比特币地址。此外,市场上有很多成熟的钱包软件。下载对应的钱包软件后,就可以轻松拥有自己的比特币地址了。

2.基本 P2PKH 交易

上一节介绍了比特币的地址。根据地址的类型,交易也不同:

P2PKH地址类型的交易是最简单的(类似于普通支付宝转账),也是使用最多的。

·P2SH类型的交易是支付给脚本的交易(类似于智能合约,只有满足条件才能执行),稍微复杂一些。

·P2WPKH/P2WSH地址交易,除了使用隔离见证外,与P2PKH/P2SH地址交易有本质区别。

因此,本质上只有两种类型的交易:P2PKH地址类型的交易和P2SH地址类型的交易。本节介绍最简单的 P2PKH 地址类型交易,更复杂的 P2SH 地址类型交易放在第 3 节。

在本节中,我们首先直观的看一下最简单的 P2PKH 交易的结构,然后详细描述交易的生成和验证比特币网上怎么交易,最后简要说明交易的传播和进入区块。

比特币网上怎么交易

2.1事务的结构

比特币交易由 4 个部分组成,版本、输入、输出和锁定时间。

·版本是指事务的版本号;

·输入是解释比特币的来源,解锁,证明使用权,包括四个参数;

输出是指示比特币被转移到谁,并锁定它。只有能解锁的人才能消费,包括两个参数;

锁定时间是指定交易在一定时间或区块高度之前不会被打包进区块,即在一定时间或区块高度之前不会被记录在比特币账本中。

比特币可以有多个输入和输出。比如买59元的东西,付钱的时候从钱包里拿出一个50元和一个10元面额(两个输入,50元和10元),得到零钱1元(两个输出,59元付给店家,1元付给自己)。输入输出参数的含义请参考上图及下节。

你应该在交易中发现:

· 没有看到比特币地址(地址可以从输出脚本中的哈希值计算出来);

输入中也没有比特币数量(输入是另一笔交易的未花费输出,也称为UTXO,查找引用的交易以了解输入中的比特币数量)。

这就是设计的巧妙之处,只保留最重要的信息,其他信息可以从交易中给出的信息中计算或查询。后面我们会分别分析输出和输入,这些疑惑就可以迎刃而解了。

2.2 事务生成

比特币是一个全球公共账本。没有比特币实体。所有的财富都隐藏在账本中,就像银行卡里的财富一样,只是银行账本上记录的一系列数字。

所有交易都记录在比特币分类账上。每笔交易的哈希值都是唯一的。哈希值作为一个id,这样每笔交易都有一个唯一的id。知道了id,就很容易定位到交易。交易 id=哈希(交易)。

生成交易

假设张三需要支付李四0.03170599btc,那么这个过程应该如何进行呢?

①张三查账本,发现在交易41b...44c(txid=41b...44c,vout=1)的输出1中,王武将0.05262377btc转给了自己。

②但是王舞做了一个锁脚本,只有解决了自己锁脚本的问题才能花钱。不过这对张三来说并不难,因为张三的私钥可以计算出问题的答案。张三用自己的私钥对王舞的加锁脚本做了一个解锁脚本(scriptSig)。

③ 转账给李四0.03170599btc,并为此输出做一个锁脚本。如果你能回答锁定脚本(scriptPubKey),你可以花这个0.03170599btc。这个锁定脚本可以由李斯打开(也可以根据李斯的要求,由一个或多个指定人员打开)。

④0.05262377btc大于0.03170599btc,张三决定把0.02067716btc发给自己,做了一个只有他能回答的锁脚本。不用担心剩余的0.00024062 btc,簿记员默认这部分作为给自己的小费。

⑤ 检查准备好的交易后,将交易序列化并发送到比特币网络中与自身相连的节点。

其实我们只需要输入要转账的金额,还有李四的比特币地址,钱包软件就会完成这些底层操作

上图右侧是张三转给李四的交易0.03170599btc;左边是报价的交易,而张三要花的钱就是左边交易中王舞转给张三的钱。王舞的输入来自另一笔交易,可以记录在账本上。对于上图中的数据,您可以在 btc.com/ 中搜索区块 630,000,然后向下滚动到第 18 笔交易。

张三转给李四的交易0.03170599btc,相关参数如下:

·交易版本号

愿景=1

· 交易输入

txid=41...4c,钱来自交易41...4c;

vout=1,更具体地说,钱是交易 41...4c 的输出 1(输出从 0 开始计数);

比特币网上怎么交易

scriptPubKey=47..ba,用于解锁交易4的锁定脚本1...4c输出1;

sequence=0xffffffff,阻塞LockTime,交易立即生效。

· 交易的输出

输出 0:

value=0.02067716,把找到的零钱转给自己;

scriptPubKey=OP_DUP ... OP_CHECKSIG,自己地址的锁脚本。

输出 1:

value=0.03170599,转入李四的金额;

scriptPubKey=HASH160 ... OP_CHECKSIG,根据李四要求的加锁脚本。

·锁定时间

LockTime=0,sequence的设置使LockTime无效。

总投入和总产出的差额默认为交易费,是对守账的矿工的奖励。输入输出中的脚本会在交易验证中说明,sequence和locktime属于时间锁的范畴。张三进行交易,确认无误后,发送给周边节点。

2.3 交易验证

当每个节点收到其他节点的交易时,都要经过一系列的验证,验证后继续传播,否则直接丢弃。要验证的其他节点:

报价交易中的比特币没有被花掉(就是UTXO)——保证有钱花掉;

投入不低于产出——保证钱够花;

输入中的解锁脚本可以解锁参考交易输出中的锁定脚本——保证消费权;

· 其他验证。

如果这些验证通过,转发将继续。我们主要关注解锁脚本可以解锁参考交易中对应的锁定脚本。

2.3.1脚本构成

交易的输入输出都有脚本,即解锁脚本和加锁脚本。支付给 P2PKH 的最简单的脚本结构如下:

解锁脚本:scriptSig=

锁定脚本:scriptPubKey = 复制哈希 160 用于相等校验数字签名的公钥哈希值

(1)根据上节的交易,张三的解锁脚本如下

473044022067c48d2807966c960feeec2f19028165d6bd6dc68e6c43829d1d8ba899dba2360

22027c6296a001daf8bba85fea14c6ee5dec3c947efea5fd169422d2c04d74d82b0121023f

201d30514c3794d73a134fc6a5d6d05d16762d5f7e0c22f189eeea0afbdba

这是使用可分辨编码规则序列化的字节流。其中,红色的是=;蓝色的是公钥的x坐标,y坐标很容易计算就完成了。

0x30 表示 DER 序列的开始

0x44 - 序列的长度(68 字节)

0x02 - 一个整数值

比特币网上怎么交易

0x20 - 整数的长度(32 字节)

·R-67c48d2807966c960feeec2f19028165d6bd6dc68e6c43829d1d8ba899dba236

0x02 - 一个整数

0x20 - 整数的长度(32 字节)

·S-27c6296a001daf8bba85fea14c6ee5dec3c947efea5fd169422d2c04d74d82b

后缀(0x01) 表示使用的哈希类型(SIGHASH_ALL)

0x21 - 序列的长度(66 字节)

0x02 - 公钥为压缩格式,y坐标为偶数

公钥x坐标:3f201d30514c3794d73a134fc6a5d6d05d16762d5f7e0c22f189eaeea0afbdba

(2)张三引用的未使用输出的锁脚本为:

OP_DUP OP_HASH160 e1643ec0af21071e0f48b39b384cb5d1f49d1303

OP_EQUALVERIFY OP_CHECKSIG

对应含义:复制哈希160公钥哈希值等于校验数字签名

2.3.2验证脚本

脚本验证需要结合解锁脚本和加锁脚本,如下图所示:

比特币脚本语言本质上是一种堆栈语言。

比特币脚本中有元素(带尖括号)和运算符。元素可以看成是板块,算子是对元素的操作。脚本从左到右执行,元素像盘子一样放入桶(栈),后面放的元素(盘子)在最上面。当遇到一个操作符时,它对应一个作用于栈顶元素的操作。

备份哈希160

等价验证 CHECKSIG

上面的脚本有7个项目,执行分为7个步骤。具体流程如下图所示:

如果签名与上一步中的公钥匹配,则 CHECKSIG 返回 TRUE,验证通过。

2.4 交易被传播并记录在块中

节点收到其他节点发送的交易后,经过验证后转发给周围的节点。这就是泛洪算法,它可以在很短的时间内用消息覆盖大部分网络。

交易分布

以一个不合适的中心化软件微信为例(比特币网络是去中心化的):可以把它想象成一个新闻源,发到朋友圈,他的朋友看到​​后会自动转发,检查是否有问题. 大多数玩微信的人都会知道这个消息。

比特币全节点只有一万多个,85=32768,86=262144。考虑到每个节点都会收到重复的消息,但是从与自己相连的每个节点最多会收到相同的重复消息,所以消息通常最多经过6次后会覆盖整个比特币网络。

信用额度

如果矿工成功竞争记账,则该交易被打包成一个区块,成为区块链的一部分,该交易引用的 UTXO 被标记为已使用。当这个区块之后有足够多的区块时,可以认为该交易记录在比特币账本中,无法修改,交易彻底完成。这部分会在挖矿文章中详细讲解。

(待续)