主页 > imtokenapp专业版下载 > 区块链学习笔记中对区块链的初步探索:比特币交易结构与流程

区块链学习笔记中对区块链的初步探索:比特币交易结构与流程

imtokenapp专业版下载 2023-01-17 12:40:50

因为比特币是区块链的第一个有效应用。所以学习区块链首先要从比特币开始。

比特币区块链,顾名思义,是一个由不同区块按顺序链接而成的链。

我们先来看看比特币的区块数据结构。

比特币区块数据结构

1.幻数,0xF9BEB4D9,是用于分隔块的固定常数

2.块大小:整个块的大小

3.版本号:软件版本

4.父区块头哈希值:区块的这个位置总是指向前一个区块的区块头哈希值,区块就是这样链接的

5. Merkle root hash:本区块中交易的merkle root

6.时间戳:Unix 时间戳

7.难度目标值=最大难度值/难度值

最大目标值为固定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

难度值:系统会根据上一周期的挖矿时间,每两周(即2016个区块后)调整挖矿难度(通过调整限额数),从而调整出块时间10分钟左右稳定下来。为避免震动,每次调整最大幅度为4次。

8.随机数Nounce:由矿工在挖矿时计算,满足SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x ))

块体数据结构

第一个块体是交易数量,表示这个块有多少交易。

货币所有权的转移信息存储在交易中,所有权登记在比特币地址(Public Key)上。这些信息对全网开放,并以明文形式存储(比特币系统中的所有数据都是明文形式)。只有当需要转移货币的所有权时,才需要使用私钥签名进行验证。

lock_time是一个模棱两可的字段,表示该交易在某个Block高度之前或某个时间点之前被锁定,不能被包含在Block中。

如果该事务的所有输入事务的序列字段为INT32的最大值(0xffffffff),则忽略lock_time字段。否则,交易直到达到区块高度或达到一定时间才会被包含在区块中。

一笔交易由 1 个或多个输入和 1 个或 2 个输出组成。输出分为支付和找零。如果没有找零,那么只有一笔输出付款。矿工费=所有输入-(支付+找零),如果在交易过程中没有写入找零,则表示除支付外的所有矿工费用。当然,目前这些都是由钱包操作的,不用担心不填零钱。钱包会给我们默认矿工费或者让我们填写矿工费。

交易分为三种:挖矿(Generation TX)、合成地址交易(Script Hash TX)、普通交易(Pubkey Hash TX)

一代 TX

此类交易的输入是包含 coinbase 字段的交易。因为是从挖矿中获得的,所以这类交易没有输入。唯一的输入是 coinbase。 coinbase可以由矿工填写,这是矿工出块的特权。著名创世区块的coinbase是2009年2月3日由中本聪填写的泰晤士报头版新闻标题。

输出数量为矿工收益,地址为矿工地址。

脚本哈希发送

这种类型的交易很少见,但很有意义。这类交易的地址不是常用的比特币地址,而是合成地址。这个合成地址以 3 开头。地址可以通过组合 1-3 个公钥来计算。消费该地址的币时,还需要对应的1-3个私钥签名。

脚本哈希发送

这是正常的交易类型。它由多个交易输入和1-2个交易输出(支付+找零)组成。

一般的交易结构是:

常见的交易输入是:

正常的交易输出是:

注意:1 个洋葱 = 1/1 亿比特币

私钥、公钥、地址

私钥是一个随机数,一串 256 位二进制数。比特币软件使用操作系统底层的随机数生成器生成 256 个二进制数并生成私钥。私钥由个人保管,必须妥善保管。只有私钥才能表明你拥有对应地址的比特币的所有权。如果私钥丢失,比特币将永久留在网络上,无法使用。当然,现在我们都有钱包了,钱包会在本地为我们保存私钥,但是一旦卸载了钱包,你需要在重新下载钱包后导入你的私钥。为了去中心化,钱包不会将我们的私钥存储在服务器上。

公钥是通过椭圆曲线加密算法从私钥中得到的。这个过程是不可逆的。也就是说,公钥可以从私钥导出。但是有了公钥,就无法推导出私钥了。

比特币地址是一串数字和字母,通过一系列加密计算和编码从公钥派生而来。派生地址的相同公钥是不可逆的。

这里肯定有人要问了:既然私钥是随机的,位数是固定的,那有没有可能是两个人的私钥相同,或者有人的私钥被破解了?这里我说,如果私钥的生成是随机的,那么2的256次方是一个非常大的数字,比地球上的原子数还多。所以随机生成2个相同私钥的概率远低于在地球上找到2个相同叶子的概率,可以看成是概率。

创建交易

假设 Alice 想将 10 个比特币转移给 Bob。然后她必须在她的客户(可以是钱包)上执行此操作。她必须保存私钥,用私钥完成签名,然后提供签名+公钥。公钥用于比较上一次转账中的公钥(地址),证明上一次转账目标是Alice。也就是说,它证明了爱丽丝拥有比特币。但这还不够,因为公钥没有保密。所以你还需要验证签名。签名使用私钥签名,并严格保密。于是完成公钥验证签名,就成功了。这意味着比特币属于爱丽丝。

公钥可以通过私钥加密计算,地址可以通过公钥使用Base58计算。地址只是为了方便。毕竟公钥是私钥通过椭圆曲线算法得到的X和y坐标,每个坐标都是32位,使用起来不方便。所以公钥经过Base58check算法得到地址。

所以,准确的说,交易就是发起者 Alice 解决的交易输出(UTXO:Unspent Transaction Outputs 未花费的交易输出),然后支付给 Bob,这也是 Bob 的一个问题。如果 Bob 想花钱,他需要解决问题(使用私钥和公钥的签名来证明 BTC 所有权是他的)。

假设 Alice 发给 Bob 的 10 个 BTC 组成如下:Tom 发给 Alice 的 3 个,Lucy 发给 Alice 的 8 个,那么 Alice 需要改 1(实际上需要一个处理手续费,可能只改0.99, 0.01为手续费)。

我们来看看比特币的厉害之处:解决双花(double-spending)问题。什么是双薪?顾名思义,同样的钱花了两次。

两个未使用的交易输出UTXO1和UXTO2通过一次交易变成UTXO3和UTXO4。只要 UTXO1 和 UTXO2 使用一次,就没有“未使用”。以后不再引用。

所以,如果一个人拥有N个比特币,实际上就是这个人比特币地址中UXTO的总和。这个总和通常是由钱包为我们完成的。事实上,比特币并不是我们想象中的货币,而是一个个 UTXO。这个设计很精致,大家可以自己体验一下。

创建交易就是将“原始交易”打包,然后对原始交易进行签名。

交易发送

要发送交易,节点首先要连接到 P2P 网络。然后通过比特币协议将数据广播到网络。

比特币网络上传输的每个有效载荷都需要一个包含有效载荷长度、校验和和消息类型的标头。

在讨论发送、处理和打包到块中的交易之前,让我们先来看看一些概念。

1.有些节点维护着完整的、最新的区块链副本,这样的节点被称为“全节点”。全节点可以独立验证所有交易,无需任何外部参考。

2.还有一些节点只保留区块链的一部分,并通过一种称为简单支付验证(SPV)的方法来验证交易。此类节点称为“SPV 节点”,也称为“轻节点”。

3. UTXO 池可能位于节点本地内存中,也可能位于持久存储中,作为包含索引的数据库表。

4.交易池是存放未验证交易的。存储在本地内存中。

5. 矿工参与挖矿(贡献算力,计算满足挖矿难度目标的Nounce),矿工为节点。但是,节点可能不是矿工(不参与挖矿),不参与挖矿的节点可以同步信息和验证信息。

交易广播到网络后,被节点接收并放入交易池,然后矿工会用这个交易和其他交易计算Merkle根值。交易在交易池中具有优先级,优先级由UTXO的新鲜度、交易的字节数、交易的数量决定。具体来说,对于每一个输入(inputs),客户端会先将比特币的数量乘以这些 UXTO 在区块中存在的时间(年龄,即这个 UTXO 之后有多少个区块比特币有多少社区,区块越多代表年龄越大) ,然后将所有产品相加并除以此交易的大小(以字节为单位)。

矿工计算 Merkle 根值,然后计算满足难度目标的 Nounce(见前面介绍)。区块头中的数字,Merkle根可以通过修改basecoin的内容来改变,时间戳也可以随着计算时间而改变,Nounce随机数也可以改变,所以Nounce是通过调整这三个参数来确定的这个过程称为工作证明。最后打包块。

这样一个新块被创建。新区块产生后比特币有多少社区,节点广播全网,其他节点验证,然后矿工放弃对这些交易的计算。重新开始计算下一个区块Nounce。

如果在这个块之后产生了N个块,就说这个块已经完成了N次确认。完成的确认越多,该区块中的交易就越安全。

补充要点:

该块的哈希值不存储在该块中;交易的交易哈希,即 TXID,也不存储在区块中。比特币块只有1M,所以你可以保存。这些哈希由节点计算并存储为索引。