solidity 合約開發(fā)記錄

搭建hardhat環(huán)境

  1. 全局安裝 solcjs
    npm install -g solc
  2. 查看是否安裝成功
    solcjs --version 輸出 0.8.21+commit.d9974bed.Emscripten.clang
  3. 下載 remix 桌面版
    https://github.com/ethereum/remix-desktop/releases
  4. 創(chuàng)建新文件夾并進入
  5. npx hardhat 選擇ts創(chuàng)建項目
  6. npm i -g hardhat-shorthand 安裝 縮寫和自動補全
    hh 相當(dāng)于 npx hardhat
  7. ts 測試合約方法
const [owner, addr1] = await ethers.getSigners();
console.log('owner===',owner,addr1)
const testaa = await ethers.deployContract('Test')
await testaa.setOwner('0x70997970C51812dc3A010C7d01b50e0d17dc79C8')
const abc = await testaa.getOwner()
console.log('-=-=--=-',abc)

solidity 語法記錄

selfdestruct

https://www.alchemy.com/overviews/selfdestruct-solidity

修飾符

pure 對于函數(shù):不允許修改或訪問狀態(tài)。
view 對于函數(shù):不允許修改狀態(tài)。
payable 對于功能:允許他們在接到電話的同時接收乙醚。
constant 對于狀態(tài)變量:不允許賦值(初始化除外)肃拜,不占用存儲槽忽刽。
immutable 對于狀態(tài)變量:在構(gòu)造時只允許一個賦值璧亚,之后是常量。存儲在代碼中结闸。
anonymous 對于事件:不將事件簽名存儲為主題辩诞。
indexed 對于事件參數(shù):將參數(shù)存儲為主題坎弯。
virtual 對于函數(shù)和修飾符:允許在派生契約中更改函數(shù)或修飾符的行為。

library

https://www.geeksforgeeks.org/solidity-libraries/
通過創(chuàng)建庫來部署通用代碼可以降低gas成本

數(shù)據(jù)存儲 memory storage calldata

https://docs.alchemy.com/docs/when-to-use-storage-vs-memory-vs-calldata-in-solidity
https://docs.alchemy.com/docs/what-is-the-difference-between-memory-and-calldata-in-solidity
https://dev.to/ratracegrad/storage-vs-memory-vs-calldata-understanding-data-locations-in-solidity-52ff

msg.sender

https://medium.com/upstate-interactive/what-you-need-to-know-about-msg-global-variables-in-solidity-566f1e83cc69

錯誤處理assert revert require error

https://medium.com/blockchannel/the-use-of-revert-assert-and-require-in-solidity-and-the-new-revert-opcode-in-the-evm-1a3a7990e06e

函數(shù)修飾符 public external internal private

https://blockchain-academy.hs-mittweida.de/courses/solidity-coding-beginners-to-intermediate/lessons/solidity-5-calling-other-contracts-visibility-state-access/topic/visibility-public-private-external-internal/

自定義值類型

type UFixed256x18 is uint256;

// 用戶定義的值類型允許在基本值類型上創(chuàng)建零成本抽象。這類似于別名抠忘,但具有更嚴(yán)格的類型要求撩炊。
// 用戶定義的值類型使用 type C is V ,在哪里 C 是新引入的類型的名稱褐桌,并且 V 必須是內(nèi)置值類型(“基礎(chǔ)類型”)衰抑。
// 類型 C 沒有任何運算符或綁定的成員函數(shù)象迎。特別是荧嵌,即使是操作員 == 未定義。不允許與其他類型進行顯式和隱式轉(zhuǎn)換砾淌。
type UFixed256x18 is uint256;


// 該函數(shù) C.wrap 用于從基礎(chǔ)類型轉(zhuǎn)換為自定義類型啦撮。類似地,函數(shù) C.unwrap 用于從自定義類型轉(zhuǎn)換為基礎(chǔ)類型汪厨。
function add(UFixed256x18 a, UFixed256x18 b) internal pure returns (UFixed256x18) {
    return UFixed256x18.wrap(UFixed256x18.unwrap(a) + UFixed256x18.unwrap(b));
}

創(chuàng)建外部合約對象

Test1 test1Contract = new Test1();

枚舉

enum ActionType { cancel, comfirm, sure, end }

結(jié)構(gòu)

 struct UserInfo {
      address addr;
      uint256 balance;
      bool isNote;
      string name;
    }
 UserInfo userInfo = UserInfo({
      addr:0xE4cdDab0Cf6d9Bf2231cd7CA3A8c82Ba24C74a1d,
      balance: 1,
      isNote:false,
      name:"jack"
    });


編譯器自動為所有 public 狀態(tài)變量 生成 getter 函數(shù)

 // test1Contract.amount()
uint public amount;

映射

 // 映射類型 映射的數(shù)據(jù)位置只能為 storage
    mapping (address => uint256) public balanceInfo;
    function updateBalance(address addr) public {
      balanceInfo[addr] = uint256(100);
    }

定義事件


 // 定義事件赃春,alreadyEnd 調(diào)用后調(diào)用該事件
    event SendParams(address owner, uint amount);
    function alreadyEnd() public {
      uint amounts;

      // 在此處發(fā)送事件
      emit SendParams(msg.sender, amounts);
    }

try catch

        // try 外部合約方法 catch
        // 這個 try 關(guān)鍵字后面必須跟一個表示外部函數(shù)調(diào)用或協(xié)定創(chuàng)建的表達式 (new ContractName() ).
        // 不會捕獲表達式內(nèi)部的錯誤(例如,如果它是一個復(fù)雜的表達式劫乱,同時還涉及內(nèi)部函數(shù)調(diào)用)织中,
        // 只會在外部調(diào)用本身內(nèi)部發(fā)生還原。這個 returns 后面的部分(可選)聲明與外部調(diào)用返回的類型匹配的返回變量

        try test1Contract.testFun() returns (uint) {
          
        } catch  {
          
        }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衷戈,一起剝皮案震驚了整個濱河市狭吼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殖妇,老刑警劉巖刁笙,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谦趣,居然都是意外死亡疲吸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門前鹅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摘悴,“玉大人,你說我怎么就攤上這事舰绘□逵鳎” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵除盏,是天一觀的道長叉橱。 經(jīng)常有香客問我,道長者蠕,這世上最難降的妖魔是什么窃祝? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮踱侣,結(jié)果婚禮上粪小,老公的妹妹穿的比我還像新娘大磺。我一直安慰自己,他們只是感情好探膊,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布杠愧。 她就那樣靜靜地躺著,像睡著了一般逞壁。 火紅的嫁衣襯著肌膚如雪流济。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天腌闯,我揣著相機與錄音绳瘟,去河邊找鬼。 笑死姿骏,一個胖子當(dāng)著我的面吹牛糖声,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播分瘦,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蘸泻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘲玫?” 一聲冷哼從身側(cè)響起悦施,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趁冈,沒想到半個月后歼争,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡渗勘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年沐绒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旺坠。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乔遮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出取刃,到底是詐尸還是另有隱情蹋肮,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布璧疗,位于F島的核電站坯辩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏崩侠。R本人自食惡果不足惜漆魔,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧改抡,春花似錦矢炼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欠拾,卻和暖如春胰锌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背清蚀。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工匕荸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枷邪。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像诺凡,于是被迫代替她去往敵國和親东揣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容