---
# System prepended metadata

title: Truffle StudentControlId Demo NOTE
tags: [blockchain]

---

###### 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前端已完成 
後續看再補上公文的功能 合約提領功能加上行政的地址也可考慮



