第二周·總結(jié)一:支付、合約交互與事件

  • 涵蓋課次

    • lesson8:多幣種打賞 TipJar(參考:day08-TipJar.sol
    • lesson9:智能計(jì)算器與合約間調(diào)用(參考:day09-SmartCalculator/Calucator.sol,day09-SmartCalculator/ScientificCalculator.sol
    • lesson10:活動(dòng)追蹤與事件(參考:day10-ActivityTracker.sol
  • 核心知識(shí)點(diǎn)

    • ETH 接收與計(jì)價(jià):payable、msg.value、以“匯率 × 金額 → wei”實(shí)現(xiàn)法幣到 ETH 的映射(本課以靜態(tài)匯率模擬)。
    • 合約間交互:靜態(tài)類型調(diào)用(接口/合約類型)與低級(jí)調(diào)用(address.call + ABI 編碼)的權(quán)衡與安全檢查。
    • 事件與日志:用 event + emit 記錄關(guān)鍵狀態(tài)變更,indexed 便于前端過(guò)濾與鏈下訂閱。
  • 代碼要點(diǎn)與啟發(fā)

    • TipJar(多幣種打賞):
      • conversionRates 存儲(chǔ)匯率,supportedCurrecies 列表配合 keccak256(bytes(..)) 做字符串等值判斷,避免線性字符串比較陷阱。
      • tipInEth()tipInCurrency() 分別支持直接打賞與“法幣計(jì)價(jià) → ETH 支付”,并分別累計(jì)到 tipsPerCurrencytotalTipsReceived
      • withdrawTips() 統(tǒng)一結(jié)算到 owner;transferOwnership() 支持所有權(quán)轉(zhuǎn)移。
      • 設(shè)計(jì)建議:
        • 將不同幣種的累計(jì)值統(tǒng)一歸一為 wei 便于統(tǒng)計(jì)(當(dāng)前 tipsPerCurrency["ETH"] 記錄 wei,但法幣分支記錄原始法幣金額)。
        • 增加事件(TipReceived、Withdrawn、RateUpdated),并考慮接入預(yù)言機(jī)源維護(hù)匯率的可信度與時(shí)效性。
        • 對(duì)外部轉(zhuǎn)賬使用 Checks-Effects-Interactions 順序并評(píng)估是否需要重入保護(hù)。
    • SmartCalculator(合約間調(diào)用):
      • 主合約 Calucator 通過(guò)設(shè)置的地址與 ScientificCalulator 進(jìn)行函數(shù)調(diào)用,分別展示了強(qiáng)類型調(diào)用與低級(jí) call + abi.encodeWithSignature 的用法與差異。
      • 設(shè)計(jì)建議:
        • 優(yōu)先使用強(qiáng)類型接口/合約(編譯期檢查簽名一致性);低級(jí)調(diào)用需嚴(yán)格校驗(yàn) success 并解碼返回值。
        • 校驗(yàn)被調(diào)用合約地址非零且為已部署合約;為外部依賴提供 setter 的同時(shí)加入 onlyOwner 與事件日志。
        • 統(tǒng)一函數(shù)簽名類型(例如 squareRoot 的參數(shù)類型在簽名編碼與目標(biāo)函數(shù)處需一致)。
    • ActivityTracker(事件驅(qū)動(dòng)的行為記錄):
      • struct 建模用戶信息與訓(xùn)練記錄;mapping(address => WorkoutActivity[]) 維護(hù)歷史;多事件(注冊(cè)、更新、記錄、里程碑)驅(qū)動(dòng)前端。
      • 里程碑示例:累計(jì)訓(xùn)練次數(shù)/距離達(dá)到閾值觸發(fā) MilestoneAchieved,展示“鏈上進(jìn)度 → 前端徽章”的事件模式。
      • 設(shè)計(jì)建議:
        • 為數(shù)組型歷史記錄提供分頁(yè)讀取接口,避免一次性返回過(guò)大數(shù)據(jù)。
        • 里程碑閾值應(yīng)常量化或可配置;對(duì)體重變化等計(jì)算做好整數(shù)除法的精度處理。
  • 安全與工程化要點(diǎn)

    • 匯率與精度:統(tǒng)一以 wei 為最小單位,避免浮點(diǎn);引入“匯率精度常量”并在 UI 層做展示換算。
    • 外部調(diào)用:低級(jí)調(diào)用失敗要回滾;避免在外部調(diào)用前后留下不一致?tīng)顟B(tài);必要時(shí)使用重入保護(hù)。
    • 事件設(shè)計(jì):為關(guān)鍵路徑添加事件,涵蓋輸入?yún)?shù)與必要的索引字段,平衡 Gas 與可檢索性。
  • 自測(cè)清單

    • 你會(huì)如何把現(xiàn)實(shí)世界的法幣價(jià)格安全地引入鏈上?預(yù)言機(jī)接入的信任/成本/延遲如何權(quán)衡?
    • 寫出一次安全的跨合約調(diào)用流程:地址校驗(yàn) → 強(qiáng)類型接口/低級(jí)調(diào)用 → 檢查 success → 解碼返回值 → 更新?tīng)顟B(tài)。
    • 如果要在前端分頁(yè)讀取海量訓(xùn)練記錄,你會(huì)如何設(shè)計(jì)只讀接口與事件過(guò)濾?
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容