Bit-Wasp/bitcoin-php 的简单使用:创建钱包 + 进行交易
这里简单介绍了一下最最最基础的 Bit-Wasp/bitcoin-php 的用法,如果你对 bitcoin 还很陌生,推荐 【回形针 PaperClip】区块链到底是什么? 了解 bitcoin 和 比特币交易如何防伪?私钥公钥地址啥意思?李永乐老师讲比特币 (2) 大致了解 bitcoin 的交易流程。想进一步了解 bitcoin,推荐阅读 《精通比特币》。
项目依赖:
bitcoin-php bitcoin的php实现库,用于创建助记词和生成私钥 (此库需要运行在64位的php7.0+上)
ethereum-util 以太坊常用函数php实现库
1 2 | composer require bitwasp/bitcoin composer require web3p/ethereum-util |
创建钱包
不同于中心化的钱包( 支付宝 / 微信 ),创建 Bitcoin 钱包不需要网络,只需要一个足够随机的数字 n ( 1 < n < 1.158 * 10^77 -1 , 略小于 2^256 ,关于这个数是否足够安全,可以看这个视频:256 位加密有多安全?),公钥和地址都是由这个 n 生成,它被称作 私钥。
创建钱包本质上就是找到一个随机数。

但是你不能用 php 自带的随机数生成函数!!!因为 php 自带的这些随机数生成函数并不是密码学安全的随机数生成器(它是基于 unix 时间戳 /mac 地址 /etc 生成的数字,并不是真正的随机数)。

但是我们可以使用 Bit-Wasp/bitcoin-php 中密码学安全的随机数生成器生成一个随机数来作为我们的钱包:
在 Laravel Job 中的实现
<?php
namespace App\Jobs\Bitcoin;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Models\Bitcoin\Wallet;
use BitWasp\Bitcoin\Address\PayToPubKeyHashAddress;
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Crypto\Random\Random;
use BitWasp\Bitcoin\Key\Factory\PrivateKeyFactory;
class GenerateWallet implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$random = new Random();
$private_key_factory = new PrivateKeyFactory();
$private_key = $private_key_factory->generateCompressed($random);
$public_key = $private_key->getPublicKey();
// p2pkh 格式的地址
$address = new PayToPubKeyHashAddress($public_key->getPubKeyHash());
// 将生成的钱包保存到数据库中
$wallet = new Wallet;
$wallet->wif = $private_key->toWif($network);
$wallet->address = $address->getAddress();
$wallet->save();
// 保存到日志文件中
$log = "wif: ". $wallet->wif . PHP_EOL .
"address: ". $wallet->address . PHP_EOL .
"-------------". date('Y-m-d Hs') ."------------" . PHP_EOL;
file_put_contents('./wallets.log', $log, FILE_APPEND);
}
}下面就是我们创建的一个新钱包的示例:

wif 是一种私钥的格式,也是各个交易所、钱包所通用的私钥导入格式,原始的二进制数主要用于程序内部。
创建交易
我们首先来看一下一个已完成的交易有那些内容:

此标准交易的主要组成部分采用颜色编码:
交易 ID(以黄色突出显示)
描述符和元数据(蓝色花括号在右边详细说明)
输入(粉色区域)
输出(绿色区域)
我们要做的就是要离线构造一个如上的数据,在通过第三方或者你自己的结点广播出去,待区块确认后,即可视为完成了交易。
在这里需要注意以下几点:
交易信息里面,收款人的信息在输出里面,锁定脚本(scriptPubKey)将限制使用人,也就是地址所对的私钥。
交易时需要提供上次交易的 id,来证明你对 bitcoin 的所有权
bitcoin 的地址存在几种类型,这里暂不讨论,这里将根据提供的 p2pkh 地址发送到 p2wpkh 地址
在 Laravel Job 中的实现
<?php
namespace App\Jobs\Bitcoin;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use BitWasp\Bitcoin\Address\PayToPubKeyHashAddress;
use BitWasp\Bitcoin\Bitcoin;
use BitWasp\Bitcoin\Key\Factory\PrivateKeyFactory;
use BitWasp\Bitcoin\Script\Interpreter\InterpreterInterface as I;
use BitWasp\Bitcoin\Script\ScriptFactory;
use BitWasp\Bitcoin\Transaction\Factory\Signer;
use BitWasp\Bitcoin\Transaction\Factory\TxBuilder;
use BitWasp\Bitcoin\Transaction\OutPoint;
use BitWasp\Bitcoin\Transaction\TransactionOutput;
use BitWasp\Buffertools\Buffer;
use BitWasp\Bitcoin\Transaction\Factory\SignData;
use BitWasp\Bitcoin\Script\WitnessScript;
use BitWasp\Bitcoin\Script\P2shScript;
use BitWasp\Bitcoin\Address\SegwitAddress;
use BitWasp\Bitcoin\Script\WitnessProgram;
use BitWasp\Bitcoin\Address\AddressCreator;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
class Transfer implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// 支付钱包的私钥(wif 格式)
$wif = 'KxwUMCtXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxEGooz';
// 支付钱包上一次交易的 id
$txid = '4c7a031a31fe794e64ef5ca2714bdd9dd10ceae44650bce025952282bdeeda8b';
// 收款钱包地址(p2pkh 格式)
$address = '1LRqwmjqLNNybJ3M2zQHiwvyA6ikbQQkyS';
$privKeyFactory = new PrivateKeyFactory;
$key = $privKeyFactory->fromWif($wif);
$witnessScript = new WitnessScript(
ScriptFactory::scriptPubKey()->payToPubKeyHash($key->getPubKeyHash())
);
$dest = new SegwitAddress(
WitnessProgram::v0(
(new AddressCreator())->fromString($address)->getHash()
)
);
// UTXO
$outpoint = new OutPoint(Buffer::hex($txid, 32), 0);
// 这里一共将支出 100000 聪(0.00000001 BTC = 1 聪)
$txOut = new TransactionOutput(100000, $witnessScript);
// 收款人将收到 90000 聪,中间的差将作为矿工的手续费
$builder = (new TxBuilder())
->spendOutPoint($outpoint)
->payToAddress(90000, $dest);
// 签署交易
$signer = new Signer($builder->get(), Bitcoin::getEcAdapter());
$input = $signer->input(0, $txOut);
$input->sign($key);
$signed = $signer->get();
// 需要进行广播的交易
$broadcast = $signed->getBaseSerialization()->getHex();
// 我这里使用 blockchain.info 的接口进行广播,你可以使用你自己的结点,或者现成的 RPC 接口
$client = new Client;
try {
$response = $client->request('POST', 'https://blockchain.info/pushtx', [
'form_params' => [
'tx' => $signed->getBaseSerialization()->getHex()
]
]);
var_dump(json_decode($response->getBody(), true));
} catch (ClientException $e) {
var_dump($e->getResponse());
}
}成功进行广播你将收到:

待 10-15 分钟后,交易被写入区块,再等待后续生成 2-3 个区块,即可视为交易完成。
你可以在 Electrum 这样的开源钱包中查看你收到的钱

关于手续费:
你完全可以一毛不拔,一聪都不给,但是就没有矿工愿意打包你的交易,你的交易将永远无法完成。bitcoin 矿工的收入来自打包完成的系统奖励(到 2024 年就没有了)和该区块中的所有交易的手续费,所以矿工总是优先打包手续费多的交易。
你可能感兴趣的文章
-
加密货币空投有哪些类型?如何安全领取空投代币?完整指南
随着区块链技术的不断发展,空投(Airdrop)已成为加密项推广的重要式,简单来说,空投就是免费发放加密货币,的是吸引更多户关注项目并参与其中,对新来说,空投是种低槛的 …
2025-09-23 -
区块浏览器怎么用?怎么查看链上数据和转账状态?
区块浏览器是一种专门用于查询和浏览区块链信息的工具,本质上是区块链的 “搜索引擎”, 它能实时浏览和查询区块链上的区块高度、交易记录、地址、代币等信息,将复杂的链…
2025-09-23 -
2025年如何挖掘莱特币 (LTC)币?挖矿教程、收益分析
莱特币诞生于 2011 年,是比特币的一个分叉,旨在成为更轻量、更快速的支付网络,它采用 Scrypt 算法,这是一种不同于比特币 SHA-256 的哈希算法,最初的设计目的是降低挖矿…
2025-09-23 -
什么是跨链桥?市面上有哪些跨链桥?一文介绍
什么是跨链桥?跨链桥在加密货币领域发挥着至关重要的作用,它实现了不同区块链网络之间的资产转移,这是必要的,因为每个区块链都按照自己的规则独立运行,因此无法直接在…
2025-09-23 -
DeFi 3.0是什么?DeFi 3.0 代币、功能、工作原理介绍
去中心化金融 (DeFi) 已经彻底改变了人们对货币、借贷和投资的认知,从早期简单的借贷协议到如今高度复杂的收益挖矿方法,DeFi 不断发展演变,这种演变的最新阶段就是人们所…
2025-09-23 -
DePINFi是什么?有哪些分类?DePINFi的趋势的优势和挑战介绍
DePINFi 是“去中心化物理基础设施网络金融”的缩写,是去中心化物理基础设施网络 (DePIN) 与去中心化金融 (DeFi) 的交汇点,下面小编就为大家详细介绍一下它吧…
2025-09-22 -
Base生态核心项目有哪些?一文速览值得关注的20个Base生态项目
本文将推荐Base生态中值得关注的20个项目,通过梳理这些项目的市场定位和资本表现,来判断Base生态的真实厚度,并进一步揭示其未来增长的动力来源,这不仅是对Base App转型…
2025-09-22 -
一文盘点Web3 AI的11个潜力项目:不要错过的造富列车
Web3 AI为普通人提供了参与AI财富创造的机会,不同于传统AI的精英化,以下是我们精选的 Web3 AI领域最具潜力的项目和方向,Web3 AI的造富列车已经启动,现在上车还来得及…
2025-09-22 -
什么是加密货币完全稀释估值FDV?怎么算?为何代币解锁可能意味着上涨
什么是加密货币完全稀释估值FDV?为何代币解锁可能意味着上涨?FDV 考虑的是代币的总供应量,而流通供应量指的是当前市场上实际交易的代币,理解 FDV 有助于全面评估一个项…
2025-09-20 -
什么是加密货币市值?市值为何重要?如何影响加密货币价格?
市值,通常被称为“市值”,是一个反映加密货币总价值的财务指标,它是通过将加密货币的当前价格乘以其总流通供应量来计算的,本文深入探讨了加密货币市值的含义、计算方法以…
2025-09-19










