solidity[1]-HelloWorld
solidity介紹
以太坊擁有多種高階語言,可用於編寫智慧合約,每種語言都受到另一種廣泛使用的語言的啟發。最流行的一種叫做Solidity
,它基於JavaScript
。由於Solidity
是迄今為止最成熟的以太坊語言,因此它是社群大力鼓勵開發人員現在使用的語言。
Solidity與其它語言相關的特點?
它的語法接近於Javascript,是一種面向物件的語言。但作為一種真正意義上執行在網路上的去中心合約,它又有很多的不同,下面列舉一些?:
- 以太坊底層是基於帳戶,而非UTXO的,所以有一個特殊的Address的型別。用於定位使用者,定位合約,定位合約的程式碼(合約本身也是一個帳戶)。
- 由於語言內嵌框架是支援支付的,所以提供了一些關鍵字,如payable,可以在語言層面直接支援支付,而且超級簡單。
- 儲存是使用網路上的區塊鏈,資料的每一個狀態都可以永久儲存,所以需要確定變數使用記憶體,還是區塊鏈。
- 執行環境是在去中心化的網路上,會比較強調合約或函式執行的呼叫的方式。因為原來一個簡單的函式呼叫變為了一個網路上的節點中的程式碼執行,分散式的感覺。
- 最後一個非常大的不同則是它的異常機制,一旦出現異常,所有的執行都將會被回撤,這主要是為了保證合約執行的原子性,以避免中間狀態出現的資料不一致。
由於在本地計算機上開始使用Solidity有點複雜,因此我們將使用名為Remix的線上IDE 作為DApp程式設計師的第一步。線上remix編譯器
Solidity是一種智慧合約高階語言,執行在Ethereum虛擬機器(EVM)之上。
如果你第一次進入這個網站,你會看到有一個名為ballot.sol的虛擬合約。讓我們忽略這一點,而是從頭開始,在左側導航選單中建立一個名為HelloWorld.sol的新檔案。
現在我們有一個完全空白的檔案,讓我們來看看Solidity的工作原理。 我們需要指定的第一件事是我們的程式應該解釋為什麼版本的Solidity。這是通過第一行的版本編譯指示完成的:
1 |
pragma solidity ^0.4.0; |
此行意味著我們正在阻止我們的程式被一個比0.4.0更老的編譯器編譯 ^表示向上相容,但是不能夠被0.5.0及其以上的編譯器編譯。我們這樣做是為了儘量減少程式碼以意想不到或不相容的方式編譯時可能發生的錯誤的風險。接下來,是時候編寫實際的合同程式碼了!我們通過使用宣告新合同的特殊關鍵字contract來做到這一點。如果你習慣了面向物件的語言,你會注意到它和類的定義類似。
1 2 3 4 |
pragma solidity ^0.4.0; contract HelloWorld { //從這裡放置合約程式碼 } |
合約名字是隨意指定的,為了當前的目的相契合,我們命名為HellowWorld,在合約內部,我們新增一個狀態變數,用字串來儲存一串漢字,我們將變數名定義為firstTest,
1 2 3 4 |
contract HelloWorld { // 放置你喜歡的字串 string myName = "jonson"; } |
請注意,Solidity是靜態型別的,因此在為其分配值之前,您總是需要定義變數的型別。所有型別的列表可以在Solidity的文件中找到。 最後,我們希望能夠通過呼叫函式從我們的合約中查詢出這個值。我們將呼叫這個函式getIt:
1 2 3 4 5 6 7 |
contract HelloWorld { string firstTest = "jonson"; //新增函式: function getIt() returns(string) { return firstTest; } } |
請注意,我們需要在Solidity中指定函式的返回值。由於在這種情況下我們只是返回myName字串,所以我們編寫了returns (string)
解決編譯器警告
如果您一直沿用這種方式並將程式碼放在Remix中,那麼您可能已經注意到視窗右側存在一些警告。 ?
如果勾上了右側的自動編譯,每當你改變程式碼中的某些東西時,Remix就會自動嘗試編譯它。紅色欄位表示程式碼編譯失敗(由於語法錯誤),黃色欄位表示編譯時有一些警告。 第一個警告告訴我們,我們函式的可見性沒有被指定(因此預設為“public”)。以太坊實際上有4種可見度型別:
- public:任何人都可以呼叫該函式,包括DApp的使用者。
- private:只有合約本身可以呼叫該函式(在另一個函式中)。
- internal:只有這份合同以及由此產生的所有合同才能稱之為合同。
- external:只有外部可以呼叫該函式,而合約內部不能呼叫。
根據經驗,public 與 private 是最常用的型別。 由於我們現在只是在測試,所以我們不介意將函式的可見性設定為public。請注意,儘管Solidity設定為public,但始終明確指定函式的可見性被認為是一種良好習慣,以避免潛在的災難性疏忽。
1 2 3 4 |
//在函式名稱後加上public修飾符 function getIt() public returns(string) { return firstTest; } |
這樣做後,只剩下一個警告。這一個很難理解:
1 |
Warning: Function state mutability can be restricted to view |
編譯器真正在說的是它檢測到我們的函式從不改變區塊鏈上的任何狀態變數 -而僅僅讀取。因此,我們可以使用view修飾符來使其更加清晰:
1 2 3 4 |
//在public後新增view function getIt() public view returns(string) { return firstTest; } |
當一個函式有一個“view”修飾符時,你不需要花費任何gas來呼叫它們(即使它們使用了消耗氣體的操作),因為不需要進行事務處理。它們基本上是“免費使用”的。 有3種內建的函式修飾符會影響花費gas的量:
- view: 可以自由呼叫,因為它只是“檢視”區塊鏈的狀態而不改變它
- pure: 也可以自由呼叫,既不讀取也不寫入區塊鏈
- payable:常常用於將代幣傳送給合約地址。
災難總是接踵而至,這正是世間的常理。你以為只要哭訴一下,就會有誰來救你嗎?如果失敗了,就只能說明我不過是如此程度的男人。