比特币交易实际上是如何运作的?

本文作者为了帮助自己理解比特币的工作原理而撰写了这篇文章。文章从公钥/私钥对的生成、数字签名,到比特币交易的构建和验证过程进行了较为详细的解释,包括如何创建地址、UTXO、输入和输出,以及PubKey Script的验证过程。最后,还列出了一些对理解比特币有帮助的资源。

我写这篇文章是为了让自己理解比特币的真正运作方式。我认为它可能对其他人也有帮助,但如果我说错了什么,我很想了解是什么以及为什么。我的目的是将此作为关于比特币、最终以太坊,以及可能我发现的其他有趣的内容的一系列帖子。

公钥/私钥对

要开始使用比特币网络,首先要创建一个公钥/私钥对。私钥是任何 256 位数字,因此你可以自己想出一个,下载一个随机创建私钥的程序,或者购买一个硬件钱包,例如 Trezor 或 Ledger,它会根据种子代码生成私钥。这一个种子代码会生成 2²⁵⁶(一个真正大的数字)个私钥,但你只需要记住种子代码即可访问这些私钥。

你的私钥使用 椭圆曲线数字签名算法 (ECDSA) 来创建相应的公钥。该算法使用数学运算将 256 位私钥数字转换为相应的数字字符串,称为公钥。你始终可以使用私钥来创建公钥,但你不能使用公钥并向后推导以获取私钥。公钥和私钥用于加密和解密数据。你可以使用私钥锁定/加密数据,这样解密或解锁数据的唯一方法是使用相应的公钥

数字签名

比特币使用一种称为数字签名的过程来验证交易的真实性和该交易的发送者。你使用公钥/私钥对来对数据进行数字签名,以证明数据没有被篡改,并验证数据必须由拥有给定公钥的私钥的人发送。

步骤 1:发送者有一些他/她想发送给接收者的数据。接收者希望确保他/她从发送者收到的数据没有被篡改,并且一定来自发送者,而不是其他人。

步骤 2:发送者收集要发送的数据。一旦最终确定,发送者使用 SHA256 哈希函数将数据哈希为 256 位数字。

步骤 3:然后,发送者使用他/她的私钥对 256 位数字进行签名,将 256 位数字加密成所谓的数字签名。现在,发送者将数据、数字签名和他/她的公钥发送给接收者(记住,你不能使用公钥来计算出相应的私钥,所以可以共享)。

接收者必须验证发送的数据未被更改,并且必须由拥有与共享公钥对应的私钥的人发送。

步骤 1:接收者获取数字签名并使用收到的公钥对其进行解密,以获得一个 256 位数字。将公钥应用于数字签名会“反转”上面发送者的步骤 3。

步骤 2:然后,接收者获取收到的数据并应用 SHA256 哈希函数,以获得一个 256 位数字。这与发送者的步骤 1 和 2 相同。

步骤 3:然后,接收者检查以确保两个 256 位数字相等。如果为假,则有人篡改了数据或提供了与发送者私钥不对应的公钥。如果为真,则接收者知道数据可以正常使用。

一笔比特币交易

现在你已经创建了你的公钥/私钥对,你就可以加入网络并接收比特币了。你的朋友 Tom 说,如果你提供他你的地址,他愿意给你 10 个比特币。为了创建一个地址,你的公钥被哈希成一个 pubkeyhash 并转换为 base58check 格式,这将生成你今天看到的以“1”或“3”开头的地址。再次注意,你始终可以使用你的私钥来创建一个公钥,并且你始终可以使用你的公钥来创建 pubkeyhash,但你不能向后推导。这是一条单行道。但是,你可以在 pubkeyhash 和比特币地址之间来回转换。

现在,你可以给 Tom 你的地址并接收你的 10 个比特币。为了让 Tom 向你发送你的比特币,他必须使用你的地址创建一个交易输出。输出由一个 索引/位置 组成,以帮助网络在所提供地址的所有者(你)准备花费比特币时找到此交易、以 为单位发送的 比特币数量 以及一个称为 PubKey 脚本的锁定脚本。PubKey 脚本锁定你在你提供给 Tom 的 pubkeyhash(你的地址)中的 satoshi。现在,你 (希望如此!) 是唯一一个拥有可以提供给 PubKey 脚本并解锁你提供的地址中的 satoshi 的私钥的人。

一旦此交易经过验证并被矿工挖掘。你的钱包(对应于你的地址)显示你拥有 10 个比特币。实际上,你的钱包只是跟踪与你的地址对应的输出。这些输出称为未花费交易输出 (UTXO),它们保持空闲状态,直到有人可以提供解锁输出并将比特币发送到另一个地址以创建另一个 UTXO 所需的信息。比特币网络只是一个 UTXO 网络,等待被解锁并作为新的 UTXO 发送到其他地方。比特币不是一个基于账户的系统,这意味着用户没有像你在银行账户中看到的那样积累比特币的一个账户。相反,用户持有解锁网络上 UTXO 的私钥。这也意味着你不能从一个 UTXO 发送一部分 satoshi。每次你创建一个新交易时,你都在发送锁定在 UTXO 中的所有 satoshi。如果你不想将所有 satoshi 发送给一个人,那么你还必须包括一个你想要保留的剩余 satoshi 的地址,并且这些 satoshi 会立即发送回给你。虽然这并不理想,但你可以重复使用同一个地址来发送回你剩余的 satoshi。理想情况下,你应该创建一个你拥有的新地址来发送剩余的 satoshi,以提高隐私。

现在,你可以访问你和 Tom 创建的 UTXO,其中锁定着 10 个比特币,你的朋友 Sarah 也想加入网络并使用比特币。为了让你发送你的 10 个比特币,你必须创建一个包含输入和输出的新交易。

输入

首先,你使用 Tom 的输出中的交易 ID 和索引来正确找到正确的 UTXO 和相应的 PubKey 脚本,有人必须满足该脚本才能花费锁定的比特币。

接下来,你创建一个签名脚本,该脚本将用于满足 PubKey 脚本。签名脚本包含签名和你的公钥。签名是一个数字签名,如上所述,其中“数据”本质上对应于你为 Sarah 创建的整个交易。具体来说,数据是指交易 ID、索引、Tom 的 PubKey 脚本、Sarah 的新 PubKey 脚本以及你发送给 Sarah 的 satoshi 数量。所有这些数据都使用 SHA256 哈希算法进行两次哈希。然后,你使用你的私钥对 256 位数字进行签名以创建签名。这与你的公钥结合构成了签名脚本。

输出

就像 Tom 的输出一样,你的输出包括:一个用于定位此交易的新索引、satoshi 数量以及一个使用 Sarah 提供给你的地址的新 PubKey 脚本,该脚本将比特币锁定在 Sarah 的地址中。现在只有拥有与该地址对应的私钥的人(希望是 Sarah!)才能将这些比特币发送给其他人。

PubKey 脚本

一旦创建了上述交易,你就会将其广播到矿工网络。矿工获取你的签名脚本并在 PubKey 脚本中运行它。如果 PubKey 脚本的结果为真,那么你的交易将被添加到区块中并在网络上验证。

PubKey 脚本如下所示:

<Sig> <PubKey> OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG

比特币是一种基于脚本堆栈的语言。此操作的解释方式如下:

步骤 1:添加你的签名脚本。首先添加你的签名,然后添加你的公钥。

步骤 2:OP_DUP 复制堆栈顶部的任何内容,在本例中为公钥。

步骤 3:OP_HASH160 对堆栈顶部的内容进行哈希处理,在本例中为复制的公钥。现在你有签名、公钥和公钥的哈希值。

步骤 4:PubKey 脚本添加你在第一个交易中给 Tom 的 PubKey 哈希。

步骤 5:OP_EQUALVERIFY 检查堆栈顶部的两个组件,目前是在第一个交易中给 Tom 的 PubKey 哈希和你为签名脚本提供的公钥的哈希值。这两个应该相同。如果为否,则交易失败,并且不会发生任何事情。如果为是,则 PubKey 脚本将从堆栈中弹出这两个组件,以便你只剩下签名 + 公钥。

步骤 6:如上面的数字签名部分所述,OP_CHECKSIG 使用公钥解密签名。然后,该函数检查解密的签名是否等于你签名以创建签名的所有数据的两次哈希输出。如果为否,则交易失败。如果为是,则公钥和签名被弹出,你只剩下 True。

如果为 True,矿工可以将其添加到区块中并在网络上验证。

希望这对你有所帮助。如果没有,我为这篇文章找到的最佳资源是:

  1. Bitcoin.org — 交易
  2. Bitcoin Wiki
  3. Matt Thomas 的视频
  • 原文链接: medium.com/@blairlmarsha...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
blairlmarshall
blairlmarshall
江湖只有他的大名,没有他的介绍。