Solidity 語言簡易入門,快速上手!
Solidity語言簡介
solidity語言是一種可以編寫智慧合約的高階語言,當然編寫智慧合約不止這一種,但是學習以太坊最好還是學會這一種語言就差不多了。在以太坊平臺上,solidiy編寫的智慧合約會執行在以太坊虛擬機器EVM之上,變成位元組碼執行。
新手入門建議使用官方IDE開發工具Remix。
結構
solidity語言中的合約結構和麵向物件程式設計的類相似。一個合約就幾乎是一個類,結構基本一致。包括宣告變數(如狀態變數,函式,函式修改器,事件),合約繼承等。
contract SimpleContract{ unit SomeData; // 狀態變數 function(){ // 函式 } address public creater; // 建立者地址 function SimpleContract() { creater = msg.sender; // 在建構函式中記錄合約建立者 } modifier onlyCreater() { // 函式修改器 require(msg.sender == creater); _; } function abort() onlyCreater(){ // 使用函式修改器 } event Deposit(address _from, uint _amount); // 事件 function Donate() payable(){ Deposit(msg.sender, msg.value); // 觸發事件 } }
- 狀態變數:永久儲存在合約賬戶中的值,用於儲存合約狀態。一經寫入智慧合約,部署到區塊鏈之上,後不可修改 。
- 函式:結構類似js函式。
- 函式修改器:可用於修改函式的行為,在函式執行前或執行後插入其他邏輯。比如在函式執行前進行引數檢查等。
- 事件:是以太坊日誌協議的高層次抽象,用於記錄合約執行過程中發生的各種事件以及狀態變化。
變數型別
1. 值型別
跟C++ 極為相似。簡要說明。
- 布林型別。 true false,支援 ! && || == !=
- 列舉型別。enum SomeEnum { one, two, three }
- 整數型別。int uint,uint為無符號整數。變數支援通過後綴指明變數使用多少位進行儲存,字尾範圍是8~256之內8的整數倍。如int8 int16... int256, 預設為int256 uint256。
- address地址型別。智慧合約獨有的變數型別,長度為20位元組,和以太坊賬戶地址長度一致。原本屬於合約的基類,擁有一些成員方法和變數。從solidity0.5.0版本開始,合約不再繼承自address地址型別,但仍然可以通過顯式型別轉換將合約轉換為地址型別。
重點介紹address的一些方法和變數。
1. <address>.balance 賬戶餘額
2. <address>.transfer(uint256 amount) 轉賬,失敗會丟擲異常,終止程式碼
3. <address>.send(uint256 amount) return (bool) 轉賬,失敗會返回false
4. <address>.call(...) return (bool)
5. <address>.callcode(....) return (bool)
6. <address>.delegate(...) return (bool)
4 5 6 與合約進行互動。
4 接收任何長度型別的引數,每個引數被填充為32位元組並拼接在一起。
6 與4的區別是 6僅執行diamagnetic,而諸如轉賬儲存,餘額等其他方面都是使用當前合約資料,這是為了用另外一個合約的程式碼。
5 屬於早期介面,許可權較低,無法訪問msg.sender, msg.value等變數。
2. 引用型別
- 陣列:T[k]型別為T長度為k的定長陣列,T[ ] 則聲明瞭一個動態陣列
- 成員變數和函式:
- bytes和string,一種特殊的陣列。bytes屬於任意長度的位元組資料,string用於表示任意長度的UTF8字元資料。
- push方法,陣列尾部新增新元素,返回新陣列長度。
- length 陣列長度,賬戶儲存中的陣列長度可以修改,而記憶體中的陣列建立後length成員已經確定了無法修改。外部呼叫無法返回一個動態陣列的長度,做法是需要將返回的內容放在一個長度足夠的定長陣列。
- 成員變數和函式:
- 結構體。與C極為相似。
struct{
address add;
uint amount;
}
3. 對映:對映是一種鍵值對對映關係的儲存結構。我們使用 mapping(KeyType => ValueType)來宣告一個對映。
鍵型別KeyTpye可以是除了對映,動態陣列,智慧合約,列舉型別,結構體以外的任何型別。
值型別ValueType可以是任意型別,包括對映本身。
對映可以看作一個散列表,鍵輸入雜湊,得到值。對映不儲存鍵的值,而是儲存其Keccak-256雜湊值。
3. 型別轉換
顯示型別轉換和隱式型別轉換。
uint16 a = uint16(b) 顯式轉換。
uint16 a = 0x11111111 32位隱式轉為16位。
4. 運算子
需要注意一個新的運算子 delete
uint a[3]; 若a[2] = 2, delete a[2] 之後, a[2] = 0;
delete a 則表示將陣列變為長度為0的空陣列。
5. 型別推斷
var a = "asad" 推斷 a的型別為string,用法跟js中的var,C++中的auto一致。
內建單位、全域性變數和函式
1. 貨幣單位
2. 時間單位
3. 區塊和交易屬性。
4. 異常處理函式
5. 數學加密函式
6. 合約相關的變數和函式。
選擇控制結構
迴圈,條件語句與C++完全一致。
函式
呼叫同一合約的函式,內部呼叫
呼叫其他合約例項的方法,屬於外部呼叫。
命名呼叫 !!!
函式可用性:external, public, internal, private
特殊函式
constant, 只讀
fallback函式, 不接收引數,無返回值。
待更新。。。