主页 > imtoken安全下载 > 区块链教程系列:比特币钱包与交易

区块链教程系列:比特币钱包与交易

imtoken安全下载 2023-12-09 05:09:32

同态加密是一种加密形式,它允许人们对密文进行某些代数运算以获得仍然加密的结果,并对其进行解密并获得与对明文进行相同操作相同的结果。换言之,该技术使得对加密数据进行检索、比较等操作,在整个过程中无需对数据进行解密,即可得到正确的结果。其意义在于,它可以从根本上解决将数据及其操作委托给第三方时的保密问题,例如各种云计算应用。

密钥、地址和钱包

比特币所有权是通过数字密钥、比特币地址和数字签名建立的。数字密钥实际上并不存储在网络中,而是由用户生成并存储在称为钱包的文件或简单数据库中。存储在用户钱包中的数字密钥完全独立于比特币协议,可以由用户的钱包软件生成和管理,无需区块链或网络连接。密钥支持比特币的许多有趣功能,包括去中心化信任和控制、所有权身份验证以及基于加密证明的安全模型。

比特币钱包只包含私钥,不包含比特币。每个用户都有一个包含多个私钥的钱包。钱包包含一对私钥和公钥。用户使用这些私钥签署交易,证明他们拥有交易的输出(即其中的比特币)。比特币以交易输出的形式存储在区块链上(通常表示为 vout 或 txout)。

如果钱包只包含私钥,钱包地址是什么?钱包地址来源于公钥的哈希值,如下图:

首先使用随机数生成器生成“私钥”。一般来说,这是一个 256 位的数字。有了这串数字,就可以操作对应“钱包地址”中的比特币,所以一定要安全存放。 “私钥”经过SECP256K1算法处理,生成“公钥”。 SECP256K1 是一种椭圆曲线算法。当“私钥”已知时,“公钥”可以计算出来比特币钱包,但“公钥”已知时比特币钱包,“私钥”无法逆向计算。这是保护比特币的算法基础。与SHA256一样,RIPEMD160也是一种Hash算法,可以从“公钥”计算出“公钥哈希”,但反过来是行不通的。将一个字节的地址版本号连接到“Public Key Hash”头(对于比特币网络的pubkey地址,这个字节为“0”),然后对其进行两次SHA256运算,添加前4个字节使用作为最后连接的“公钥哈希”的校验值。 “钱包地址”是通过将上一步的结果用BASE58(比特币的定制版)编码得到的。例如,1A1zP1eP5QGefi2DMPTfTL5TTmv7DivfNa。

所以私钥、公钥和钱包地址的关系如下图所示:

比特币钱包

你看到钱包地址1A1zP1eP5QGefi2DMPTfTL5TTmv7DivfNa有什么想法?

一定有人在想,这么长的一串字母和数字太难记了。你能生成一个更容易记住的钱包地址吗?比如MyNameIsHanMeiMei....以这个开头的地址呢?

当然,这叫做虚地址,但是需要大量的计算能力。

比特币交易

简单来说,一笔交易就是通知全网比特币的持有者已经授权将比特币转让给他人。然后新的持有者可以再次授权,将其转移给该比特币所有权链中的其他人。

请注意,在比特币的世界中,既没有账户也没有余额,只有分散在区块链中的 UTXO(未使用的交易输出)。

比特币钱包

如何理解这个 UTXO?如果没有账户也没有余额,钱包里的金额是怎么计算的?

别着急,我们来一一做吧。

也就是说,在比特币中,比特币钱包之间的转账是通过交易来实现的。

我们来看一个标准的交易流程。

那么问题来了,世界上第一个比特币是从哪里来的?

回答,它来自采矿。好吧,我们的 001 交易代表了一个挖矿过程。本次交易,输入为挖矿,输出编号为1,BTC数量为50,目的地址为A,即50 BTC给A。

比特币钱包

接下来,A要发送25 BTC给B,这个交易如何构造?

同样,我们需要一个输入,也就是001交易的第1个输出,我们用它作为001.1。输出一分为二,第一个输出数字1,表示要支付25个BTC给B。第二个输出数字是2,表示剩余的BTC要还给A。

你可能会问,输入是 50 BTC,两个输出加起来只有 45 BTC。好像还少了5个BTC?没错,5 BTC就是矿工的挖矿收益。

接下来,A继续向C转账。同理,交易一一关联。

从上面的例子我们可以看出,钱其实是一一存储在交易记录中的,那些未花费的输出称为UTXO(Unspent Transaction Outputs)。

那么如何保证转给B的钱不会被其他人消费呢?这涉及到交易的加密过程。

我们以单个输入和输出为例,详细了解交易的构成:

比特币钱包

上图中,交易的输入为txid,即之前产生的交易ID,没有花费summer输出。 output index 是交易的输出id。

一个很重要的ScriptSig是输入交易的验证,表明用户有这个账户的转账权限。

输出是一个脚本,只有满足脚本运行条件的人才可以消费这个输出。这是 ScriptSig 需要验证的脚本。

让我们看看脚本是如何进行身份验证的。

比特币有两种标准输出格式。支付给公钥哈希(P2PKH)和支付给脚本哈希(P2SH)。两者的区别在于,一个是hash输出到公钥,一个是输出到任意脚本输出hash。

为了保证输出只能由特定的人使用,一般情况下直接输出到对方的公钥哈希中。由于只有对方拥有的私钥才能生成这个公钥哈希,也就是说只有对方才能验证输出。

比特币钱包

但是每次要知道对方的公钥哈希还是很麻烦的。更简单的方式是发送方可以直接输出一个特定的哈希值,只要对方能够生成这个哈希值。 .

以下示例是一个 P2PKH 脚本。

P2PKH的输出是一个脚本,其中一个重要的值就是PK哈希。

如何验证?

authenticator提供两个值,一个是sig,另一个是PubKey。因为比特币的虚拟机是栈结构,所以我们先把这两个值压入栈中。

然后调用OP_DUP复制顶层PubKey,然后调用OP_HASH160算法计算Pk Hash,然后将发送方保存的Pk Hash压入栈中。接下来,调用 OP_EQUALVERIFY 比较两个 PK Hash。

如果比对成功,最后验证Sig和PubKey是否匹配。

如果两者都成功,那么接收者确实是这个 PK Hash 的拥有者。然后他们就可以尽情地使用它了。