solidity基礎知識

2021-10-10 22:38:27 字數 2407 閱讀 9193

自己學習會參考到的一些基礎知識,記錄一下,主要包括

call 方法

delegatecall()

send()與fallback():

keccak()

payable宣告的函式可以從呼叫者那裡接受ether,如果傳送方沒有提供ether,則呼叫可能會失敗。也就是說乙個函式宣告為payable,那麼就只能收取ether。

該函式和變數僅能內部訪問,或在繼承的合約中呼叫。是預設情況下的修飾符,不可加this關鍵字

與internal唯一的區別在於繼承的合約中不可以訪問。 私有函式並非合約介面的一部分

可以通過內部或者外部函式來呼叫。對於public型別的狀態變數,呼叫時會自動產生乙個訪問器。公開函式是合約介面的一部分。

外部函式是合約介面的一部分,可以從其他合約或者通過交易來發起呼叫。**乙個外部函式f不能通過內部的方式來發起呼叫,如f()不可以,但可以通過this.f()發起呼叫。**外部函式在接受大的資料時更加有效。

不能修改狀態變數,等同於constant函式。

pure不能讀寫狀態變數,pure函式宣告的函式自身不能訪問當前的狀態和交易變數。

該函式沒有能力改變區塊鏈上的狀態變數,但是可以讀取狀態變數並返回給呼叫者。

call()是乙個底層的介面,用來向乙個合約傳送訊息,也就是說如果你想實現自己的訊息傳遞,可以使用這個函式。

函式支援傳入任意型別的任意引數,並將引數打包成32位元組,相互拼接後向合約傳送這段資料。

簡單來說,就是根據位址呼叫指定合約的方法。

例如:c.call(bytes32(keccak256("eat()")),2);c是已經例項化後的變數,用來呼叫eat函式,將eat()函式經過keccak()變換後和引數拼接在一起,打包成32位元組,這樣我們就把2傳給另乙個合約的eat函式了。

注:如果向另乙個合約傳送資料時,找不到對應的方法簽名,會預設呼叫fallback()函式,所以我們可以通過這個fallback函式來看call()傳的具體資料。

如果第乙個引數剛好是四個位元組,會認為這四個位元組指定的是函式簽名的序號值,生成方式參見abi協議的函式選擇器。如果只是想傳個引數值,而不是想指定乙個函式序號,應避免第乙個引數剛好是四個位元組。

call()的返回結果是乙個**bool值**,表示是否成功的呼叫,或者是失敗引起了evm異常。該方法無法直接訪問函式返回結果(因為需事前知道編碼和返回結果大小)。

call()的返回結果即使成功,並不能說操作成功了,只是沒有出現異常,有可能呼叫到了fallback()函式。

calldelegatecall的功能類似,區別僅在於後者僅使用給定位址的**,其它資訊則使用當前合約(如儲存,餘額等等)。

函式的設計目的是為了使用儲存在另乙個合約的庫**

所以開發者在提供這樣的庫時,就要如何安排儲存來達到這樣的目的。

二者執行**的上下文環境的不同,當使用call呼叫其它合約的函式時,**是在被呼叫的合約的環境裡執行,對應的,使用delegatecall進行函式呼叫時**則是在呼叫函式的合約的環境裡執行。

例:

contract calltest 

}contract compare

function withdelegatecall(

)}

solidity中當簽名不匹配任何的函式方法時,將會觸發回退函式。比如,當你呼叫address.call(bytes4(bytes32(sha3("thisshouldbeafunction(uint,bytes32)"))), 1, "test")時,evm實際嘗試呼叫位址中的thisshouldbeafunction(),當這個函式不存在,會觸發fallback函式。

由於send()函式指定了乙個空函式簽名(也就是沒有函式名,沒有引數,形如function(){}這樣的),所以當fallback函式存在時,它總是會呼叫它。

下面是乙個例子(來自:

contract test 

uint x;

}contract caller

}

知識點:sha-3標準的單向雜湊函式演算法,可以生成任意長度的雜湊值

附加:keccak不僅可用於計算雜湊值,還可以覆蓋密碼學家工具箱中的其他多種用途,如偽隨機數生成器、流密碼、認證加密、訊息認證碼等。

C 基礎知識整理 基礎知識(2) 類

類,是物件導向語言的基礎。類的三大特性 封裝 繼承 多型。最基本的特性就是封裝性。程式設計師用程式描述世界,將世界的所有事物都看成物件,怎麼描述這個物件?那就是類了。也就是用類來封裝物件。用書上的話說,類是具有相同屬性和行為的物件的抽象。寶馬汽車 別克汽車 五菱之光汽車.基本具有相同的屬性和行為,所...

C 基礎知識整理 基礎知識(2) 類

類,是物件導向語言的基礎。類的三大特性 封裝 繼承 多型。最基本的特性就是封裝性。程式設計師用程式描述世界,將世界的所有事物都看成物件,怎麼描述這個物件?那就是類了。也就是用類來封裝物件。用書上的話說,類是具有相同屬性和行為的物件的抽象。寶馬汽車 別克汽車 五菱之光汽車.基本具有相同的屬性和行為,所...

電腦的基礎知識 電腦的基礎知識

電腦的組成部分與其作用 一 軟體系統 軟體系統的組成分別是 作業系統 應用軟體等。其應用軟體是指特定領域開發 並為特定目的服務的一類軟體。而作業系統是位於底層硬碟與使用者之間溝通的橋梁。使用者可以通過作業系統的使用者頁面,輸入命令,實現使用者需求。二 硬體系統 硬體系統是指構成計算機的物理裝置,即由...