一、了解solidity中的關鍵字。
二、了解solidity中的類型。
三、編寫合約
1.這里列出一些solidity中的關鍵字,有哪些。
pragma
作用:是告知編譯器如何處理源代碼的通用指令(例如,?pragma once?)。public
作用:關鍵字 "public" 讓這些 變量可以外部讀取。event
作用:來定義一個事件。require
作用:用于在執(zhí)行前驗證輸入和條件;revent
作用:用于直接觸發(fā)回退,可自定義異常處理;assert
作用:用于檢查不應該為假的代碼,失敗的斷言可能意味著代碼層面存在錯誤。emit
作用:v0.4.21版本引進,來觸發(fā)事件,這有助于分清功能和事件,這也是之前遭遇DAO攻擊導致以太坊硬分叉并催生經典以太坊ETC的原因之一。一般:支持并推薦使用emit EventName()來明確地調用事件。為了讓事件較常規(guī)函數調用更突出,應該是用emit EventName()而不是EventName()revert
作用:無條件地中止執(zhí)行并回退所有的變化,類似于?require?函數,它也同樣允許你提供一個錯誤的名稱和額外的數據,這些額外數據將提供給調用者(并最終提供給前端應用程序或區(qū)塊資源管理器),這樣就可以更容易地調試或應對失敗。
2.這里列出一些solidity中的類型,有哪些。
uint:256位無符號整數mapping: Solidity之mapping類型,映射是一種引用類型,存儲鍵值對。address:是一個160位的值,且不允許任何算數操作。這種類型適合存儲合約地址或外部人員的密鑰對。public:自動生成一個函數,允許你在這個合約之外訪問這個狀態(tài)變量的當前值。如果沒有這個關鍵字,其他的合約沒有辦法訪問這個變量。struct:Struct是Solidity中的自定義類型。使用Solidity的關鍵struct進行自定義。結構體內還可以再包含字符串,整型,映射,結構體等復雜類型,注:所有的標識符(合約名稱,函數名稱和變量名稱)都只能使用ASCII字符集。UTF-8編碼的數據可以用字符串變量的形式存儲。
3.編寫簡單的合約
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
contract Coin {// 關鍵字 "public" 讓這些 變量可以外部讀取address public minter;// 創(chuàng)建一個公共狀態(tài)變量,但它是一個更復雜的數據類型。// 該類型將address映射為無符號整數。 Mappings 可以看作是一個 哈希表 它會執(zhí)行虛擬初始化,以使所有可能存在的鍵都映射到一個字節(jié)表示為全零的值。// 但是,這種類比并不太恰當,因為它既不能獲得映射的所有鍵的列表,也不能獲得所有值的列表。// 因此,要么記住你添加到mapping中的數據(使用列表或更高級的數據類型會更好),要么在不需要鍵列表或值列表的上下文中使用它mapping (address => uint) public balances;// 客戶端可以通過事件針對變化作出高效的反應event Sent(address from, address to, uint amount);// 這是構造函數,只有當合約創(chuàng)建時運行constructor() {minter = msg.sender;}function mint(address receiver, uint amount) public {// 檢查是否是合約的owner調用require(msg.sender == minter);balances[receiver] += amount;}// Errors allow you to provide information about// why an operation failed. They are returned// to the caller of the function.// 用來向調用者描述錯誤信息。Error與 revert 語句 一起使用。 revert 語句無條件地中止執(zhí)行并回退所有的變化,類似于 require 函數,// 它也同樣允許你提供一個錯誤的名稱和額外的數據,這些額外數據將提供給調用者(并最終提供給前端應用程序或區(qū)塊資源管理器),// 這樣就可以更容易地調試或應對失敗。// 任何人(已經擁有一些代幣)都可以使用 send 函數來向其他人發(fā)送代幣。如果發(fā)送者沒有足夠的代幣可以發(fā)送,// if 條件為真 revert 將觸發(fā)失敗,并通過 InsufficientBalance 向發(fā)送者提供錯誤細節(jié)。error InsufficientBlanace(uint requested, uint available);function send(address receiver, uint amount) public {if (amount > balances[msg.sender])revert InsufficientBlanace({requested: amount,available: balances[msg.sender]});balances[msg.sender] -= amount;balances[receiver] += amount;emit Sent(msg.sender, receiver, amount);}
}
到這就沒了,學會了最簡單的編寫合約了,然后可以根據別人編寫的合約進行閱讀然后改寫,加油吧,各位。