主页 > imtoken钱包下载2.0版本 > 比特币交易是什么样的?

比特币交易是什么样的?

imtoken钱包下载2.0版本 2023-01-17 19:41:47

比特币价值比特币最新_比特币李笑比特币身价_比特币长什么样

交易是什么样的

比特币采用区块链技术,所以它产生的所有区块(一个区块包含很多笔交易)都是透明可查的,你可以进入这个网站:查询。

binfun 选择 BTC 历史区块中的一笔交易:

交易号为:0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2

交易内容如截图所示:

比特币李笑比特币身价_比特币长什么样_比特币价值比特币最新

从上图我们可以看到“输入”中的账户1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK把0.1个BTC分别转给了“输出”中的账户1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA(该账户收到了0.01500000个BTC)和1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK(该账户也就是原账户发送给了拥有 0.08450000 BTC)。

所以这笔交易是从账户1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK转0.015 BTC到1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA。

但是输出中的0.0845 + 0.015 = 0.0995不等于0.1,因为去掉的0.0005是矿工费。

进一步看

上图实际上将这笔交易形象化了,看起来像这样:

{
  "version": 1,
  "locktime": 0,
  "vin": [
    {
      "txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
      "vout": 0,
      "scriptSig""3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
      "sequence": 4294967295
    }
 ],
  "vout": [
    {
      "value": 0.01500000,
      "scriptPubKey""OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
      "value": 0.08450000,
      "scriptPubKey""OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
    }
  ]
}

你不是一脸懵逼吗? 这是正确的。 本次交易主要由vin和vout组成。 不懂的话,我们先从熟悉的数字说起:vout中有"value": 0.01500000和"value": 0.08450000。 我理解这两个数字。 这是转账号码。

就是刚才从比特币地址1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK发送到另一个比特币地址1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA的钱。

听说比特币地址是用Base58编码的。 我们不知道Base58编码是什么,也不敢问。 反正估计跟Base64差不多。

于是binfun在不知不觉中从网上下载了一个脚本bitcoin.sh,并对地址进行了Base58解码:

. bitcoin.sh
decodeBase58 1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK

得到了:

007f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a801974ac6

这串十六进制数有点眼熟,是不是跟上面看到的一样

    {
      "value": 0.08450000,
      "scriptPubKey""OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
    }

7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 

非常接近,只是头部有“00”,尾部有“01974ac6”

头部的“00”代表主网版本号,“01974ac6”代表校验和,可以通过以下python命令生成:

import hashlib
import codecs
key = codecs.decode('007f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8''hex')
r = hashlib.new('sha256', key).digest()
r = hashlib.new('sha256', r).digest()
print(codecs.encode(r, 'hex').decode("utf-8"))
01974ac64161c88c363cc701200f529e517ab8a68d11e5f9e46bdb459cc34cd9

可以看出校验和是连续两次sha256的结果,取结果的前四个字节,即01974ac6

以上过程类似于比特币地址和比特币公钥的转换过程。

细看

为了便于理解,我们可以认为在vout中,上述两个比特币地址分别获得了0.015和0.0845 BTC。

也就是说,vout就是将比特币“锁定”在上面两个比特币地址中,上面出现的scriptPubKey就是所谓的“锁定脚本”。

那么vin是做什么的呢,就是解锁,我们再看看vin:

  "vin": [
    {
      "txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
      "vout": 0,
      "scriptSig""3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
      "sequence": 4294967295
    }
 ],

上面的txid是交易id的缩写。 我们当前的txid为0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2(下图中简称为txid0627052b)

但是在vin中引用

"txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",

(下图中简称为txid7957a35f)

这看起来有点绕,具体含义如下图所示:

比特币价值比特币最新_比特币长什么样_比特币李笑比特币身价

所以scriptSig是“解锁脚本”的意思,内容是用户A用自己的私钥签名,证明我是地址A私钥的拥有者,我有权使用地址锁定的余额一种 。

那么问题又来了,用户A的钱是从哪里来的呢? ? ? 事实上,如果一直追根溯源,每个人的比特币最终都来自一个叫做coinbase的特殊交易。 Coinbase交易是没有vin的,coinbase交易是由挖矿的矿工产生的,所以挖出来的币都是“新币”。 用户转出的币,如果追溯上去,都是矿工挖出来的。

解锁和锁定脚本

现在我们知道有解锁资金的解锁脚本和锁定资金的锁定脚本,解锁脚本在“vin”中,锁定脚本在“vout”中。

那么这些脚本是什么样的呢? 比特币交易脚本语言是一种基于堆栈的执行语言,具有反向波兰表达式。

在介绍解锁和锁定脚本之前,我们先介绍一下比特币的私钥、公钥和比特币地址之间的关系。

比特币李笑比特币身价_比特币价值比特币最新_比特币长什么样

关于比特币公钥和私钥的特点,你只需要知道这两点:

私钥经过椭圆算法生成公钥,公钥经过哈希算法(即公钥哈希)生成比特币地址。 这个过程是不可逆的,也就是说不能从公钥推导出私钥,但是私钥可以生成公钥。

一段用私钥加密的文本只能用公钥解密,用公钥加密的文本只能用私钥解密。 这是一种非对称加密算法。

vout中一个典型的锁定脚本如下:

OP_DUP OP_HASH160  
OP_EQUALVERIFY OP_CHECKSIG

应该注意的是,

它是公钥的哈希值(可以从中得出比特币地址),锁定脚本指定拥有公钥哈希值的私钥的人来解锁脚本。

一个典型的vin中的解锁脚本如下:

 

解锁脚本提供签名以及

公钥比特币长什么样,签名是用私钥加密交易生成的。

验证脚本时,需要将两个脚本组合起来,如下所示:

  OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG

以上运行规则类似于逆波兰表达式的栈脚本,流程如下:

首先要验证的是解锁脚本提供的公钥。 执行HASH160哈希运算后,判断是否与锁定脚本中提供的比特币地址(公钥哈希)一致。

然后,验证的是解锁脚本提供的签名。 验证节点将使用公钥对签名进行解密,并确认解密后的文本是否正确。

上面最关键的一点是使用公钥解密签名,这样比特币的拥有者就可以在不泄露私钥的情况下证明所有权,只需要使用私钥生成签名即可。 那么私钥加密的文本是什么呢? 或者换句话说,公钥解密签名后的文字是什么? 好吧,我说的是以下段落的本质:

      "scriptSig""3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",

以下将txid7957a35f称为交易A,将txid0627052b称为交易B。

从各种来源,我们可以提取以下信息:

那么问题来了,如何用私钥加密交易B——生成签名,然后将生成的签名放入交易B的scriptSig中。

答案是这样的,签名生成的步骤如下:

将对应事务A输出中的锁定脚本填入事务B中的解锁脚本字段。

第一步生成的文本加入little-endian 4字节签名类型0x01(灰色部分),并计算两次SHA256。

然后用私钥对第二步计算出的SHA256文本进行加密,最后得到签名。

从以上步骤可以看出,由于交易B的scriptSig字段在交易A的输出中先填充了locking script,签名生成后比特币长什么样,将签名放在scriptSig中,这样交易B就完全生成! ! !

下图中的sigScript为解锁脚本,pkScript为锁定脚本。

比特币李笑比特币身价_比特币价值比特币最新_比特币长什么样

参考资料:http://www.infoq.com/cn/articles/deep-understanding-of-bitcoin-transaction-script

原创不易,“赞”“看”是我的动力!