本文目录导读:

- 步骤一:准备智能合约(Solidity)
- 步骤二:PHP环境搭建与依赖安装
- 步骤三:PHP代码实现(铸造NFT)
- 步骤四:处理NFT元数据(Metadata)
- 方案二:使用第三方NFT铸造服务(简化)
- 总结与注意事项
这是一个关于在PHP中创建NFT(非同质化代币)的详细指南,需要明确的是:PHP本身不能直接“创建”区块链上的NFT,因为NFT本质上是区块链上的智能合约(通常遵循ERC-721或ERC-1155标准),PHP的作用是作为后端服务器,通过调用区块链的RPC接口(或使用第三方服务)来与智能合约交互,从而完成铸造(Mint)操作。
下面我将分步骤介绍如何在PHP环境中实现NFT的创建与铸造。
核心思路
- 编写/部署智能合约:首先需要有一个已部署到区块链(如以太坊、Polygon、币安智能链等)上的NFT智能合约。
- PHP后端交互:PHP通过
web3.php等库,或通过第三方API(如Alchemy、Moralis、Pinata),与链上合约进行交互。 - 元数据准备:NFT通常需要元数据(名称、描述、图片链接等),这些数据常存储在IPFS(如使用Pinata)或中心化服务器上。
准备智能合约(Solidity)
假设你已有一个符合ERC-721标准的NFT合约,并已部署到测试网或主网,以下是简化版的合约示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721, Ownable {
uint256 public tokenCounter;
constructor() ERC721("MyNFT", "MNFT") {
tokenCounter = 0;
}
function mint(address to) public onlyOwner returns (uint256) {
uint256 newTokenId = tokenCounter;
_safeMint(to, newTokenId);
tokenCounter = tokenCounter + 1;
return newTokenId;
}
}
说明:该合约包含一个mint函数,仅合约拥有者(例如你的PHP后端钱包地址)可以调用,铸造NFT并发送给指定地址。
PHP环境搭建与依赖安装
使用web3.php库与以太坊节点交互,需要PHP 7.4+,并安装composer。
composer require sc0vu/web3.php
PHP代码实现(铸造NFT)
假设你已有:
- 合约地址(如
0x...) - 合约ABI(从编译后的JSON中获取)
- 钱包私钥(用于签名交易,注意安全存储,不要暴露在代码中或公开仓库里)
以下是一个完整的PHP脚本,调用合约mint方法。
<?php
require 'vendor/autoload.php';
use Web3\Web3;
use Web3\Contract;
use Web3\Utils;
use Web3\Providers\HttpProvider;
use Web3\RequestManagers\HttpRequestManager;
// 配置
$rpcUrl = 'https://eth-sepolia.g.alchemy.com/v2/YOUR_ALCHEMY_API_KEY'; // 使用Sepolia测试网
$contractAddress = '0xYOUR_CONTRACT_ADDRESS';
$privateKey = '0xYOUR_PRIVATE_KEY'; // 不要硬编码!使用环境变量或配置文件
$toAddress = '0xRECEIVER_ADDRESS'; // 接收NFT的地址
// 合约ABI(仅包含mint方法片段,实际需完整ABI)
$contractABI = '[
{
"inputs": [{"internalType": "address","name": "to","type": "address"}],
"name": "mint",
"outputs": [{"internalType": "uint256","name": "","type": "uint256"}],
"stateMutability": "nonpayable",
"type": "function"
}
]';
// 初始化Web3
$web3 = new Web3(new HttpProvider(new HttpRequestManager($rpcUrl, 5)));
// 创建合约实例
$contract = new Contract($web3->provider, $contractABI);
// 根据私钥获取账户地址(用于签名)
$account = \Web3\Utils::privateKeyToAddress($privateKey); // 注意:要检查库是否提供此方法,若没有,可使用第三方如 kornrunner/keccak
echo "Sender address: " . $account . PHP_EOL;
// 准备交易参数
$contract->at($contractAddress)->send('mint', $toAddress, [
'from' => $account,
'gas' => '0x200000', // 200000 gas
'gasPrice' => '0x9502f9000' // 40 gwei (示例值)
], function ($err, $result) use ($contract) {
if ($err !== null) {
echo "Error: " . $err->getMessage() . PHP_EOL;
return;
}
echo "Transaction hash: " . $result . PHP_EOL;
// 可以轮询交易收据,获取tokenId
});
重要安全提醒:
- 不要在代码中硬编码私钥,应使用环境变量(如
.env文件)或密钥管理服务。 - 使用测试网(如Sepolia、Goerli)进行开发和测试。
- 交易需要支付Gas费,确保账户有足够ETH。
处理NFT元数据(Metadata)
大多数NFT平台(如OpenSea)要求每个token有一个JSON元数据,包含图片、描述等,通常存储在IPFS上。
使用Pinata上传文件并获取URI
- 在PHP中通过cURL调用Pinata API上传图片和JSON。
- 将JSON的IPFS哈希(如
ipfs://Qm...)作为参数传递给mint函数(根据合约逻辑,可能需要将URI写入合约)。
示例:上传图片到IPFS
function uploadToIPFS($filePath, $apiKey, $secretKey) {
$url = "https://api.pinata.cloud/pinning/pinFileToIPFS";
$ch = curl_init();
$cFile = new CURLFile($filePath);
$postFields = array('file'=> $cFile);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"pinata_api_key: $apiKey",
"pinata_secret_api_key: $secretKey"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true)['IpfsHash'];
}
然后构建元数据JSON并上传:
$metadata = [
"name" => "My NFT #1",
"description" => "The first NFT created via PHP",
"image" => "ipfs://" . $imageHash
];
// 上传metadata到IPFS,得到metadataHash
将ipfs:// + metadataHash 作为参数调用合约的setTokenURI或直接在mint时传入(取决于合约设计)。
使用第三方NFT铸造服务(简化)
如果不想直接处理区块链交互,可以使用服务如:
- Thirdweb:提供PHP SDK(alpha阶段)或直接REST API。
- Alchemy NFT API:通过
mintNFT端点快速铸造。 - Moralis:提供NFT API,支持元数据自动管理。
以Alchemy为例,直接发送HTTP请求即可:
$alchemyUrl = "https://eth-sepolia.g.alchemy.com/nft/v2/YOUR_API_KEY/mintNFT";
$data = [
"to" => "0xRECEIVER",
"metadata" => [
"name" => "My NFT",
"description" => "Description",
"image" => "https://example.com/image.png"
]
];
// 发送POST请求(使用你的API密钥和合约地址)
这种方式更简单,但灵活性较低且通常需要付费。
总结与注意事项
- PHP无法直接写入区块链,它通过RPC或API与节点交互。
- 私钥安全是重中之重,永远不要在客户端暴露。
- 测试网先行:使用Sepolia、Goerli等免费测试网。
- 元数据永久性:推荐使用IPFS存储,避免中心化服务器失效。
- Gas费用:铸造NFT需要Gas,确保账户有足够余额。
- 合约标准:确保合约支持ERC-721或ERC-1155,并具有你需要的
mint函数。
通过以上步骤,你就可以在PHP后端中实现NFT的创建和铸造了,根据你的具体需求,可以选择直接链上交互(更底层)或使用第三方服务(更便捷)。