iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
Web 3

Web3 X 公共財系列 第 9

Day 09 - 前10天Solidity 學習紀錄

  • 分享至 

  • xImage
  •  

Day 1,2

  • What I read
    • Hydai
      • Day2 : 區塊練特性 行為受限: 產生隨機數 + 資料儲存(成本)
        • 如何產生 有特定產生模式 + 異地完全一致 + 不能被預測
      • Day3 合約結構
      • Day5 value type
        • static
        • no undefined / null
        • value , reference , mapping
        • value
          • boolean 預設false
          • Integer int= int256, uint= uint256, intN M[8,256], uintN
        • address 20Bytes +payable
        • Enums 列舉 預設第一個元素 常用來model choice or track of state
          • enum EnumName {elements1, 2}
          • EnumName X = EnumName.element1
          • Struct 用於表示一個複雜變數
          • Enum 表示一個單一變數的不同狀態或值
      • Day6 ref type
        • 資料存放的位置 memory, storage, calldata(read-only,儲存函數參數)
        • 執行結束 / 合約銷毀 超級貴! +local storage /
        • 位置移動代價!
          • memory/storage bytes var.length
          • string 字串是參考! 巨大限制
          • Type[length] memory|storage N
          • Type[] +push(x) , +pop()
          • Struct K{ }
      • Day 7 Function 合約互動
        • function FnName [V] [SM] [returns (...)] {}
        • Visibility: public, private, external, interal
        • State Mutability: pure 不讀取/不寫入, view 只讀取, X
          • storage, balanceof, block, tx, msg (除了msg.sig, msg.data), 呼叫不是pure韓式,特定組合指令
          • X: storage, emit log, 建立合約, selfdestruct, call, 呼叫非pure非view, low-level calls, 特定組合語言
      • Day8 constructor 所有合約自帶建構子 constructor(){}
        • 部屬的回傳值 = 合約的最終程式碼
        • 建構子只會在合約部屬的那一刻被呼叫 用途
          • 用來改變[變數的預設值]
            • 所有的stroage變數再呼叫constructor之前已經被初始化
        • 最終程式碼 不包含 建構子 及only建構子使用的internal functions
      • Day9 receive() external payable {}
        • 一個合約只能有唯一一個 receive,不需要function,不允許傳入值,無法回傳任何值,必須要有external payable
        • 發送一個 無calldata交易 到合約中被觸發
        • 如果receive多了 會失敗
          • Storage, 建立合約,呼叫external function(太大),發ether(+2300)
      • Day10 send ether
        • member function of addresstype (non-payable系列成員)
          • balance -> uint245
          • code -> bytes memory
          • codehash -> bytes32
          • low-level call系列: call, delegatecall, static call
        • if payable
          • +addr.transfer(uint256 amount) 轉給addr
            • 失敗會revert
          • +addr.send(uint256 amount) -> bool
            • 失敗回傳false -> 建議用send
        • 全域變數 msg.sender
          • msg.sender -> address = 當前address
        • 當前合約 this
          • address(this)
      • Day11
        • modifier M () {} _;
        • require(條件,"錯誤原因") if ture 繼續 ; false revert
      • Day12 Mapping type
        • mapping(KeyType => ValueType) Name
        • keyType 不支援 mapping, structs, array
        • value 任意
        • 原理 ref
    • 那些關於 Ethereum 的事
    • Solidity 書
      • Struct 用於表示一個複雜變數
      • Enum 表示一個單一變數的不同狀態或值

Day 3~5

  • Hydai
    • day 13 控制結構 if for while break continue
      • 條件 = 必是布林值
    • day 14 Event at 區塊練 log at網頁
      • 合約本身無法看見自己發出的事件 因為再區塊上 可以被監看區塊的人看到
      • indexed 有被放進Topics
        • 4格 32bytes
          • Topics[0]
            • keccak(事件名稱 + "("+事件參數.map(canonical_type_of).join(",")+")")
          • Topics[1~3]存放 Indexed事件的參數
      • non-indexed 全部打包成ABI,存放在data
      • 宣告 event EVENTNAME() 不醫定要有名稱
        • 使用 emit ()
        • 放入 event E(type indexed, )只有三個三格,若為reference type 會先被Hash
    • Day17~21 Interface 宣告function+event + ERC20
      • IERC20
      • 抽象化function _XXX
  • Book
    • error handling assert用來檢測完全不該再合約裡出現的錯誤 require用來檢測使用者的輸入等
      • require() 檢驗簡單條件 合理的輸入/致行前必要簡單條件
      • assert()測試或Debug且用來檢測不變量(不該被改變的常數等)
      • revert() 確認複雜狀態
      • try/catch 確認外部執行函數和合約建立時(再一個合約裡面建立另外一個合約是)的錯誤
        • catch Error(string memory XX)
          • 宣告過revert 或 require 異常處理被觸發時候執行
        • catch Panic(uint errorCode){}
          • Assert,除0,異常鎮獵取值,運算溢位執行
        • catch (bytes memory XXlowleveldataXX)
        • catch {}
      • try 根據外部涵是呼叫或創建合約行為來定義
    • Event
    • Inheritance polymorphism
      • c3 linearization
      • function overloading = function polymorphism
      • function overriding = contract polymorphism
    • Interface 定義標準,好處:彈性效率可擴充性模組化
      • 不可以有實作部分,不能繼承
      • 可視性只能是external
      • 不可有constructor
      • 不可有任何State variables
    • 抽象合約 至少一個function沒有包含實作部分
      • template method
      • debug
      • 與interface不同在於: interface只能是合約ABI能夠表示的範疇
    • Library 不是contract(很類似) 不具有自我摧毀
      • 不可宣告state variables,不可傳送ether, 只會部屬一次
      • 兩種library類型
        • deployed
        • embedded 當所有library函數都是interal 沒有自己合約地址 變成一部分
      • 使用 using ... for

Day 6-7

  • Haidei
    • ERC721 + ERC165
  • Book
    • Vault
      • open zepplin uitiliy + openzeppelin ownable
    • ERC20 + ERC721

daily

Solidity by Example

雜項

  • 清交DAO
    - Uniswap v1->v2
    - Remix 簡介
    - Foundry + Etheranut 簡介
  • Uniswap 演進

Next

  • 學習理解Foundry
  • 了解Proxy contract

上一篇
Day 08- hypercerts 與 Protocol Labs
下一篇
Day 10 - 回歸<Taka: 賦稅作為終局之戰>
系列文
Web3 X 公共財30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言