本文旨在简要介绍 Bit-Wasp/bitcoin-php 这一基础库的核心用法。若你对比特币(Bitcoin)尚不熟悉,建议先通过【回形针 PaperClip】的视频了解区块链的本质,或通过李永乐老师讲解比特币 (2) 的视频学习防伪原理、私钥公钥及地址概念,从而对比特币的交易机制建立初步认知。此外,推荐阅读《精通比特币》以获取更深入的知识。
钱包创建
与支付宝或微信等中心化钱包不同,构建 Bitcoin 钱包无需联网,其核心在于生成一个具备高度随机性的数字 n(取值范围:1 < n < 1.158 * 10^77 -1,该数值略小于 2^256。关于该数值的安全性与安全性探讨,可参考相关视频解析)。由这个数字 n 衍生出公钥和地址,这个 n 即被称为私钥。
因此,创建钱包的过程本质上是寻找一个符合要求的随机数。

在此过程中,严禁使用 PHP 内置的随机数生成函数!!!原因在于,PHP 自带的随机数生成器并非密码学安全级别(它通常基于 Unix 时间戳、MAC 地址或 /etc 目录信息生成,不具备真正的随机性)。

我们可以借助 中密码学安全的随机数生成器来生成满足条件的随机数,进而作为钱包的基石:
以下是该逻辑在 Laravel Job 中的具体实现方式:
以下展示了一个新钱包生成的示例代码:

WIF(Wallet Import Format)是一种通用的私钥格式,广泛应用于各类交易所和钱包软件中用于私钥导入;而原始的二进制数据则主要服务于程序内部处理。
交易构建
首先,让我们剖析一笔已完成交易的结构组成:

该标准交易的关键部分已通过颜色编码区分:
- 交易 ID(以黄色高亮显示)
- 描述符及元数据(右侧蓝色花括号区域进行了详细说明)
- 输入部分(粉色区域)
- 输出部分(绿色区域)
我们的目标是离线构造出上述结构的数据,随后通过第三方服务或自有节点将其广播至网络。一旦获得区块确认,即视为交易完成。
在此环节中,需特别注意以下几点:
收款方信息位于交易的“输出”部分。锁定脚本(scriptPubKey)将约束资金的使用权限,即只有对应地址的私钥持有者才能动用资金。
发起交易时,必须提供前序交易的 ID,以此证明你对该笔比特币的所有权。
比特币地址存在多种类型,此处暂不展开讨论。本例中将演示如何从 p2pkh 地址向 p2wpkh 地址发送资金。
此过程在 Laravel Job 中的实现如下:
若交易成功广播,你将收到类似以下的响应:

通常情况下,经过 10-15 分钟,交易将被写入区块。为确保最终确定性,建议等待后续再产生 2-3 个区块,此时即可认定交易彻底完成。
你可以利用 这样的开源钱包查看收到的款项。

关于交易手续费:
虽然理论上可以不支付任何费用(即一毛不拔),但若无矿工愿意打包你的交易,它将永远无法进入区块链。比特币矿工的收益来源于系统产生的区块奖励(注:到 2024 年此类奖励将减半或结束)以及该区块内所有交易的手续费总和。因此,矿工总是优先处理手续费较高的交易。