3.1 KryptoCamp ERC721教學

更新 發佈閱讀 10 分鐘

以前常覺得程式可能很多沒有為什麼, 就先記起來就對了, Paul老師很仔細的幫每個名詞都解釋了上下邏輯的原因, 覺得很驚艷, 踏進火山登山口後, 找到了厚厚積灰下的路標指示牌惹, 真心感謝。

1. mapping(uint tokenId => address) private _owners;

表示這個tokenID, 擁有者是誰

2. mapping(address owner => uint256) private _balances;

這個人, 擁有多少個NFT

3. mapping(uint256 tokenId => address) private _tokenApprovals;

這個tokenID有沒有授權給哪個地址

4. mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;

假設擁有者有100個NFT, 要授權給另一個人50個, 要一個一個授權太浪費, 所以這行是指一次授權所有NFT, 預設就是false( 沒有授權)

5. function balanceOf(address owner) public view virtual returns (uint256) { if (owner == address(0) { revert ERC721InvalidOwner(address(0));} return _balances[owner];}

提供user的address, 反饋user有幾個NFT

6. function ownerOf(uint256 tokenId) public view virtual returns(address) { return _requireOwned(tokeId);}

提供tokenId, 反饋擁有者地址

7. function tokenURI(uint256 tokenId) public view virtual returns (string memory) _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0? string.cancat(baseURI, tokenId,toSTring()) : ""; }

每一個tokenId都對應到opensea上的某中圖片, 這個關係就是tokenURI所記錄的, 什麼網址對應到什麼圖片

8. function approve(address to, uint256)(tokenId) public virtual { approve(to, tokenId, _msgSender());}

授權給某個地址操作這個編號的NFT

9. function getApprove(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); }

取得這個tokenId有被授權給哪個地址操作, 查資料的function

10. function setApprovalForAll(address operator, bool approved) public virtual { setApprovalForAll(_msgSender(), operator, approved); }

授權給某個人(operator)地址所有的操作權

11. function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {return _operatorApprovals[owner][operator]; }

某一個NFT擁有者是否有授權給另一個address所有的NFT操作權

12. function transferFrom(address from, address to, uint256 tokenId) public virtual { if(to == address(0) { revert ERC721UnvlaidReceiver(address(0));}

某一個地址轉移給另一個地址某一個NFT

13. safeTransferfrom

會先幫你做一個檢查(transferfrom, 一轉就過去了), 用safeTransferfrom的話, 接收者如果是一個合約, 會先檢查是不是有某些功能沒執行, 確保NFT進去不會卡住

老師講義

狀態變數:

_name: 代幣名稱。

_symbol:代幣簡稱。

_owners:代幣id與擁有者關係。(uint256 => address)

_balances: 持幣紀錄。(address => uint256)

_tokenApprovals: 代幣單個id授權紀關係。(uint256 => address)

_operatorApprovals: 全部持有id授權關係。(address ==> ( address = >bool))

Funtion:


Get:

name() : 取得代幣名稱。

symbol() :取得代幣簡稱。

balanceOf(address owner):取得「某地址」持有NFT「數量」。

ownerOf(uint256 tokenId):取得「某代幣Id」的擁有者地址。

tokenURI(uint256 tokenId):取得NFT的圖片資訊。

getApproved(uint256 tokenId): 取得「某代幣Id」授權給哪個地址。

isApprovedForAll(address owner, address operator):取得「某地址(owner)」是否授權「所有的代幣Id」給「某地址{operator}」。

Write:

approve(address to, uint256 tokenId):授權持有的「某代幣Id」NFT給「某地址」。

setApprovalForAll(address operator, bool approved):設定「所有持有的代幣Id」都授權給「某地址」。

transferFrom(address from, address to, uint256 tokenId): 轉移NFT。

Internal:

_mint(address to, uint256 tokenId): 鑄造NFT。

_burn(uint256 tokenId):燒掉NFT。

Demo

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract ERC721Example is ERC721 {

// 定義最大供給量
uint256 public maxSupply;
uint256 public counter = 0; // 一開始NFT編號是0

modifier avaialbeMint(uint256 amount) {
// 要進function前, 會先做檢查
// 以以下為例, 就是檢查有沒有超過上限
//判斷這筆交易若完成,是否會超出最大供給量,如果會就回傳錯誤字串"over max supply."
require(amount + counter <= maxSupply, "over max supply.");
_;
}

//建構子初始化ERC721必要參數(name與symbol),並多加設定題目要求的maxSupply
constructor(
string memory _name,
string memory _symbol,
uint256 _maxSupply)
ERC721(_name, _symbol){
// 執行時填入10, 代表這個NFT是發10個
maxSupply = _maxSupply;
}

// 實作mint function,現在的數量, 跟要mint的數量, 有沒有超過最大供給量
function mint (uint256 amount) external avaialbeMint(amount){
// 迴圈值星批量鑄造NFT, 一顆一顆發
for(uint256 i=0; i < amount ; i++){
// 鑄造 NFT, counter為NFT的tokenId
_mint(msg.sender, counter);
counter ++ ;
}
}
// 讓transfer無效
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override {
revert();
}
}


Dapp Tutorial ERC721 帶你發行項目的 NFT 🔥

Build a ERC-721 Smart Contract

留言
avatar-img
Follow the Rainmaker 🌧️
5會員
91內容數
尋大神腳印, 亦步亦趨。
2024/06/12
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
2024/06/12
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
2024/05/29
Overview 1. Request Wallet Connection from Metamask get account function get account function 2. Set your smart contract address injected provide
2024/05/29
Overview 1. Request Wallet Connection from Metamask get account function get account function 2. Set your smart contract address injected provide
2024/05/28
在 Solidity 中,constant 變量用於定義不可變的常數值。這些常數在合約的生命週期內不會改變,並且它們的值必須在宣告時設定。使用 constant 關鍵字可以節省 gas,因為它們在編譯時就已經被嵌入到字節碼中,不需要在運行時讀取存儲。 用法 定義常數: 常數變量必須在宣告時初始
2024/05/28
在 Solidity 中,constant 變量用於定義不可變的常數值。這些常數在合約的生命週期內不會改變,並且它們的值必須在宣告時設定。使用 constant 關鍵字可以節省 gas,因為它們在編譯時就已經被嵌入到字節碼中,不需要在運行時讀取存儲。 用法 定義常數: 常數變量必須在宣告時初始
看更多
你可能也想看
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
對很多投資小白貓來說,除了常見的投資工具外,人生有可能會遇到一個重大的決策,是不是該買房?而在台灣有房有地私有財的觀點深入人心。 依主計總處家庭收支調查結果顯示,110年底自有住宅(註)之比率已達85.0%;註:「自有住宅」係指房屋所有權屬戶內經常居住成員所擁有;若包括直系親屬所
Thumbnail
對很多投資小白貓來說,除了常見的投資工具外,人生有可能會遇到一個重大的決策,是不是該買房?而在台灣有房有地私有財的觀點深入人心。 依主計總處家庭收支調查結果顯示,110年底自有住宅(註)之比率已達85.0%;註:「自有住宅」係指房屋所有權屬戶內經常居住成員所擁有;若包括直系親屬所
Thumbnail
不知道,大家有沒有發生過,明明檢查了好幾次文章,到最後,還是發現錯字或漏字的情形。自己就常常發生這樣的情形。 在這種情況下,想到的是將文本轉成語音。用聽的,應該會比較容易找出錯誤。於是便發現強大的Balabolka(直接連結官網),更讚的是它完全免費,不僅具多國語系,而且有免安裝版本。下載後便
Thumbnail
不知道,大家有沒有發生過,明明檢查了好幾次文章,到最後,還是發現錯字或漏字的情形。自己就常常發生這樣的情形。 在這種情況下,想到的是將文本轉成語音。用聽的,應該會比較容易找出錯誤。於是便發現強大的Balabolka(直接連結官網),更讚的是它完全免費,不僅具多國語系,而且有免安裝版本。下載後便
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
「所以你再說一遍你的名字?」 格羅德有點厭煩地擺擺手,將桌上四個銀駱駝一瓶的冬日流金又乾了一杯。年輕詩人的表情像在滴血,但他有着堅毅眼神,不過,格羅德很懷疑他的錢包還能撐多久。 「綠髮多拉岡。」 詩人的名字有夠名副其實。他的頭髮染成綠色,比春天的草原還要綠,天知道他把什麼衣服染料放
Thumbnail
「所以你再說一遍你的名字?」 格羅德有點厭煩地擺擺手,將桌上四個銀駱駝一瓶的冬日流金又乾了一杯。年輕詩人的表情像在滴血,但他有着堅毅眼神,不過,格羅德很懷疑他的錢包還能撐多久。 「綠髮多拉岡。」 詩人的名字有夠名副其實。他的頭髮染成綠色,比春天的草原還要綠,天知道他把什麼衣服染料放
Thumbnail
夜盤法人開始慢慢佈局空單, 雖然小那、日經。都還在努力往前高衝刺 若在起點做多(如小那月線) 那是沒問題,是甜的。 但一定要注意衝上去突破或是高點附近的時候 不追高、居高思危。 包括比特幣也是衝過歷史高點。 市場越來越瘋狂了,每天都拉回多的日子 我是比較保守的打(有本金當然可以操爆.
Thumbnail
夜盤法人開始慢慢佈局空單, 雖然小那、日經。都還在努力往前高衝刺 若在起點做多(如小那月線) 那是沒問題,是甜的。 但一定要注意衝上去突破或是高點附近的時候 不追高、居高思危。 包括比特幣也是衝過歷史高點。 市場越來越瘋狂了,每天都拉回多的日子 我是比較保守的打(有本金當然可以操爆.
Thumbnail
前天3月1號早上剛下班沒多久,開著車到麥當勞得來速買早餐 正準備吃早餐的時候,看到手機APP跳出卜蜂漲之類的字眼 想說卜蜂今天有漲喔?,打開看盤APP看到這個畫面 身為懶人系不看盤長期投資人,第一次看到這個紅底反白的字 第一時間也還搞不清楚發生了什麼事,當下馬上去看我的未損益實現 看到帳面上未實現損
Thumbnail
前天3月1號早上剛下班沒多久,開著車到麥當勞得來速買早餐 正準備吃早餐的時候,看到手機APP跳出卜蜂漲之類的字眼 想說卜蜂今天有漲喔?,打開看盤APP看到這個畫面 身為懶人系不看盤長期投資人,第一次看到這個紅底反白的字 第一時間也還搞不清楚發生了什麼事,當下馬上去看我的未損益實現 看到帳面上未實現損
Thumbnail
3-1 八卦全圖(野鶴全書析解) 〈八卦全圖〉 初學不會裝卦,須將占得之卦,照圖裝排世應五行。   一、 乾宮八卦: 二、坎宮八卦: 八卦全圖(pdf檔) https://ssur.cc/FmpC3bN 3-1八卦全圖(野鶴全書析解)影片 https://youtu.be/
Thumbnail
3-1 八卦全圖(野鶴全書析解) 〈八卦全圖〉 初學不會裝卦,須將占得之卦,照圖裝排世應五行。   一、 乾宮八卦: 二、坎宮八卦: 八卦全圖(pdf檔) https://ssur.cc/FmpC3bN 3-1八卦全圖(野鶴全書析解)影片 https://youtu.be/
Thumbnail
在講完語音、詞彙之後,真正要和人溝通,是需要一些完整的句子的,而瞭解句子的法則為什麼這麼重要呢?
Thumbnail
在講完語音、詞彙之後,真正要和人溝通,是需要一些完整的句子的,而瞭解句子的法則為什麼這麼重要呢?
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
今天休假,主要是為了準備明天的碩專班面試,另外趁空檔上刑訴課。一早送完小孩上學,請老公載我到忠孝復興某咖啡店,然後就一路待到傍晚。
Thumbnail
今天休假,主要是為了準備明天的碩專班面試,另外趁空檔上刑訴課。一早送完小孩上學,請老公載我到忠孝復興某咖啡店,然後就一路待到傍晚。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News