, ,

Solidity教學第1集,智能合約、Remix、儲存與檢驗、ETH

Solidity教學

Solidity教學第一集,智能合約、Remix、儲存與檢驗、ETH

區塊鏈的應用日趨廣泛,智能合約現階段也在金融、供應鏈等領域快速發展,讓許多流程高效率自動化,同時資安管控品質也大幅提升。以下將會有五篇教學文章,讓有或沒有程式背景的讀者都能先撰寫基礎智能合約,以便繼續深造或參與區塊鏈相關項目之商業開發案時能順利溝通。

Solidity是以太坊上編寫智能合約的主要程式語言。它是一種契約編寫的程式語言,也就是說,智能合約可以儲存、交易與編寫在區塊鏈上。     Solidity與JavaScript、Python和C ++類似,都是有一定難度的程式語言,它是被用來在Ethereum Virtual Machine(EVM)上運行,且會儲存在各個全節點上面,並在上面運行,簡而言之,學會Solidity就足夠讓我們在區塊鏈網絡上建立一個智能合約與應用。

Remix介面
【REMIX介面】
  1. 我們首先要用 Remix 來打程式碼。那什麼是Remix? Remix 是用來編寫Solidity 的Web IDE,也就是瀏覽器的開發環境,可以用來儲存、編譯我們所寫的程式碼、智能合約等,當然還有很多其他很好用的功能這邊就不多贅述,所以我們使用Remix當做這次開發智能合約的開發環境。【教學完會提供完整程式碼提供對照】
  2. 請大家開啟一個新的標籤頁或視窗,打開Remix,以便跟上這次的教學。(Remix鏈結)
  3. 在Remix頁面中的左手邊,點擊browser旁加號,可以打開一個新的文件夾來編寫Solidity。
Solidity教學
【開新檔取名MyContract (可自訂)】
  1. 接著我們開啟一個新的資夾命名為「MyContract.sol」。
  2. 在程式碼的第一行當中,我們要先寫下要使用的Solidity的版本,因為Soldility會隨著時間而更新裡面的工具,儘管主要內容不變,但大家還是要注意看看版本為何。

pragma solidity ^0.4.24;

  1. 接著我們宣稱智能合約如下 :

pragma solidity ^0.4.24;
contract MyContract {
  // …
}

這邊要先解釋幾件事情,以便後的執行。

  • 智能合約是在以太坊區塊鏈上執行的一段程式碼
  • 以太坊區塊鏈上的程式碼都是公開且開源的,也就是說任何人都可以查看你在智能合約裡的程式碼,同樣地,你也可以查詢其他人的程式碼
  1. 接著我們希望可以編寫一個可以「儲存」的程式碼而這段程式碼的功能可以「儲存」及「檢驗」。
  2. 為了在Solidity裡面要做到可以「儲存」及「檢驗」,我們先將一個變數命名為value。因為Solidity是一個靜態程式語言,在宣稱變數之前,所以要先指定資料型態如下(ex. string為字串意思,指定資料為文字型態時用):

pragma solidity ^0.4.24; 
contract MyContract { 
    string value;
}

  1. 這個變數是一個「儲存變數」,它會將數據儲存到區塊鏈當中,只要我們給定一個數值、數據,它就會儲存到區塊鏈當中。

*數值是會儲存到儲存空間當中,而不是記憶體。

*整個智能合約都可以訪問這個變數,並解改變裡面得數值,然而有些變數只能被部分的訪問函數裡面的值,而且無法直接更動裡面的值。

  1. 接著,建立一個函數以從存儲的數據中讀取該值。我們首先使用一個名為「get()」的函數:

function get() {
    // …
}

  1. 現在,將使用”return”將儲存變量返回值,return就像是把我們剛剛所儲存的變數吐出來,所以當我們需要取得剛剛的值時就會乎叫get函數,如下圖所示:

function get() { 
    return value;
}

  1. 我們將此功能的「能見度」設置為公開,以便連接到區塊鏈的任何人都可以呼叫它(不僅僅是從智能合約程式碼本身內)

function get() public view
    return value;
}

  1. 最後,我們將為函數指定返回數值字串:

function get() public view returns(string)
    return value;
}

這樣我們就可以從智能合約能取數值。

  1.  這邊先介紹從智能合約外部變更數值的方法。我們將創建一個set函數,如下所示:

function set(string _value) public {
 // …
}

  1. 我們建立一個可以接受字串類型參數的函數。而且該功能也是公開的,因此連接到區塊鏈的任何人都可以呼叫它。現在,讓我們實際更改智能合約的數值,如下所示:

function set(string _value) public {
 value = _value;
}

  1. 我們設置一個數值給儲存變數。底線開頭表示為一個局部變數,在很多語言當中,包函Solidity都是如此表示
  2. 我們可以先設置一個預設值給我們設定的儲存變數。操作如下:

constructor() public { 
    value = “myValue”;
}

  1. 我們先使宣稱Constructor這個函數。每當我們部署智能合約時,它只能運行一次且公開可信的。
  2. 以上我們就完成了一個程式碼。完整的程式碼如下,小心順序以及邏輯,新手要注意括弧的位置。

pragma solidity ^0.4.24;

contract MyContract {
        string value;
        constructor() public {
                value = “myValue”;
        }

function get() public view returns(string) {
                return value;
        }

function set(string _value) public {
        value = _value;
        }
}

程式碼
【完整程式碼】

再來,我們要編譯和部署此智能合約。首先,在瀏覽器的左側點開下面的插頭符號。並搜尋compiler以及run並點選Activate啟用這兩個插件(上圖)

Solidity教學
Solidity教學
【兩個插件安裝】

,啟用後就會多出下面兩個符號

Solidity教學
Solidity教學
【顯示Deactivate代表已安裝未來可卸除】

接著,點擊左方的循環圖示,選擇版本0.4.25來編譯代碼(版本會不斷更新,不同版本會有些微差異),記得勾選「Auto Compile」並點擊藍色按鍵「Compile」。

Solidity教學
【確認版本與編譯合約】

再來,讓我們選擇測試環境,選取左列清單第三個。我們選擇JavaScript虛擬機,因為它可以在瀏覽器中提供一個模擬的區塊鏈,也就是類似將智能合約部署後的樣子。

Solidity教學
【Deploy部署合約】

那為什麼不直接部署呢?因為部署到真正的區塊鏈上要花費以太幣,也需要時間等候,而Remix給予我們一個較快速且模擬部署後的樣子。這也是我們選擇Remix的原因。

只要點擊按鈕即可部署智能合約!!

Solidity教學

部署完成後,要如何與智能合約進行互動呢?

我們可以呼叫智能合約裡面的函數,而這些函數在Remix中的介面中已經產生好給我們了,如下圖 :

點擊get()。可以看到在函數中設置的預設值“ myValue”

Solidity教學

我們使用set()更新值。在表格當中添加一個新值,只需確保將其用引號引起來即可,例如:“New Value”。因為這樣才可以表示他是一個字串,接著運行它!智能合約會讀取該值並更改為“New Value”

Solidity教學
Solidity教學
  • 在編譯器的下方為交易紀錄,這是虛擬區塊鏈上所有交易的完整列表。
  • 因為區塊鏈是由區塊所記錄與組成,而些記錄被“鏈”在一起,以成為公開式帳本。
  • 區塊鏈的基本單位為交易,可以點擊箭頭向下查詢更多詳細的交易

以上我們就完成一個以太坊的智能合約,在下一個階段我們會用以上剛寫完的智能合約程式碼為基礎再進行下一步的教學。

台灣區塊鏈協會證照專班  (企業內訓、個人進修、就業輔導、活動邀約等)

CBA亞洲區塊鏈學院

亞洲區系統技術開發商  ( 智慧生產系統、網站建置、智能合約、區塊鏈技術等)

巴克夏夫科技股份有限公司