###### tags: `blockchain` # Truffle StudentControlId Demo NOTE # 0818 deployer.deploy(StudentControlId, { overwrite: false }) 會不能重新寫入合約 測試時請刪除; truffle comsole let s = await StudentControlId.deployed() 輸入 s看合約相關資訊 搜尋 method有可使用的函式 EXAMPLE : let st = s.safeTransferFrom() # 0819 to 發送到的地址 id 識別用 跟設定的uri結合 (uri可儲存用戶資料 https://docs.openzeppelin.com/contracts/3.x/erc1155, https://forum.openzeppelin.com/t/create-an-erc1155/4433) amount 發出的數量 數量1代表是NFT 超過1代表是代幣 data 並無作用 可以當作傳輸時想發出的訊息 但看討論實際上沒人使用 function _mint( address to, uint256 id, uint256 amount, bytes memory data ) uint256 public constant FIRM = 2; uint256 public constant COIN = 3; _mint(msg.sender, FIRM, 1, ""); _mint(msg.sender, COIN, 10, ""); --- virtual的function 代表繼承時可以使用override覆蓋改寫 Simple Example (From Solidity Docs) ```solidity pragma solidity >=0.5.0 <0.7.0; contract Base { function foo() virtual public {} } contract Middle is Base {} contract Inherited is Middle { function foo() public override {} } ``` Multiple Inheritance Example (From Solidity Docs) ```solidity pragma solidity >=0.5.0 <0.7.0; contract Base1 { function foo() virtual public {} } contract Base2 { function foo() virtual public {} } contract Inherited is Base1, Base2 { // Derives from multiple bases defining foo(), so we must explicitly // override it function foo() public override(Base1, Base2) {} } ``` https://ethereum.stackexchange.com/questions/78572/what-are-the-virtual-and-override-keywords-in-solidity --- goal:利用基數偶數或是特定數字的區間 去區別NFT權限的差別 也可以研究ERC1155PresetMinterPauser中的minter pauser admin權限控制 看看能不能借鏡 https://docs.openzeppelin.com/contracts/3.x/erc1155 底部的preset contract Preset ERC1155 contract A preset ERC1155 is available, ERC1155PresetMinterPauser. It is preset to allow for token minting (create) - including batch minting, stop all token transfers (pause) and allow holders to burn (destroy) their tokens. The contract uses Access Control to control access to the minting and pausing functionality. The account that deploys the contract will be granted the minter and pauser roles, as well as the default admin role. This contract is ready to deploy without having to write any Solidity code. It can be used as-is for quick prototyping and testing, but is also suitable for production environments. # 0824 設定ID來當作權限使用 0 COIN 1~10W STUDENT 10W~20W ADMINISTRATION 20~30W FIRM mintNFT()透過type來區別 AddressID紀錄該地址擁有何種權限 createCoin()會看發起交易者在AddressID中是否擁有行政人員權限 接收者是否是學生 功能 產生代幣給予學生 # 0825 tansferToken() 學生與廠商交易 firmWithdrawToken() 廠商提取代幣 完善合約並撰寫測試 確認完成還有前後端撰寫 # 0828 如要改變測試合約部屬者從 migrate改 deployer.deploy(StudentControlId, { from: accounts[1] }) 不特別標示from 就是默認accounts[0] test中發出的function也是 新增coin產出的測試 目前各帳號只能有一種身分 require(AddressID[to]==0,"have another act") 來辨別 0是uint256的默認值 代表尚未被賦值過才能mintNFT 已有身分的都不行ex:1 2 3 # 0829 完成簡略的DEMO 三種身分 1. STUDENT 2. ADMINISTRATION 3. FIRM 透過三個function控制代幣流向 ADMINISTRATION發起 createCoin() 產生代幣給學生 STUDENT發起 tansferTokenToFirm() 學生向廠商購買物品 FIRM發起 firmWithdrawToken() 廠商提取代幣 提取成功會燒掉代幣 每種操作所需的身份權限都是唯一 從發起人到接受者都是 形成一個閉鎖圓環 降低問題的發生 減少發生問題需要搜索其他的可能性 可以畫看看三個圓圈的流程圖 ![](https://i.imgur.com/8P5F0fj.png) # 0901 關於本人要驗證身分 做一些個人性的操作 類似登入個人資訊的概念 可以使用簽名的方式 只有錢包持有者能互動 web3.eth.account.sign() ![](https://i.imgur.com/l2tVc95.png) 也可以只取得帳號地址 ether.js的eth_requestAccounts https://ithelp.ithome.com.tw/articles/10262029 # 0903 透過0901登入能看到個人的資料 所以需要ipfs或其他儲存方式 去掛在nft的url web3.provider 是提供與錢包(metamask、trustwallet)溝通的介面 該服務連接著最新與歷史的區塊鏈資料 自用ganach的話 是提供自己電腦上運行ganache的port EX: var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545')) https://ithelp.ithome.com.tw/articles/10262029 # 0904 IPFS儲存方式 https://yulinchou.medium.com/2021-%E5%BB%BA%E7%AB%8B-erc721-%E6%A8%99%E6%BA%96%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84-%E4%B8%A6%E6%89%93%E9%80%A0%E8%87%AA%E5%B7%B1%E7%9A%84-nft-99afaca68530 新增了geturi函式 雞肋功能 了解erc1155 uri怎麼運作和修改 最後沒修 因為感覺沒啥意義 透過uri 直接拿到網址就好 因為要拿到資料基本上還是要從前後端起手 先用ipfs做幾個demo # 0905 ABI是solidity交換數據的方式 跟API類似 solidity會將整個code 編譯成ABI(binary code)再讓EVM執行 具體有輸入 名稱 輸出等等 ˋˋˋ js { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" } ˋˋˋ 而abi.encode是方法之一 較常出在要輸出 不同的數據結合而成的資料 return string(abi.encodePacked("https://",Strings.toString(token),".json")); 假設出現不同類型的資料(string,uint,int) 需要解碼的緣故 要用對應的abi.decode(string,uint,int) 才能正確解碼 # 0906 IPFS需要註冊才能用固定網址ipns 目前直接從IPFS資料夾->右鍵->檢查->當地網址 找出的local固定網址 可以直接用 固定網址/檔名 找出檔案 EX: basicurl/1.json 在使用erc1155的固定url上 basicurl/{id}.json還堪用 主要問題 確認一下每一個NFT的產生 會不會自帶ID 還是都是從主合約裡面確認 看一下大專案合約mint怎麼寫的 也可以看opensea是怎麼去確認NFT存在 # 0907 紅豆也是直接用一個mapping變數儲存地址 mapping(id,address) ownershipOf函式去確認 opensea是怎麼去確認NFT存在 https://cyberscrilla.com/how-nfts-are-tracked-and-verified/ 提到的etherscan 也能直接獲取該帳號有哪些token 應該是直接掛在區塊鏈的地址上面 https://docs.opensea.io/reference/retrieving-a-single-asset OS API可以獲取全部的token # 0908 etherscan是怎麼透過地址尋找擁有哪些token的? 實際原理是 將與特定 address 有關的所有 ERC20 event log 找出 (只有contract才能產生event log 所以都是代幣合約互動) 如果有需要強化控制的效果 safeTransferFrom可以改成internal 外部就不能呼叫 或是override出想要的功能 blockchain or address how to save eth balance 其實不像程式是用一個變數去紀錄 區塊鏈上以太坊存在所有礦工交易紀錄的帳本 再另外透過一個world state(世界狀態)的樹結構儲存 但不是儲存在區塊鏈上 ETH有中心化的資料庫管理 額外開的筆記 https://hackmd.io/IkEfe1uJTkKlvOpPSYdKYg https://zhuanlan.zhihu.com/p/203347169 https://ethereum.stackexchange.com/questions/15042/how-are-ether-balances-stored-on-the-ethereum-blockchain 新增event 需看到產生的事件 要重新 truffle compile mirgate --reset 在truffle console測試 才會產生事件 --- # 0915 軟體介紹 truffle ganache etherjs 可以改成一個一頁 不用這麼簡潔 寫歷史也可以(完成) 區塊鏈(應該不用 之前有) 智能合約 考慮單獨在介紹一篇 可以用上筆記中ETH如何儲存資料的那張圖 介紹合約撰寫後存在何處 不能更換 如何調用 EVM等等 畢竟寫大一點 之後要用也能找出來 錢包 地址可以稍微提出來 有問在補充 (完成) ERC1155 NFT可以著重一到二篇 介紹與erc721 720的不同 (完成) --- # 0916 發送公文的功能可以用mint NFT的方式演示 只是要多寫測試 程式碼也可以多加一個 official document 程式運作 先用一個流程圖 從錢包地址部屬開始 一路到創建NFT NFT幢建TOKEN TOKEN轉移 也可以用截圖程式碼介紹 可以說使用者資料是用IFPS提供 要把函式發生的**事件** 節圖出來 順便把**交易的紀錄 時間 地址 區塊**等等都截圖介紹一遍 重點畢竟在詳細的程式 之後再補充用前端視覺的方式描述使用者如何互動 # 0922 ethers前端 目標 : 前端網站 公文NFT函式 只有行政人員能發送 前端演示流程 : 1.先登入錢包地址 確認人員帳號 學生行政 廠商 訪客 2.確認後會跳出所屬的NFT 3.學生 : 購買介面(書) 購買紀錄 4.行政 : 發送公文 發送代幣給學生 5.廠商 : 提取代幣 商品數量 # 0923 ethers前端 1.先測試metamask部屬 以及本地測試 2.在做前端演示和公文功能 達成 : 已串聯測試ganach區塊鏈其帳號 合約資訊 函式測試checktype balance const url = "http://localhost:7545"; const provider = new ethers.providers.JsonRpcProvider(url); 關於block的function可以透過JsonRpcProvider去API找 目標 : https://www.youtube.com/watch?v=LsSbSGP4JJ8 1.登入頁 用metamask登入 測試三種帳號 (學生、行政、廠商、訪客) 登入後右上角顯示帳號地址和NFT類別 2.導入到分別的三種頁面 訪客暫時不得入內 ganacge的jsonprc provider.send能使用 https://github.com/trufflesuite/ganache/blob/develop/src/chains/ethereum/ethereum/RPC-METHODS.md # 0924 ethers前端 登入頁完成 登入成功後 能顯示錢包地址、NFT身分 剩餘顆數(達成) 登入頁能留著 底下用三個components去分類顯示哪個 功能用一個框框直接顯示就好 不用再特別刻東西 包括買東西 紀錄等等 每一頁都要有一個是該人所屬的NFT和資料 用uri拿 這要先 合約暫時不用重新編譯上鏈 前端能做測試就好 # 0925 ethers前端 頁面框架大致完成 學生頁面 NFT能顯示 其餘的要補上 部前正在處理紀錄 關於事件是如何解碼 可以透過LOG看 最後一筆交易的兩個操作介紹 可能需要decode topics未知 或找ganache怎麼取得事件的 也有人說能直接contract allevent # 0926 ethers前端 關於事件以解決 topics是事件名稱 需要解碼 data則是其資料 需要倚靠ABI解碼 後來直接用ethers.filter找事件名稱解決 https://hackmd.io/nv4_xWitSBmcX17bWOymtA ethers前端已完成 後續看再補上公文的功能 合約提領功能加上行政的地址也可考慮