本文目录导读:

我来详细介绍一下Python进行NFT开发的方法和流程。
开发环境准备
安装必要的库
# Web3交互库 pip install web3 # 智能合约开发 pip install brownie # IPFS存储 pip install ipfshttpclient # 加密和编码 pip install eth-account cryptography # HTTP请求 pip install requests
核心开发流程
1 连接区块链(以太坊为例)
from web3 import Web3
# 连接以太坊节点
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR-PROJECT-ID'))
# 测试网连接
# w3 = Web3(Web3.HTTPProvider('https://sepolia.infura.io/v3/YOUR-PROJECT-ID'))
# 检查连接状态
print(f"连接状态: {w3.is_connected()}")
2 创建NFT合约(使用Solidity)
// contracts/MyNFT.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyNFT is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("MyNFT", "MNFT") {}
function mintNFT(address recipient, string memory tokenURI)
public
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
3 部署智能合约
from brownie import MyNFT, accounts
def deploy_contract():
# 使用测试账户
account = accounts[0]
# 部署合约
nft_contract = MyNFT.deploy({'from': account})
print(f"合约部署地址: {nft_contract.address}")
return nft_contract
4 铸造NFT
def mint_nft(contract, recipient_address, token_uri):
# 铸造NFT
tx = contract.mintNFT(recipient_address, token_uri)
tx.wait(1) # 等待交易确认
# 获取铸造的token ID
token_id = contract.totalSupply()
print(f"NFT铸造完成,Token ID: {token_id}")
return token_id
5 上传元数据到IPFS
import ipfshttpclient
import json
def upload_to_ipfs(metadata):
# 连接IPFS节点
client = ipfshttpclient.connect('/ip4/127.0.0.1/tcp/5001')
# 上传元数据
res = client.add_json(metadata)
ipfs_hash = res['Hash']
# 生成URI
token_uri = f"ipfs://{ipfs_hash}"
return token_uri
# 创建NFT元数据
def create_metadata(name, description, image_url, attributes=None):
metadata = {
"name": name,
"description": description,
"image": image_url,
"attributes": attributes or []
}
return metadata
完整示例:铸造NFT
import os
from web3 import Web3
import json
class NFTMinter:
def __init__(self, provider_url, private_key, contract_address=None):
self.w3 = Web3(Web3.HTTPProvider(provider_url))
self.account = self.w3.eth.account.from_key(private_key)
# 合约ABI(从编译后的文件中获取)
self.contract_abi = [
# 这里放入ERC721合约的ABI
]
if contract_address:
self.contract = self.w3.eth.contract(
address=contract_address,
abi=self.contract_abi
)
def mint_nft(self, recipient_address, token_uri):
# 构建交易
tx = self.contract.functions.mintNFT(
recipient_address,
token_uri
).build_transaction({
'from': self.account.address,
'nonce': self.w3.eth.get_transaction_count(self.account.address),
'gas': 2000000,
'gasPrice': self.w3.eth.gas_price
})
# 签名交易
signed_tx = self.account.sign_transaction(tx)
# 发送交易
tx_hash = self.w3.eth.send_raw_transaction(signed_tx.rawTransaction)
# 等待交易确认
receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash)
return receipt
# 使用示例
if __name__ == "__main__":
# 配置信息
INFURA_URL = "https://sepolia.infura.io/v3/YOUR-PROJECT-ID"
PRIVATE_KEY = "your-private-key-here"
# 初始化Minter
minter = NFTMinter(INFURA_URL, PRIVATE_KEY)
# 铸造NFT
token_uri = "https://example.com/nft-metadata.json"
receipt = minter.mint_nft(
"0xRecipientAddress",
token_uri
)
print(f"交易哈希: {receipt.transactionHash.hex()}")
查询NFT信息
def get_nft_info(contract, token_id):
# 获取NFT拥有者
owner = contract.functions.ownerOf(token_id).call()
# 获取Token URI
token_uri = contract.functions.tokenURI(token_id).call()
# 获取元数据(从IPFS或HTTP)
import requests
response = requests.get(token_uri.replace("ipfs://", "https://ipfs.io/ipfs/"))
metadata = response.json()
return {
"token_id": token_id,
"owner": owner,
"token_uri": token_uri,
"metadata": metadata
}
实用工具函数
import os
from eth_account import Account
# 创建新的以太坊账户
def create_account():
account = Account.create()
print(f"地址: {account.address}")
print(f"私钥: {account.key.hex()}")
return account
# 批量铸造NFT
def batch_mint(contract, recipients, uris):
for i, (recipient, uri) in enumerate(zip(recipients, uris)):
print(f"铸造第 {i+1} 个NFT...")
receipt = contract.functions.mintNFT(recipient, uri).transact()
print(f"交易哈希: {receipt.hex()}")
重要注意事项
- Gas费用:确保账户有足够的ETH支付gas费
- 测试网测试:先在测试网(Sepolia/Goerli)测试
- 私钥安全:永远不要硬编码私钥,使用环境变量
- IPFS节点:可以使用Infura的IPFS服务或Pinata
- 标准遵循:确保遵循ERC-721或ERC-1155标准
高级功能
- NFT市场开发:实现买卖、拍卖功能
- 懒加载铸造(Lazy Minting)
- NFT碎片化
- 链上元数据
- 动态NFT
需要更具体的某部分代码或遇到问题,欢迎继续询问!