- 上一篇:【p2p、分布式,区块链笔记 Blockchain】truffle001 以太坊开发框架truffle初步实践
项目结构
合约:RentablePets.sol
mint
函数:允许用户创建新的 NFT,并为其设置唯一的 token ID 和元数据 URI。
mint - 百度翻译
英[mɪnt] 美[mɪnt]
n. 薄荷;造币厂;薄荷糖;铸币厂;大量的钱;
vt. 铸(币);铸造(硬币);
adj. 完美的;新造的;
burn
函数:允许用户销毁指定 ID 的 NFT,删除该 NFT 及其相关数据。
solidity
pragma solidity >=0.4.22 <0.9.0;
import "./ERC4907.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract RentablePets is ERC4907 {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC4907("RentablePets", "RP") {
}
function mint(string memory _tokenURI) public {
_tokenIds.increment();
uint256 newTokenId = _tokenIds.current();
_safeMint(msg.sender, newTokenId);
_setTokenURI(newTokenId, _tokenURI);
}
function burn(uint256 tokenId) public {
_burn(tokenId);
}
}
- ERC4907 和 Counters 导入:引入了自定义的 ERC4907 标准(可租赁的 NFT 标准)和 OpenZeppelin 的计数器工具,用于自动生成唯一的 token ID。
- 合约定义:合约
RentablePets
继承了 ERC4907 的所有功能(包括 ERC721 标准和租赁扩展)。
- 构造函数:初始化合约时,设定 NFT 名称为 “RentablePets”,符号为 “RP”。
solc: {
version: ">=0.4.22 <0.9.0"
}
{
"dependencies": {
"@openzeppelin/contracts": "^4.8.0",
"@truffle/hdwallet-provider": "^1.7.0"
},
"devDependencies": {
"@openzeppelin/test-helpers": "^0.5.15"
}
}
迁移部署:migrations/1_deploy_contracts.js
migrations
英[/maɪˈgreɪʃənz/] 美[/maɪˈgreɪʃənz/]
n.(程序或硬件的)迁移,转移;迁移;迁徙;移居;(计算机系统的)改变
migration的复数
const RentablePets = artifacts.require("RentablePets");
module.exports = function (deployer) {
deployer.deploy(RentablePets);
};
运行脚本:scripts/mint.js
var RentablePets = artifacts.require("RentablePets");
const main = async (cb) => {
try {
const argv = require('yargs/yargs')(process.argv.slice(4))
.default("from", (await web3.eth.getAccounts())[0])
.argv;
const rentablePets = await RentablePets.deployed()
let txn = await rentablePets.mint("fakeURI", {
from: argv.from})
console.log(txn);
} catch(err) {
console.log(err);
}
cb();
}
module.exports = main;
➜ workspace git:(main) ✗ truffle compile --all
Compiling your contracts...
===========================
✓ Fetching solc version list from solc-bin. Attempt #1
✓ Downloading compiler. Attempt #1.
> Compiling ./contracts/ERC4907.sol
> Compiling ./contracts/IERC4907.sol
> Compiling ./contracts/RentablePets.sol
> Compiling @openzeppelin/contracts/token/ERC721/ERC721.sol
> Compiling @openzeppelin/contracts/token/ERC721/IERC721.sol
> Compiling @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
> Compiling @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol
> Compiling @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
> Compiling @openzeppelin/contracts/utils/Address.sol
> Compiling @openzeppelin/contracts/utils/Context.sol
> Compiling @openzeppelin/contracts/utils/Counters.sol
> Compiling @openzeppelin/contracts/utils/Strings.sol
> Compiling @openzeppelin/contracts/utils/introspection/ERC165.sol
> Compiling @openzeppelin/contracts/utils/introspection/IERC165.sol
> Compiling @openzeppelin/contracts/utils/math/Math.sol
> Artifacts written to /project/workspace/build/contracts
> Compiled successfully using:
- solc: 0.8.15+commit.e14f2714.Emscripten.clang
➜ workspace git:(main) ✗ truffle migrate
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Starting migrations...
======================
> Network name: 'development'
> Network id: 1729358815666
> Block gas limit: 6721975 (0x6691b7)
1_deploy_contracts.js
=====================
Deploying 'RentablePets'
------------------------
> transaction hash: 0xe175c15f56056f7234713dd721c5761d5e5316f8598db9ac030d067b0bd61d2c
> Blocks: 0 Seconds: 0
> contract address: 0x4cd45fa514493686dC9ebd9B82F2b484C4A04791
> block number: 1
> block timestamp: 1729359105
> account: 0xE80E1ab42c8daD385cff236eA11495C719529617
> balance: 99.93983968
> gas used: 3008016 (0x2de610)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.06016032 ETH
> Saving artifacts
-------------------------------------
> Total cost: 0.06016032 ETH
Summary
=======
> Total deployments: 1
> Final cost: 0.06016032 ETH
交互
➜ workspace git:(main) ✗ truffle console
truffle(development)> const Web3 = require('web3');
undefined
truffle(development)> const web3 = new Web3('http://127.0.0.1:8545');
undefined
truffle(development)> const v = web3.eth.getAccounts();
undefined
truffle(development)> console.log(v)
Promise {
[
'0xE80E1ab42c8daD385cff236eA11495C719529617',
'0x5370ab73FCe6E6379065b1bcc28ca2AADf25CcC3',
'0x5e70aa3FF93611F24779eA6d061af288d9E76d29',
'0x78492007d7Fd3c2E367C940c69fB74314ddDa736',
'0x25106c3591c2e3bB48A0D68e3d1252bb4Aa90CDE',
'0x79B45863062ae0216143369De21442F92A1176b7',
'0x4A31abd39EC9ce5F1471ffA6e48a9c65B70D6Da7',
'0xf041c963841d797065dB5AeF0D6D146D7E3f2Fb0',
'0x420D956ad2407533A0cD140d53B826E8D4B1BB95',
'0x87AcFD4c4E02bD337978AB089dF24F83eceB5f4d'
],
[Symbol(async_id_symbol)]: 448,
[Symbol(trigger_async_id_symbol)]: 8
}
undefined
truffle(development)> const rentablePets = await RentablePets.deployed()
undefined
truffle(development)> let txn = await rentablePets.mint("fakeURI", {
from: '0xE80E1ab42c8daD385cff236eA11495C719529617'})
undefined
truffle(development)> console.log(txn);
{
tx: '0x719254cfa3be55c078e2800a820a04d338862c69a627df16e4d63df4871613b4',
receipt: {
transactionHash: '0x719254cfa3be55c078e2800a820a04d338862c69a627df16e4d63df4871613b4',
transactionIndex: 0,
blockHash: '0xa91f80b69644dd3bb8b7d96783230a9163ebfa851cd1ca8ce67434f9811c1147',
blockNumber: 2,
from: '0xe80e1ab42c8dad385cff236ea11495c719529617',
to: '0x4cd45fa514493686dc9ebd9b82f2b484c4a04791',
gasUsed: 114934,
cumulativeGasUsed: 114934,
contractAddress: null,
logs: [ [Object] ],
status: true,
logsBloom: '0x00000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000008000000000000000000040000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000400000000000001000000000000000000000000000004000000000000000000000000000080000000000000000000000000000000000002000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000',
rawLogs: [ [Object] ]
},
logs: [
{
logIndex: 0,
transactionIndex: 0,
transactionHash: '0x719254cfa3be55c078e2800a820a04d338862c69a627df16e4d63df4871613b4',
blockHash: '0xa91f80b69644dd3bb8b7d96783230a9163ebfa851cd1ca8ce67434f9811c1147',
blockNumber: 2,
address: '0x4cd45fa514493686dC9ebd9B82F2b484C4A04791',
type: 'mined',
removed: false,
id: 'log_4e200077',
event: 'Transfer',
args: [Result]
}
]
}
undefined
truffle(development)>
Ganache输出
workspace git:(main) ✗ ganache-cli
Ganache CLI v6.12.2 (ganache-core: 2.13.2)
Available Accounts
==================
(0) 0xE80E1ab42c8daD385cff236eA11495C719529617 (100 ETH)
(1) 0x5370ab73FCe6E6379065b1bcc28ca2AADf25CcC3 (100 ETH)
(2) 0x5e70aa3FF93611F24779eA6d061af288d9E76d29 (100 ETH)
(3) 0x78492007d7Fd3c2E367C940c69fB74314ddDa736 (100 ETH)
(4) 0x25106c3591c2e3bB48A0D68e3d1252bb4Aa90CDE (100 ETH)
(5) 0x79B45863062ae0216143369De21442F92A1176b7 (100 ETH)
(6) 0x4A31abd39EC9ce5F1471ffA6e48a9c65B70D6Da7 (100 ETH)
(7) 0xf041c963841d797065dB5AeF0D6D146D7E3f2Fb0 (100 ETH)
(8) 0x420D956ad2407533A0cD140d53B826E8D4B1BB95 (100 ETH)
(9) 0x87AcFD4c4E02bD337978AB089dF24F83eceB5f4d (100 ETH)
Private Keys
==================
(0) 0xe398d80025ef59f3d1bc31bd55eac87ed2ba30e267a2b1de2f7a2d9bbe1ef573
(1) 0xefff1fb2953c1808bbc184a502139efc462f6edcd379a98135f3a01999ec721d
(2) 0xee46e7e7b3f38de97dfdd4b01f6c17866787a9c9b1372c452c04813a2755c1c5
(3) 0xb1ff4eacd6a96aadb020cac360eed51fb29acf7ed3d097dd307f4a6b5f655f2d
(4) 0x13a1679fb9420333f814506d384c7bef6a6c923353f389016c5944e5da068998
(5) 0xfa5f628ac0835d57b433c8278d1fe0d3f7c7f8fbaea74711f8b4decd671f09ec
(6) 0xd3acdd34343ab8c455fbe3734449dc50fedeb7973de090766a99e0836fa46b1c
(7) 0x5d20c3b08b8c51a50022d4ec5eb84531b06c71ec805de6aebf1b0b7c42c02154
(8) 0x9b9920b4b9d3d07dd0069438dc040b95d42ec29e38bee10d63095aff356eb018
(9) 0xcfa72ab66dbc451b803828eda8c6a2ce86925af8f98f8b0c97b6964e6885daf7
HD Wallet
==================
Mnemonic: shop rule advance release dumb unveil pretty where search attract name exclude
Base HD Path: m/44'/60'/0'/0/{
account_index}
Gas Price
==================
20000000000
Gas Limit
==================
6721975
Call Gas Limit
==================
9007199254740991
Listening on 127.0.0.1:8545
eth_blockNumber
net_version
eth_accounts
eth_getBlockByNumber
eth_accounts
net_version
eth_getBlockByNumber
eth_getBlockByNumber
net_version
eth_getBlockByNumber
eth_estimateGas
net_version
eth_blockNumber
eth_getBlockByNumber
eth_estimateGas
eth_getBlockByNumber
eth_gasPrice
eth_sendTransaction
Transaction: 0xe175c15f56056f7234713dd721c5761d5e5316f8598db9ac030d067b0bd61d2c
Contract created: 0x4cd45fa514493686dc9ebd9b82f2b484c4a04791
Gas usage: 3008016
Block Number: 1
Block Time: Sat Oct 19 2024 17:31:45 GMT+0000 (Coordinated Universal Time)
eth_getTransactionReceipt
eth_getCode
eth_getTransactionByHash
eth_getBlockByNumber
eth_getBalance
eth_blockNumber
net_version
eth_accounts
eth_accounts
eth_blockNumber
net_version
eth_accounts
eth_accounts
eth_accounts
eth_getBlockByNumber
eth_getBlockByNumber
eth_estimateGas
eth_getBlockByNumber
eth_gasPrice
eth_sendTransaction
Transaction: 0x719254cfa3be55c078e2800a820a04d338862c69a627df16e4d63df4871613b4
Gas usage: 114934
Block Number: 2
Block Time: Sat Oct 19 2024 17:40:55 GMT+0000 (Coordinated Universal Time)
eth_getTransactionReceipt
eth_getBlockByNumber
eth_getBlockByNumber
eth_getBlockByNumber
eth_getBlockByNumber
eth_getBlockByNumber
eth_getBlockByNumber