<style>
.textleft {
text-align:left;
}
.reveal, .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {
font-family:Arial, Microsoft JhengHei;}
.small-font {
font-size: 20px !important;
}
.reveal .progress {
height: 14px !important;
}
.progress span {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAMCAIAAAAs6UAAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUNCQzIyREQ0QjdEMTFFMzlEMDM4Qzc3MEY0NzdGMDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUNCQzIyREU0QjdEMTFFMzlEMDM4Qzc3MEY0NzdGMDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQ0JDMjJEQjRCN0QxMUUzOUQwMzhDNzcwRjQ3N0YwOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQ0JDMjJEQzRCN0QxMUUzOUQwMzhDNzcwRjQ3N0YwOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PovDFgYAAAAmSURBVHjaYvjPwMAAxjMZmBhA9H8INv4P4TPM/A+m04zBNECAAQBCWQv9SUQpVgAAAABJRU5ErkJggg==) repeat-x !important;
}
.progress span:after, .progress span.nyancat {
content: "";
background: url(data:image/gif;base64,R0lGODlhIgAVAKIHAL3/9/+Zmf8zmf/MmZmZmf+Z/wAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpDMkJBNjY5RTU1NEJFMzExOUM4QUM2MDAwNDQzRERBQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCREIzOEIzMzRCN0IxMUUzODhEQjgwOTYzMTgyNTE0QiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCREIzOEIzMjRCN0IxMUUzODhEQjgwOTYzMTgyNTE0QiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkM1QkE2NjlFNTU0QkUzMTE5QzhBQzYwMDA0NDNEREFDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkMyQkE2NjlFNTU0QkUzMTE5QzhBQzYwMDA0NDNEREFDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8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) ;
width: 36px !important;
height: 21px !important;
border: none !important;
float: right;
margin-top: -7px;
margin-right: -10px;
transform: scale(1.5,1.5);
}
.reveal section img {
height: 550px !important;
}
#explore .reveal section img {
max-height: 95%;
}
#rarible {
height: 150px !important;
height: 150px !important;
}
</style>
<!-- .slide: data-transition="slide" -->
# NFT 介紹(EVM)
@Kais(VagrantPi)
###### tags: `slide`, `簡報`
---
<!-- .slide: data-transition="slide" -->
## Agenda
- NFT 介紹
- 什麼是 ERC721 / ERC1177?
- 如何上架到 OpenSea 或其他 NFT 市場
- NFT 的鏈上互動(通過 explore)
- NFT metadata 存放地方:IPFS、普通 URL
- IPFS 運作原理
- 普通 URL
- Q&A
---
<!-- .slide: data-transition="convex" -->
## NFT 介紹
----
<!-- .slide: data-transition="convex" -->
NFT(Non-Fungible Token)
「非同質化」是指物品擁有
- 不可替代性
- 不可切割
- 唯一性
----
<!-- .slide: data-transition="convex" -->
Fungible 的意思為「可替代的」
所以同質化 (例如貨幣)
每一個代幣彼此之間皆為可替代的
> 所以你的 100u 跟我的 100u 即使交換後,你還是擁有相同不變的東西/物品
----
<!-- .slide: data-transition="convex" -->

> source: https://lootex.gitbook.io/docs/2.-pai-mai-chang-marketplace-jiao-xue-v2-outdated/newbie-manual/shen-me-shi-nft
----
<!-- .slide: data-transition="convex" -->

> source: https://lootex.gitbook.io/docs/2.-pai-mai-chang-marketplace-jiao-xue-v2-outdated/newbie-manual/shen-me-shi-nft
----
<!-- .slide: data-transition="convex" -->
### ERC721

----
<!-- .slide: data-transition="convex" -->
```solidity
// contracts/GameItem.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC721, Ownable {
uint256 private _nextTokenId;
constructor(address initialOwner)
ERC721("MyToken", "MTK")
Ownable(initialOwner)
{}
function _baseURI() internal pure override returns (string memory) {
return "https://arweave.net/q2KVZzSHxrVPNueS_xJRy5tnss-CWUOIc5-xMKpWNKE/";
}
function safeMint(address to) public onlyOwner {
uint256 tokenId = _nextTokenId++;
_safeMint(to, tokenId);
}
}
```
----
<!-- .slide: data-transition="convex" -->
#### Mint

----
<!-- .slide: data-transition="convex" -->
#### OwnerOf & tokenURI

----
<!-- .slide: data-transition="convex" -->
### ERC1155

----
<!-- .slide: data-transition="convex" -->
```solidity
// SPDX-License-Identifier: MIT
// Compatible with OpenZeppelin Contracts ^5.0.0
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract Marvel1155 is ERC1155, Ownable {
uint256 public constant CAPTAIN_AMERICA = 0;
uint256 public constant THOR = 1;
uint256 public constant IRON_MAN = 2;
uint256 public constant SPIDER_MAN = 3;
constructor(address initialOwner)
ERC1155("https://api.frank.hk/api/nft/demo/1155/marvel/{id}.json")
Ownable(initialOwner)
{
_mint(msg.sender, CAPTAIN_AMERICA, 10**18, "");
_mint(msg.sender, THOR, 1, "");
_mint(msg.sender, IRON_MAN, 5, "");
_mint(msg.sender, SPIDER_MAN, 10, "");
}
function setURI(string memory newuri) public onlyOwner {
_setURI(newuri);
}
function mint(address account, uint256 id, uint256 amount, bytes memory data)
public
onlyOwner
{
_mint(account, id, amount, data);
}
function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
public
onlyOwner
{
_mintBatch(to, ids, amounts, data);
}
}
```
source: https://www.frank.hk/blog/nft-erc1155
----
deploy
<!-- .slide: data-transition="convex" -->
https://testnets.opensea.io/collection/unidentified-contract-2c20b02b-7251-40ec-a091-f605
----
<!-- .slide: data-transition="convex" -->
#### Mint

----
<!-- .slide: data-transition="convex" -->
#### mintBatch

----
<!-- .slide: data-transition="convex" -->
#### balanceOf

----
<!-- .slide: data-transition="convex" -->

----
<!-- .slide: data-transition="convex" -->
#### uri

----
<!-- .slide: data-transition="convex" -->
#### uri - {id}

----
<!-- .slide: data-transition="convex" -->
https://www.quicknode.com/guides/ethereum-development/nfts/how-to-create-and-deploy-an-erc-1155-nft
```solidity
function uri(uint256 _tokenid) override public pure returns (string memory) {
return string(
abi.encodePacked(
"https://ipfs.io/ipfs/bafybeihjjkwdrxxjnuwevlqtqmh3iegcadc32sio4wmo7bv2gbf34qs34a/",
Strings.toString(_tokenid),".json"
)
);
}
```
----
<!-- .slide: data-transition="convex" -->
### 讓我們回到 ERC20

----
<!-- .slide: data-transition="convex" -->

---
<!-- .slide: data-transition="slide" -->
## 如何上架到 OpenSea 或其他 NFT 市場
----
<!-- .slide: data-transition="convex" -->

----
### metadata 需要符合定義才能正確被解析
<!-- .slide: data-transition="convex" -->
```json
{
"description": "Friendly OpenSea Creature that enjoys long swims in the ocean.",
"external_url": "https://openseacreatures.io/3",
"image": "https://storage.googleapis.com/opensea-prod.appspot.com/puffs/3.png",
"name": "Dave Starbelly",
"attributes": [ ... ]
}
```
----
<!-- .slide: data-transition="convex" -->

----
<!-- .slide: data-transition="convex" -->
```json
{
"attributes": [
{
"trait_type": "Base",
"value": "Starfish"
},
{
"trait_type": "Eyes",
"value": "Big"
},
{
"trait_type": "Mouth",
"value": "Surprised"
},
{
"trait_type": "Level",
"value": 5
},
{
"trait_type": "Stamina",
"value": 1.4
},
{
"trait_type": "Personality",
"value": "Sad"
},
{
"display_type": "boost_number",
"trait_type": "Aqua Power",
"value": 40
},
{
"display_type": "boost_percentage",
"trait_type": "Stamina Increase",
"value": 10
},
{
"display_type": "number",
"trait_type": "Generation",
"value": 2
}
]
}
```
----
<!-- .slide: data-transition="convex" -->
影片類型的話 opensea 也有定義解析

----
<!-- .slide: data-transition="convex" -->

> https://opensea.io/assets/ethereum/0xa37b6a494c215a44c61cc60f6e67b9fca8fa8e87/108
----
<!-- .slide: data-transition="convex" -->
```json
// 20240623144430
// https://vnrjkzzuq7dlktzw46jp6esrzonwpmwpqjmuhcdtt6ytbkswgsqq.arweave.net/q2KVZzSHxrVPNueS_xJRy5tnss-CWUOIc5-xMKpWNKE/1
{
"created_by": "Ilan Derech",
"name": "Whispers in the Snow | 雪のささやき #1/133",
"description": "Whispers in the snow, a gentle sound, \nAs silent snowflakes fall to the ground. \nKyoto's beauty, now soft and still, \nA tranquil scene, a winter's chill.\n\nIn peaceful moments, whispers heard, \nAs snowflakes dance without a word. \nThe hush of night, a winter's glow, \nIn Kyoto's land, a tranquil show.\n\nWhispers in the snow, a serene sight, \nA moment of calm, a winter's delight. \nIn Kyoto's land, a peaceful sound, \nAs snowflakes gently fall to the ground.\n\nBy: Ilan Derech \nTotal Editions: 133 \nCollaboration with: Premint \nLocation: Kyoto, Japan \nShot on: Leica Q2 \nYear: 2023",
"attributes": [
{
"trait_type": "Artist",
"value": "Ilan Derech"
}
],
"animation_details": {
"bytes": 53648281,
"format": "MP4",
"duration": 17,
"sha256": "cef502987fb7e7fa55e29d2e3f849bbea11165b1cdb0d8c37205a70d3025f01d",
"width": 2160,
"height": 3840,
"codecs": [
"H.264",
"AAC"
]
},
"animation": "https://arweave.net/IzyUdMZHdM90HEQmy3oIp13riQ8bmBaO-XNmbj5ve4w",
"animation_url": "https://arweave.net/IzyUdMZHdM90HEQmy3oIp13riQ8bmBaO-XNmbj5ve4w",
"image_details": {
"bytes": 21934044,
"format": "GIF",
"sha256": "ac8b855ceaaef1072c3db8d5d035ebd4ad877bfc99cb6f412e58316f1908f9ba",
"width": 420,
"height": 747
},
"image": "https://arweave.net/g5tdcGeNFyU7DksWqyOOJQqS6YuQOYNJjNmD67g9CZ0",
"image_url": "https://arweave.net/g5tdcGeNFyU7DksWqyOOJQqS6YuQOYNJjNmD67g9CZ0"
}
```
> https://arweave.net/q2KVZzSHxrVPNueS_xJRy5tnss-CWUOIc5-xMKpWNKE/108
----
<!-- .slide: data-transition="convex" -->
讓我們來看看另外一家
NFT Marketplace Rarible
<img src="https://hackmd.io/_uploads/BkZU-zM8R.png" id="rarible" alt="image" class="offline-handled error-handled" data-position="79" data-size="50" loading="lazy">
----
<!-- .slide: data-transition="convex" -->

> https://rarible.com/token/0x306b1ea3ecdf94ab739f1910bbda052ed4a9f949:6789
----
<!-- .slide: data-transition="convex" -->
```
// 20240621100832
// https://bafybeihb6g4ojj34w5erhpulaxliq6fszyh33e6wtefsqnunlqw4hgnkr4.ipfs.dweb.link/beanz_metadata/6789
{
"name": "Bean #6789",
"attributes": [
{
"trait_type": "Background",
"value": "Dark Blue"
},
{
"trait_type": "Type",
"value": "Edamame"
},
{
"trait_type": "Eyes",
"value": "Half-open"
},
{
"trait_type": "Mouth",
"value": "Closed"
},
{
"trait_type": "Clothing",
"value": "Kami"
},
{
"trait_type": "Headgear",
"value": "Beanie"
},
{
"trait_type": "Special",
"value": "Raijin Drums with Lightning"
}
],
"image": "ipfs://QmTRuWHr7bpqscUWFmhXndzf5AdQqkekhqwgbyJCqKMHrL/6789.png"
}
```
> https://bafybeihb6g4ojj34w5erhpulaxliq6fszyh33e6wtefsqnunlqw4hgnkr4.ipfs.dweb.link/beanz_metadata/6789
>
---
<!-- .slide: data-transition="slide" -->
## NFT 的鏈上互動(通過 explore)
----
<!-- .slide: data-transition="convex" -->
使用 metamask 的話,需要做 import 的動作

----
<!-- .slide: data-transition="convex" -->

----
<!-- .slide: data-transition="convex" -->

----
<!-- .slide: data-transition="convex" -->
此外也可以通過 etherscan 這類 explore 來與合約互動
----
<!-- .slide: data-transition="convex" -->
<img src="https://hackmd.io/_uploads/Hyh4ZT8U0.png" id="rarible" alt="image" class="offline-handled error-handled" data-position="79" data-size="50" loading="lazy">
----
<!-- .slide: data-transition="convex" -->
查看 owner

----
<!-- .slide: data-transition="convex" -->
查看 metadata

----
<!-- .slide: data-transition="convex" -->

----
<!-- .slide: data-transition="convex" -->

---
<!-- .slide: data-transition="slide" -->
## NFT metadata 存放地方:IPFS、普通 URL
----
<!-- .slide: data-transition="convex" -->
### IPFS - InterPlanetary File System
星際檔案系統

----
<!-- .slide: data-transition="convex" -->
特點:
- 去中心化
- p2p 網路儲存
- 可驗證性
- `aaaa.com/doge.jpg`
- `bbbb.com/doge.jpg`
----
<!-- .slide: data-transition="convex" -->
#### CID
上傳的東西檔案會給你一個唯一值
```
ipfs://QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco
```
----
<!-- .slide: data-transition="convex" -->
也有資料夾的概念
example/example_text.txt
```
ipfs://QmdbaSQbGU6Wo9i5LyWWVLuU8g6WrYpWh2K4Li4QuuE8Fr/example_text.txt
```
----
<!-- .slide: data-transition="convex" -->
通過 Gateway 可以快速找到資源
https://cloudflare-ipfs.com/ipfs/QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy
----
<!-- .slide: data-transition="convex" -->
### 普通 URL
只要能回傳 meta json 檔,任何可訪問資源都可以

https://api.pudgypenguins.io/lil/1
---
<!-- .slide: data-transition="convex" -->
## Q&A
{"title":"NFT 介紹(EVM)","description":"@Kais(VagrantPi)","contributors":"[{\"id\":\"69ade472-3ed3-499d-8a69-767243a31621\",\"add\":26451,\"del\":7011}]"}