Web3 Study Log 003

Web3 Study Log 003

2025-7-5

這幾天各種各樣的瑣事,處理完了,真的煩,估計能消停一段時間了…

今天終于能夠坐下來好好學習,今天學習了chainlink的使用,能夠獲取 ETH/USD 實時價格,然后寫了一個簡單的眾籌項目,用到現在學習到所有知識,智能合約涉及到錢的地方,確實要謹慎謹慎再謹慎,今天一個提款條件寫錯了,錢籌集完整之后,提不出來…幸好只是Testnet。

明天準備繼續寫一個項目,DeFi 預售合約TokenPresale,說項目可能太夸張了,就是一道綜合練習題,鞏固下目前所學習的知識。背景為:一個新項目要發幣,在正式上線前對早期支持者進行預售。規則如下:

  1. 項目方設置目標:募集多少 USD 價值的 ETH,例如 $5000。
  2. 使用 Chainlink ETH/USD 匯率,支持 ETH 捐贈,捐贈最小值為 10 USD
  3. 項目方設置預售結束時間(例如一周后)。
  4. 預售結束后:
    • 項目方可提款;
    • 投資人不可退款。
  5. 上線后,投資人可 線性解鎖領取代幣(Token),解鎖期為 180 天。
  6. 投資人通過 claimTokens() 領取尚未解鎖的部分,領取多少由合約計算。

Web3 Study Log 003

2025-07-05

been dealing with a bunch of random life stuff lately — finally cleared up

man it was annoying lol… but looks like i’ll finally get some peace for a while

today i finally sat down to actually study

learned how to use Chainlink to fetch real-time ETH/USD price

then built a simple crowdfunding contract that brings together everything i’ve learned so far

any time a smart contract handles funds… you really gotta be careful

made a mistake in the withdraw condition — funds hit the goal but couldn’t be withdrawn lol

good thing it was just on testnet

tomorrow i’m planning to build another contract — a TokenPresale for a fake DeFi project

not really a full project tbh, more like a comprehensive practice exercise

goal is just to solidify what i’ve learned so far

here’s the idea:

  1. project owner sets a target funding goal in USD, e.g. $5000
  2. use Chainlink ETH/USD price feed — support ETH donations, min $10 USD per donation
  3. project owner sets a deadline (e.g. 1 week from start)
  4. after deadline:
    • project owner can withdraw
    • investors can’t refund
  5. once token launches, investors can claim tokens linearly over 180 days
  6. claimTokens() lets investors withdraw their unlocked tokens, based on contract calculation

Solidity Section 3 學習筆記:智能合約中的 ETH 眾籌與 Chainlink 預言機集成

一、學習目標

通過構建一個具備以下功能的智能合約,系統掌握 Solidity 中的重要語法與實際開發場景:

  • 使用 Chainlink AggregatorV3Interface 獲取 ETH/USD 實時價格
  • 實現一個 ETH 捐贈眾籌合約,支持募資、價格換算、提款功能
  • 使用 fallback() 和 receive() 函數接收 ETH
  • 掌握 call/send/transfer 差異
  • 使用 modifier 進行權限控制
  • 使用 error 和 revert 優化 gas
  • 使用 library 封裝常用邏輯
  • 了解 calldata 的作用及檢查方式
  • 在 Remix 上調試合約的部署與調用

二、關鍵概念與代碼講解

1. Chainlink ETH/USD 預言機價格獲取

調用方式
AggregatorV3Interface priceFeed = AggregatorV3Interface(address);
(, int answer,,,) = priceFeed.latestRoundData();
精度換算
  • Chainlink 的 answer 返回的是帶 8 位精度的價格(如 2000 * 1e8)
  • ETH 金額通常以 wei(1 ETH = 1e18 wei)傳入
  • 為對齊精度,需將 answer * 1e10 擴展為 1e18 精度,再與 ETH 金額相乘,最后除以 1e18

2. 捐贈邏輯與單位換算

uint256 usd = (ethPrice * ethAmountInWei) / 1e18;
  • ethAmountInWei 是傳入的實際金額(比如 msg.value)
  • 如果捐入 0.02 ETH,即 0.02 * 1e18 wei,與 ETH 價格相乘換算為 USD

3. 捐贈函數 fund() 實現

  • 時間控制:block.timestamp < i_deadline
  • 限制重復捐贈者:通過 mapping hasFunded 和 funders[]
  • 檢查目標達成(大于即可):if (usdTotal >= i_goal) { goalReached = true; }
require(!goalReached, "Goal already reached");

4. fallback() 和 receive()

  • 用于接收 ETH,當調用沒有 calldata 時觸發 receive()
  • 有 calldata 或調用未定義函數時觸發 fallback()
  • 推薦都定義為 external payable

5. 權限控制 modifier 與 error

modifier onlyOwner {if (msg.sender != i_owner) revert NotOwner();_;
}modifier fundSuccessOrTimeout {if (!(block.timestamp >= i_deadline || getTotalRaisedInUsd() >= i_goal)) {revert NotFinish();}_;
}
  • 使用 revert ErrorName() 可節省 gas(與 require(“string”) 比較)
  • 使用 !() 表示否定整個布爾表達式

6. call/send/transfer 的差異

方法gas 限制返回值推薦程度
transfer固定 2300 gas無返回值不推薦
send固定 2300 gas返回 bool不推薦
call可設定 gas / value / calldata返回 (bool, bytes)推薦 ?

常見調用方式:

(bool success, ) = payable(msg.sender).call{value: amount}("");
require(success, "Call failed");

三、調試常見問題總結

問題1:fund 調用失敗

  • 原因:getLatestETHPriceInUSD() 返回值類型未匹配,或傳入 ETH 金額過少導致 USD 捐贈金額遠小于 i_goal,報錯
  • 解決:確保傳入 ETH 數量與 Chainlink 的實時價格能夠換算為合適的 USD 金額

問題2:withdraw 提款失敗

  • 檢查是否滿足 withdraw 的 modifier 條件,即:
block.timestamp >= i_deadline || getTotalRaisedInUsd() >= i_goal
  • 如果 goalReached = true 但 getTotalRaisedInUsd() 小于 i_goal(例如匯率波動導致回落),仍會失敗
  • 建議改寫為檢查 goalReached 標志位配合 block.timestamp >= deadline 控制

四、library 的使用

將 ETH 轉 USD 的邏輯封裝為 library PriceConverter,用法如下:

using PriceConverter for uint256;totalAmount.getLatestETHPriceInUSD();

注意事項:

  • library 中不能使用狀態變量
  • 通常定義為純函數或 view
  • 實現邏輯更清晰、可重用性更高

五、calldata 與 fallback 判斷技巧

if (msg.data.length == 0) {// receive() triggered
} else {// fallback() triggered
}

口訣總結:

轉賬沒數據:走 receive()
其他情況:走 fallback()
想看有沒有數據:看 msg.data.length

六、調試 Remix 的注意事項

  • 發送 ETH 需在 fund 函數旁邊的 value 字段輸入,如:0.01(單位是 ETH)
  • fallback 區域中的 calldata 應填寫 16 進制值(以 0x 開頭)
  • 如果要使用 fallback 或 receive 自動轉入,需要將 ETH 發送給合約地址

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87712.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87712.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kotlin:2.1.20 的新特性

一、概述 The Kotlin 2.1.20 release is here! Here are the main highlights: Kotlin 2.1.20發布了&#xff0c;主要亮點如下&#xff1a; K2 compiler updates: updates to the new kapt and Lombok pluginsKotlin Multiplatform: new DSL to replace Gradle’s Application …

設計模式 | 觀察者模式

觀察者模式&#xff08;Observer Pattern&#xff09;是行為型設計模式中的事件通知專家&#xff0c;它定義了對象間一種一對多的依賴關系&#xff0c;當一個對象狀態改變時&#xff0c;所有依賴它的對象都會自動收到通知并更新。這種模式實現了發布-訂閱機制&#xff0c;是事件…

Apache Struts2 遠程命令執行漏洞(S2-052)

一、漏洞概述 S2-052 是 Apache Struts2 框架中一個高危的遠程代碼執行漏洞&#xff08;CVE-2017-9805&#xff09;&#xff0c;由安全研究人員于 2017 年發現并公開。該漏洞源于 Struts2 的 REST 插件在使用 XStream 組件處理 XML 反序列化時&#xff0c;未對用戶輸入的 XML 數…

RS觸發器Multisim電路仿真——硬件工程師筆記

目錄 1 RS觸發器基礎知識 1.1 工作原理 1.2 電路結構 1.3 特點 1.4 應用 1.5 設計考慮 1.6 總結 2 與非門實現基本RS觸發器 2.1 電路結構 2.2 工作原理 2.3 特點 2.4 總結 3 或非門實現基本RS觸發器 3.1 電路結構 3.2 工作原理 3.3 特點 3.4 總結 4 與非門實…

提示技術系列(12)——程序輔助語言模型

什么是提示技術&#xff1f; 提示技術是實現提示工程目標的具體技術手段&#xff0c;是提示工程中的“工具庫”。 什么又是提示工程&#xff1f; 提示工程是指通過設計、優化和迭代輸入到大語言模型&#xff08;LLM&#xff09;的提示&#xff08;Prompt&#xff09;&#xff…

明遠智睿H618:開啟多場景智慧生活新時代

在數字化浪潮的推動下&#xff0c;智能設備正深刻地改變著我們的生活方式。明遠智睿H618以其強大的功能和卓越的性能&#xff0c;在家庭娛樂、商業展示、教育培訓和智能家居控制等多個領域展現出巨大的應用潛力&#xff0c;開啟了多場景智慧生活的新時代。 家庭娛樂&#xff1…

探秘展銷編輯器:相較于傳統展銷的卓越優勢與甄選指南?

在競爭激烈的商業環境中&#xff0c;企業期望通過展銷活動提升品牌知名度、推廣產品和拓展市場&#xff0c;但傳統展銷方式存在諸多難題。一是場地限制&#xff0c;優質場地稀缺、租金貴、檔期緊&#xff0c;場地空間和布局也不一定合適;二是展示形式單一&#xff0c;多為靜態展…

第31篇:塊設備與字符設備管理深度解析(基于OpenEuler 24.03)

塊設備與字符設備管理深度解析&#xff08;基于OpenEuler 24.03&#xff09; 文章目錄 塊設備與字符設備管理深度解析&#xff08;基于OpenEuler 24.03&#xff09;一、設備基礎概念體系1.1 塊設備的核心特性與分類1.2 字符設備的流式數據模型1.3 設備標識系統&#xff1a;主設…

Django Channels WebSocket實時通信實戰:從聊天功能到消息推送

引言 在Web開發中&#xff0c;實時通信功能&#xff08;如在線聊天、實時通知、數據推送&#xff09;已成為許多應用的核心需求。傳統的HTTP協議由于其請求-響應模式的限制&#xff0c;無法高效實現實時通信。WebSocket作為一種全雙工通信協議&#xff0c;為實時Web應用提供了…

day52 神經網絡調參指南

目錄 隨機種子 內參的初始化 神經網絡調參指南 參數的分類 調參順序 初始化參數 batchsize的選擇 學習率調整 激活函數的選擇 損失函數的選擇 模型架構中的參數 正則化系數 其他補充 隨機種子 import torch import torch.nn as nn# 定義簡單的線性模型&#xf…

.NET9 實現斐波那契數列(FibonacciSequence)性能測試

在 .NET 平臺上實現 斐波那契數列 并使用 BenchmarkDotNet 進行性能測試&#xff0c;是評估不同算法實現方式性能表現的一種高效且標準化的方法。通過該方式&#xff0c;可以對比遞歸、迭代、記憶化遞歸以及結合高性能優化技術&#xff08;如 Span<T>、Memory<T> 和…

三、docker軟件安裝:gitlab,nexus,mysql8,redis,nacos,nginx

目錄 1.gitlab安裝 2.nexus安裝 (1)下載啟動 (2)設置中央倉庫遠程地址 (3)配置maven的settings.xml 3.mysql8安裝 4.redis安裝 5.nacos安裝 6.nginx安裝 1.gitlab安裝 #創建目錄 cd /usr/local/ mkdir docker cd docker/ mkdir gitlab_docker cd gitlab_docker…

【與AI+】SAP WEBGUI集成開發與SAP INTERNET服務的關系

前言&#xff1a;這是我的水水專欄第五篇文章&#xff0c;這個專欄呢&#xff0c;是放一些我向AI提問的問題&#xff0c;以及AI的回答。因為感覺真的好方便哈哈哈~ 我不是很確定我的專欄文章內容是否涉及版權&#xff0c;以及也不確定這些整合過的文字是否涉嫌抄襲&#xff0c…

淺談幾種js設計模式

JavaScript設計模式是開發中常用的一種解決方案&#xff0c;它們幫助開發者以一種更結構化、更易維護的方式編寫代碼。本文將深入介紹幾種常見的JavaScript設計模式&#xff0c;包括單例模式、工廠模式、觀察者模式和策略模式。 一、單例模式&#xff08;Singleton Pattern&am…

手寫 Vue 中虛擬 DOM 到真實 DOM 的完整過程

目錄 一、虛擬 DOM 的核心概念 二、虛擬 DOM 到真實 DOM 的流程 三、手寫虛擬 DOM 到真實 DOM 的實現 1. 定義虛擬 DOM 的結構&#xff08;VNode&#xff09; 2. 創建虛擬 DOM 轉真實 DOM 的函數 3. 掛載虛擬 DOM 到頁面 4. 更新虛擬 DOM 的過程&#xff08;Diff 算法簡化…

jmm--volatile

指令重排基礎概念 在現代處理器和編譯器為了提高程序執行效率&#xff0c;會對指令進行優化&#xff0c;其中一種優化方式就是指令重排序。在單線程環境下&#xff0c;指令重排序不會影響最終執行結果&#xff0c;因為處理器和編譯器會保證重排序后的執行結果與按照代碼順序執行…

【硬件開發】濾波電容的選擇:原理、計算與多電壓值應用實踐

濾波電容的選擇&#xff1a;原理、計算與多電壓值應用實踐 1. 引言 在現代電子系統中&#xff0c;穩定的電源供應是保證電路可靠運行的基礎。然而&#xff0c;電源線上往往不可避免地存在各種噪聲和紋波&#xff0c;這些干擾可能源自電源本身&#xff08;如整流后的脈動直流&…

【seismic unix數據生成-unif2】

Seismic Unix簡介 Seismic Unix&#xff08;SU&#xff09;是由科羅拉多礦業學院&#xff08;Colorado School of Mines&#xff09;開發的開源地震數據處理軟件包&#xff0c;專為地震勘探數據分析和研究設計。它提供了一系列命令行工具&#xff0c;支持從數據加載、處理到可…

【逆向思考 并集查找】P2391 白雪皚皚|省選-

本文涉及知識點 C并集查找 P2391 白雪皚皚 題目背景 “柴門聞犬吠&#xff0c;風雪夜歸人”&#xff0c;冬天&#xff0c;不期而至。千里冰封&#xff0c;萬里雪飄。空中刮起了鴨毛大雪。雪花紛紛&#xff0c;降落人間。 美能量星球&#xff08;pty 在 spore 上的一個殖民地…

一文講清楚React中setState的使用方法和機制

文章目錄 一文講清楚React中setState的使用方法和機制1. setState是什么2. setState方法詳解2.1 setState參數詳解2.2 setState同步異步問題2.2.1 setState異步更新2.2.2 setState同步更新 一文講清楚React中setState的使用方法和機制 1. setState是什么 React中&#xff0c;…