今天咱們聊聊如何開發(fā)智能合約,非常入門的分享~
1. 如何開發(fā)智能合約
1.1. 基本流程 & 主流工具
1.1.1. 編寫合約代碼
- Solidity仍然是一騎絕塵(EVM)
- Vyper是不太活躍語言,python語法(EVM)
- Rust不能應(yīng)用在EVM的區(qū)塊鏈。然而Rust可以部署到Solana、Terra等鏈上,或者在Polkadot構(gòu)建區(qū)塊鏈應(yīng)用。Rust是一種性能良好的通用語言,甚至在智能合約之外使用
1.1.2. 底層依賴
- Openzeppelin
- https://openzeppelin.com/
- Openzeppelin鞏固了自己作為 “solidity標準庫 ”的地位
- Openzeppelin是一套已經(jīng)寫好的智能合約,不需要重新發(fā)明輪子。使用他們已經(jīng)審計過的可擴展智能合約,可以節(jié)省無數(shù)時間
- Chainlink
- https://chain.link/
- Chainlink是預(yù)言機里的NO.1
- 節(jié)點服務(wù)商
- 封裝了底層鏈的各種API & 節(jié)點計算資源
- Top服務(wù)商:Alchemy、QUIckNode(很全,Base鏈推薦)、Infura(當前主導(dǎo)地位)、Blockdaemon(Base鏈推薦)、Blast(Base鏈推薦)
1.1.3. 編譯 & 測試 & 部署 框架
- Hardhat
- 目前最主要的智能合約開發(fā)框架
- 基于javascript和solidity的開發(fā)框架
- Foundry & DappTools
- Dapptools是一個專注于命令行的工具,F(xiàn)oundry是用Rust編寫的Dapptools,是Dapptools的繼承者
- Foundry2022年才誕生,發(fā)展速度很快,測試運行速度也很快,提升開發(fā)效率
- Brownie & Apeworx
- 這兩個都是基于Python的,同時支持solidity和vyper
- Brownie已經(jīng)處于維護模式,Apeworx即將成為Brownie的繼承者
- Remix
- 最適合初學者的平臺,Web IDE
- 適合快速嘗試想法、分享
1.1.4. 安全分析/審計
代碼發(fā)布到區(qū)塊鏈上時,審計是至關(guān)重要的,因為任何人都可以查看,一旦它發(fā)布了,就有可能被利用!因此,有一些工具可以幫助我們確保在代碼中減少錯誤,這是非常重要的。這個領(lǐng)域已經(jīng)出現(xiàn)了一些工具,使我們的智能合約更加安全。
- Eth Security Toolbox
- Echidna
- Slither
- Mythril
- Code4rena
- Immunefi
1.1.5. 監(jiān)控運維
- Openzeppelin的Defender
- Tenderly
1.2. 基于Remix的Demo
https://remix.ethereum.org
1.2.1. 編寫合約代碼(Solidity)
1.2.2. 編譯合約代碼
1.2.3. 部署合約
如果“環(huán)境”選擇了"Injected Network",會自動連接錢包,錢包切換網(wǎng)絡(luò),則可以將合約部署到該網(wǎng)絡(luò)上!部署時候會觸發(fā)交易,產(chǎn)生Gas費
1.2.4. 執(zhí)行合約(合約交互)
這里是UI的交互,主流的就是代碼方式了
1.2.5. 在瀏覽器中查看交易明細
https://goerli.basescan.org/tx/0x26…9db22
1.3. 其他Demo
- Hardhat (純代碼交互了,不再有UI界面了)
- https://hardhat.org/tutorial/boilerplate-project
2. 進一步了解開發(fā)合約
2.1. 合約本身代碼開發(fā)(Solidity)
- Solidity官方文檔
- https://docs.soliditylang.org/zh/latest/index.html
- 比較有趣的學習課程
- https://cryptozombies.io/ (Solidity的部分比較有意思,其他的一般)
2.2. 合約交互開發(fā)
2.2.1. 智能合約交互的代碼編寫
- 以太坊節(jié)點只能識別一種叫做 JSON-RPC 的語言。這種語言直接讀起來并不好懂。當你你想調(diào)用一個合約的方法的時候,需要發(fā)送的查詢語句將會是這樣的:
- 幸運的是 Web3.js 把這些令人討厭的查詢語句都隱藏起來了, 所以你只需要與方便易懂的 JavaScript 界面進行交互即可。你不需要構(gòu)建上面的查詢語句,在你的代碼中調(diào)用一個函數(shù)看起來將是這樣:
2.2.2. 合約交互背后是誰提供服務(wù)(節(jié)點服務(wù)商,也叫Provider)
- 在 Web3.js 里設(shè)置 Web3 的 Provider(提供者) 告訴我們的代碼應(yīng)該和 哪個節(jié)點 交互來處理我們的讀寫。這就好像在傳統(tǒng)的 Web 應(yīng)用程序中為你的 API 調(diào)用設(shè)置遠程 Web 服務(wù)器的網(wǎng)址。
- 你可以運行你自己的以太坊節(jié)點來作為 Provider。 不過,有一個第三方的服務(wù),可以讓你的生活變得輕松點,讓你不必為了給你的用戶提供DApp而維護一個以太坊節(jié)點— Infura.(當然還有其他的)
2.2.3. 合約對外交互的關(guān)鍵
- Web3.js 需要兩個東西來和合約對話: 它的 合約地址 和它的 合約ABI。
- 合約地址:合約部署后就會生成一個合約地址
- 合約ABI:ABI 意為應(yīng)用二進制接口(Application Binary Interface)。 基本上,它是以 JSON 格式表示合約的方法,告訴 Web3.js 如何以合同理解的方式格式化函數(shù)調(diào)用。
- 實例化合約
- 一旦有了合約的地址和 ABI,你可以像這樣來實例化 Web3.js。
{ "jsonrpc": "2.0", "method": "eth_sendTransaction", "params": [{ "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155", "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", "gas": "0x76c0", "gasPrice": "0x9184e72a000", "value": "0x9184e72a", "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675" }], "id": 1}
CryptoZombies.methods.createRandomZombie("Vitalik Nakamoto ") .send({ from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155", gas: "3000000" })
// 實例化 myContractvar myContract = new web3js.eth.Contract(myABI, myContractAddress);
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。