深入理解Solidity
生活随笔
收集整理的這篇文章主要介紹了
深入理解Solidity
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Solidity源文件布局
pragma(版本雜注)
- 用于指定源文件的版本,表明編譯器的版本,例如 pragma solidity ^0.4.0
- ^用于指代版本號(hào)需要大于0.4.0但是不可以超過大的層級(jí),必須小于0.5.0
- 也可以使用大于等于小于來指定版本
import(導(dǎo)入其它源文件)
- Solidity所支持的導(dǎo)入語句import,語法和JavaScript非常類似
- import “filename”;? 從“filenmae”中導(dǎo)入所有的全局富豪到當(dāng)前的全局作用域中
- import * as symbolName from “filename”;? 創(chuàng)建一個(gè)新的全局符號(hào)symbolName,其成員均來自于“filename”中的全局符號(hào)
- import {symbol1 as alias ,symbol2} from "filename"; 創(chuàng)建新的全局符號(hào)alias和symbol2,分別從“fikename'”引用symbol1和symbol2
- import “filename” as symbolName;這條語句等同于import * as symbolName from “filename”;?
Solidity值類型
- 布爾(bool)可能的結(jié)果為字符常量值true或者false
- 整型(int/uint)分別表示有符號(hào)和無符號(hào)的不同位數(shù)的整型變量,支持關(guān)鍵字uint8到uint256(無符號(hào),從8位到256位)以及int8到int256,每8位為一個(gè)步長進(jìn)行遞增
- 定長浮點(diǎn)型(fixed/ufixed):表示各種大小的有符號(hào)的無符號(hào)的定長浮點(diǎn)型,在關(guān)鍵字ufixedMxN和fixedMxN中,M表示該類型占用的位數(shù),N表示可用的小數(shù)的位數(shù),這個(gè)必須要小于80
- 地址(address)存儲(chǔ)一個(gè)20字節(jié)的值(以太坊的地址的大小)
- 定長字節(jié)數(shù)組:關(guān)鍵字有bytes1、bytes2、bytes3,。。。,bytes32,如果沒有數(shù)字bytes就是不定長的
- 枚舉(enum)一種用戶可以定義類型的方法,與C語言類似,默認(rèn)從0開始遞增,一般用于模擬合約的狀態(tài)
- 函數(shù)(function)一種表示函數(shù)的類型
Solidity引用類型
數(shù)組(Array)
- 數(shù)組可以在聲明的時(shí)候指定長度(定長數(shù)組),也可以動(dòng)態(tài)調(diào)整大小(變長數(shù)組/動(dòng)態(tài)數(shù)組)
- 對于存儲(chǔ)型(storage)的數(shù)組來說,元素的類型可以是任意的(即元素可以是數(shù)組類型、映射類型或者結(jié)構(gòu)體)
- 對于內(nèi)存型(memory)的數(shù)組來說,元素的類型不能是映射(mapping)類型
結(jié)構(gòu)(Struct)
- Solidity 支持通過構(gòu)造結(jié)構(gòu)體的形式來定義新的類型
映射(Mapping)
- 映射可以看作哈希表,在實(shí)際的初始化過程中創(chuàng)建每一個(gè)可能的key,并且將其映射到字節(jié)形式全是0的值(類型默認(rèn)值)
Solidity地址類型
address
- 地址類型存儲(chǔ)一個(gè)20字節(jié)的值(以太坊地址的大小),地址的類型也有成員變量,并作為所有合約的基礎(chǔ)
address payable(V0.5.0引入)
- 與地址類型基本相同,不過多出了transfer和send;兩個(gè)成員變量
兩者的區(qū)別和轉(zhuǎn)換
- Payable地址是可以發(fā)送ether的地址,普通的address是不可以的
- 允許從payable address到address的隱式轉(zhuǎn)換,而反過來的直接轉(zhuǎn)換是不可能的(唯一的方法是通過uint160來進(jìn)行中間轉(zhuǎn)換)
- 從0.5.0版本起,合約不再是從地址類型派生而來,但是如果它有payable回退函數(shù),那同樣可以顯示轉(zhuǎn)換為address或者addresspayable類型
具體
- <address>.balance(uint256) 該地址的ether余額,以Wei為單位
- <address payable>.transfer(uint256 amount) 向指定地址發(fā)送數(shù)量為amount的ether(以Wei為單位),失敗時(shí)拋出異常,發(fā)送23000gas的礦工費(fèi),不可以調(diào)節(jié)
- <address payable>.send(uint256 amount)returns(bool)向指定地址發(fā)送數(shù)量為amount的ether(以Wei為單位),失敗時(shí)返回false,發(fā)送23000gas的礦工費(fèi),不可以調(diào)節(jié)
- <address>.call(bytes memory)returns (bool,bytes memory) 發(fā)出底層函數(shù)CALL,失敗時(shí)候返回false,發(fā)送所有可用的gas,可以調(diào)節(jié)
- <address>.delegatecall(bytes memory)returns (bool,bytes memory)發(fā)出底層函數(shù)DELEGATECALL,失敗時(shí)候返回false,發(fā)送所有可用的gas,可以調(diào)節(jié)
- <address>.staticcall(bytes memory) returns(bool,bytes memory)發(fā)出底層函數(shù)STATICCALL,失敗時(shí)候返回false,發(fā)送所有可用的gas,可以調(diào)節(jié)
用法
balance和transfer
- 可以使用一個(gè)balance屬性來查詢一個(gè)地址的余額,可以使用tranafer函數(shù)像一個(gè)payable地址發(fā)送以太幣Ether(以wei為單位)
- 哪個(gè)地址調(diào)用transfer函數(shù),就向哪個(gè)地址轉(zhuǎn)錢。以太坊的水管合約,發(fā)起交易實(shí)質(zhì)是香我們的賬戶打錢
send
- send是transfer的初級(jí)版本。如果執(zhí)行失敗,當(dāng)前的合約不會(huì)因?yàn)楫惓6K止,但是send會(huì)返回false
call
- 通過添加call來實(shí)現(xiàn)轉(zhuǎn)幣操作,通過添加.gas()和.value()裝飾器
字符數(shù)組(Byte Arrays)
定長字符數(shù)組
-
屬于值類型,bytes1、bytes2,。。。,bytes32分別代表了長度1到32的字節(jié)序列
-
有一個(gè).length屬性,返回?cái)?shù)組的長度(只讀)
變長字符數(shù)組
-
屬于引用類型,包括bytes和string,不同的是bytes是Hex字符串,而string是UTF-8編碼的字符串
數(shù)組
- 固定大小k和元素類型T的數(shù)組被寫成T[k],動(dòng)態(tài)大小的數(shù)組為T[]。例,一個(gè)由5個(gè)uint動(dòng)態(tài)數(shù)組組成的數(shù)組是uint[][5],和C語言不一樣,固定大小寫在數(shù)組的第二個(gè)[]里面
- 要訪問第三個(gè)動(dòng)態(tài)數(shù)組中的第二個(gè)uint,可以使用x[2][1]
- 越界訪問數(shù)組,會(huì)導(dǎo)致調(diào)用失敗回退
- 如果要添加新的元素,則必須受用.push()或者將.length增大
- 變長的storage數(shù)組和bytes(不包括string)有一個(gè)push()方法。可以將一個(gè)新的元素附加到數(shù)組的末端,返回值為當(dāng)前的數(shù)組長度
- 例子
枚舉
- 枚舉類型用來用戶自定義一組常量值
- 和C語言類似,對應(yīng)整型值,從0開始累加
結(jié)構(gòu)
- 結(jié)構(gòu)體可以在映射和數(shù)組中使用,他們本身可以包含映射和數(shù)組
- 結(jié)構(gòu)不能包含自己類型的成員,但是可以作為自己數(shù)組成員的類型,也可以作為自己映射成員的值類型
映射(Mapping)
- 聲明一個(gè)映射 mapping(_KeyType => _ValueType)
- _KeyType可以是任何基本類型,這意味著它可以是任何內(nèi)置值類型加上字符數(shù)組和字符串。不可以使用用戶定義的或者復(fù)雜的類型,如枚舉、映射、結(jié)構(gòu)以及除了bytes和string之外任何數(shù)組類型。投票合約的時(shí)候,使用地址映射一個(gè)結(jié)構(gòu)體,可以使用簡單結(jié)構(gòu)來映射復(fù)雜結(jié)構(gòu),不可以使用復(fù)雜結(jié)構(gòu)來映射簡單結(jié)構(gòu)。本質(zhì)上類似key-value的形式,使用簡單的結(jié)構(gòu)來查詢復(fù)雜結(jié)構(gòu),但是不可以通過復(fù)雜結(jié)構(gòu)來查詢簡單結(jié)構(gòu)。
- _ValueType可以是任何類型,包括映射
例子
- 合約D調(diào)用合約C
?
總結(jié)
以上是生活随笔為你收集整理的深入理解Solidity的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中获取classpath路径下的
- 下一篇: 英语口语 week14 Friday