Part I

比特币交易流程

什么是比特币交易?

  • 所谓比特币交易就是从一个比特币钱包向另一个中转账,每笔交易都有数字签名来保证安全。一个交易一旦发生那么就是对所有人都公开的,每个交易的历史可以最终追溯到相应的比特币最初被挖出来的那个点。

比特币如何交易?

  • 比特币交易是比特币系统中最重要的部分。根据比特币系统的设计原理,系统中任何其他的部分都是为了确保比特币交易可以被生成、能在比特币网路中得以传播和通过验证,并最终添加入全球比特币交易总账簿(比特币区块链)。比特币交易的本质是数据结构,这些数据结构中含有比特币交易参与者价值转移的相关资讯。比特币区块链是全球复式记账总账簿,每个比特币交易都是在比特币区块链上的一个公开记录。

  • 比特币交易是不可逆的,任何比特币交易都是不可撤销的,只能由收款人退回比特币。这意味着你需要注意,与你了解和信任或者已经建立的信誉的个人和组织交易

  • 比特币并不是匿名的,在使用比特币的时候保护你的隐私需要花费一些精力。所有的比特币交易都公开且永久地存储在网路中,意味着任何人都能查看任何一个比特币地址的余额和交易记录。然而,除非在购买过程中或者其他状况下透露了身份资讯,比特币地址背后的真实身份是保密的。这也就是建议一个比特币地址仅使用一次的原因之一。永远记住养成良好的习惯来保护你的隐私是你自己的责任。

比特币交易流程

比特币交易流程
  • 一旦一笔比特币交易被发送到任意一个连接至比特币网路的节点,这笔交易将会被该节点验证。如果交易被验证有效,该节点将会将这笔交易传播到这个节点所连接的其他节点;同时,交易发起者会收到一条表示交易有效并被接受的返回资讯。如果这笔交易被验证为无效,这个节点会拒绝接受这笔交易且同时返回给交易发起者一条表示交易被拒绝的资讯。

  • 比特币网路是一个点对点网路,这意味着每一个比特币节点都连接到一些其他的比特币节点(这些其他的节点是在启动点对点协议时被发现的)。整个比特币网路形成了一个松散地连接、且没有固定拓扑或任何结构的“蛛网”——这使得所有节点的地位都是同等的。比特币交易相关资讯(包括交易和区块)被传播——从每一个节点到它连接的其他节点。一笔刚通过验证且并被传递到比特币网路中任意节点的交易会被发送到三到四个相邻节点,而每一个相邻节点又会将交易发送到三至四个与它们相邻的节点。以此类推,在几秒钟之内,一笔有效的交易就会像指数级扩散的波一样在网路中传播,直到所有连接到网路的节点都接收到它。

  • 创建账户

    • 比特币创建全部是匿名账户,在比特币中其实所谓的账户就是用非对称加密算法(比特币使用的椭圆曲线算法)创建的一对秘钥,分为公钥和私钥。 首先私钥是一个随机数,随机选取一个32字节的数,然后再使用椭圆曲线加密算法(ECDSA-secp256k1)对这个私钥压缩生成公钥。 也就是说比特币的账户本质上就是一个随机数而已,没有其他任何信息了,这也就为后来有人利用 比特币洗黑钱带来了前所未有的便利性。所以私钥一定要安全保管,不能让其他人知道,它是你拥有比特币的唯一凭证。公钥是可以暴露给别人的,事实上我们 通常发送给别人的钱包地址就是公钥通过一系列的 hash 计算和Base58编码得到的。但是钱包地址不等于公钥, 因为以上过程全部是不可逆的, 也就是说你不能通过钱包地址推算出公钥,也不能通过公钥反推算出私钥。其实从私钥到地址,中间经过了9个步骤的计算处理,所以私钥是绝对安全的,不可能 被破解。

  • 我们简单把比特币的账户生产过程总结如下

    • 生成一个 32 字节的随机数作为私钥

    • 把私钥使用椭圆曲线算法加密,生成公钥

    • 把公钥进行一系列的 hash 计算生成公钥摘要

    • 使用 Base58 编码技术对公钥摘要进行编码得到地址(这一步是可逆的)

发送交易

  • 假如有A, B 两个账户, 他们的账户信息分别如下

    • A私钥,公钥,地址=> address为:private-key-A, public-key-A,0xxxxxx

    • B私钥,公钥,地址=> address为:private-key-B, public-key-B,0qxxxxxxx

假设 A 要给 B 转账5个BTC, 则付款方会发送这么一笔交易,在实际发送交易之前,A 还需要对交易进行签名,以便于其他接收节点来验证交易。由于非对称加密算法一般一次加密的数据长度有限制(一般是1024字节), 所以在签名之前先会使用 hash 计算得到交易的摘要,然后再对交易摘要进行签名,这样也可以节约计算资源。

假设得到摘要信息是: Lsdjdxcjndjsjsdsdbck , 接下来再用 A 的私钥对摘要进行签名

signature = sign(summary, private-key-A) -> "签名后结果"

  • 签名之后付款节点就会把交易广播到全网节点:我给 B 转账了5个BTC, 大家快来确认. 广播的信息包含了交易原始信息和签名信息.

  • 当然,上面是模拟主要数据,实际交易包含的信息还要多一些,下面贴出比特币的真实交易数据结构:

    • 付款方的签名

    • 付款方的资金来源的交易ID(也即上一个入账区块ID)

    • 交易金额

    • 收款人地址

    • 收款人的公钥

    • 时间戳

验证交易

  • 其他比特币节点收到广播交易之后会对交易进行验证,主要是验证交易是否是本人发起的。因为私钥只有本人才有,所以只要验证签名信息是 是否正确,即是否是使用私钥签名的。当然在真实交易的时候还做一些其他验证,比如付款方的 UTXO(其实就是余额)是否足够等。

存储交易

  • 在交易验证通过之后,当前节点就会把交易写入账本,然后广播到与它相连接的节点,其他节点又会对交易进行验证,打包,广播… 直到全网节点都确认了交易,B用户就会收到A发送的5个比特币。

推荐阅读