当前位置:首页 > 区块链技术 > bitcoin-php使用方法

Bit-Wasp/bitcoin-php 的简单使用:创建钱包 + 进行交易

2025-08-21 19:10:54 | 来源: | 作者:家猪配种专家
这里简单介绍了一下最最最基础的 Bit-Wasp/bitcoin-php 的用法,如果你对 bitcoin 还很陌生,推荐 【回形针 PaperClip】区块链到底是什么?

这里简单介绍了一下最最最基础的 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 年就没有了)和该区块中的所有交易的手续费,所以矿工总是优先打包手续费多的交易。

免责声明:本文只为提供市场讯息,所有内容及观点仅供参考,不构成投资建议,不代表本站观点和立场。投资者应自行决策与交易,对投资者交易形成的直接或间接损失,作者及本站将不承担任何责任。!

你可能感兴趣的文章

币圈快讯

  • 美国个人储蓄率9月份下降0.2个百分点至4.2%创2022年10月以来最低水平

    2026-11-01 04:41
    11月1日,据TheKobeissiLetter披露,美国个人储蓄率9月份下降0.2个百分点至4.2%,创下2022年10月以来的最低水平。自2024年1月以来,美国个人储蓄率已累计下降3.4个百分点。目前,个人储蓄率已远低于疫情前五年6.2%的平均水平。与此同时,9月美国个人收入同比增长4.1%,为2022年4月以来第二低的增速。同期,个人消费支出(PCE)同比增长6.3%,为2024年12月以来第二高的同比增幅。换言之,消费者支出增速持续超过收入增长,进一步挤压家庭储蓄,并使家庭对借贷的依赖程度上升。持续高企的通胀和处于历史高位的物价,也在进一步侵蚀消费者的储蓄。
  • 《华尔街日报》胜诉特朗普100亿美元诽谤诉讼被驳回

    2026-11-01 04:38
    11月1日,美国一名联邦法官驳回了唐纳德·特朗普重新提起的、针对《华尔街日报》的100亿美元诽谤诉讼,并裁定该案不得再次起诉,这是特朗普在与媒体的法律纠纷中遭遇的又一次挫折。迈阿密法官DarrinGayles于周六批准了《华尔街日报》的撤诉申请。诉状指控该报在一篇关于特朗普与已故杰弗里·爱泼斯坦往来的报道中对其构成诽谤。Gayles曾在4月以证据不足为由首次驳回该案,但当时允许特朗普补充诉求后重新起诉。特朗普在5月提交新版本诉状,而《华尔街日报》认为新版本并未做出有效完善。这项裁决对《华尔街日报》、其母公司新闻集团以及名誉主席鲁珀特·默多克(均为该案被告)而言是重大胜利。被告方在撤诉申请中称,相关报道内容属实,特朗普提起诉讼意在压制媒体对他的批评。引发这起诉讼的《华尔街日报》报道称,特朗普曾向爱泼斯坦寄送一封带有暗示性内容的生日信件。(新浪财经)
  • Name.com域名劫持事件升级:15个客户域名受影响并全部恢复其中10个与Vercel平台相关

    2026-11-01 04:08
    11月1日,Name.com向TheBlock表示,此次攻击中共有15个客户域名被劫持,超过此前确认的12个,目前这些域名已全部恢复。Vercel则表示,受影响的域名中有10个与其平台相关联。此前消息,周五晚些时候,黑客入侵了十余个DeFi网站,包括Flap、Kintsu、PickleFinance和OrigamiFinance,并利用这些网站清空了访问者的加密货币钱包。据TheBlock获取的注册记录显示,这12个被劫持的域名均通过Name.com注册,其中10个已于周六上午在注册商层面被暂停。TheBlock迄今已将约13.8万美元的被盗资金追踪到EVM链上的三个钱包,这一数字尚未计入Solana或Aptos链上的任何损失。
  • 伊朗最高国家安全委员会秘书雷扎伊:战争应永久结束不应再有任何国家“胆敢”对伊朗发动攻击

    2026-11-01 03:40
    伊朗最高国家安全委员会秘书雷扎伊:我们认真对待外交,但不会放弃伊朗人民的权利。战争应永久结束,不应再有任何国家“胆敢”对伊朗发动攻击。在伊朗的七项条件得到满足之前,不会进行谈判,也不会开放霍尔木兹海峡。如果后续阶段举行核谈判,伊朗依据《不扩散核武器条约》享有的核权利应得到尊重。(金十)
  • 何一:将从币安SAFU基金地址划拨50%的资金弥补损失

    2026-11-01 02:57
    11月1日,币安联合创始人何一在X发文表示,将从币安SAFU基金地址中划拨50%的资金用于弥补此次损失,同时保留基金剩余的50%。有关该地址的详细信息已在公告中公布,感兴趣的用户可以查阅。
  • 查看更多