首先,讓我們先搞清楚,什麼是智能合約?又為什麼會出現這個東西呢?
以太坊官方文件對於智能合約的定義為:
"It's a collection of code (its function) and data(its state) that resides at a specific address on the Ethereum blockchain."
意思大概就是,智能合約其實就是存在一個以太坊地址上的程式碼集合,裡面會寫這份「合約」的邏輯(function)和狀態(state),而智能合約特殊的點是他是一個自動化的程式,一但部署在了區塊鏈之中,就不能再作更動,而且會在滿足條件時自動執行,不需要經由任何第三方機構介入,這會帶來什麼好處呢?最明顯的就是,不用在繳交手續費,中心化交易所的盈利有一部分便是來自使用者交易時抽取的手續費,因此當我們在區塊鏈(去中心化)上交易,就可以不用花費多餘的手續費;而優點其二,便是提高交易效率,不需要再經過多層次的審核和批准,這常常導致合約形成的過程極其緩慢,因此當我們使用智能合約時,只需要滿足條件就可以自動觸發,顯然會替使用者們節省極大的時間;優點三,智能合約其實是相當公開透明的,有些智能合約會將程式碼開源,也就是公布在區塊鏈或交易平台的contract分頁之中,這麼做的好處是可以讓使用者們了解交易的邏輯和資訊,也可以透過社群的能力檢查是否有漏洞;當然,有些智能合約也是不會開源出來的,是為了保護其中的關鍵原理和邏輯,不過也有可能是一些套利程式,隱藏一些惡意漏洞在其中,因此在進行交易前也是需要稍微檢查合約的;而優點其四,也會和為什麼會出現「智能合約」這個東西有關。
在區塊鏈這項技術剛發行出來的時候,因為區塊鏈具有「交換價值」,任何人都能寫出一份願景極大的白皮書以此吸引募資,白話文就是,有人會畫一份大餅以此騙取投資人的資金,一但吸收夠了就捲款跑路,可想而知,當時的虛擬貨幣市場被這群人搞得烏煙瘴氣,最後那些願景極大的白皮書也化為泡沫,不了了之;因此這時候,「智能合約」便出現了,主旨是「一手交錢一手交貨」,保障了投資人和企劃者間的承諾,如果沒有智能合約,企劃者在接收投資之後可以不按約定給予投資人相應的貨幣,在區塊鏈上也沒辦法強迫他人執行動作,因此智能合約確保了兩者之間的約定,也因爲其公開透性性,所以每個人都可以確認交易的邏輯,也就能更好地作出投資決斷,而關於智能合約的另一個好處,就是其「可組合性」,也就是說一個智能合約可以包含另一項智能合約的邏輯,有點遞迴的概念,一個程式包含了另一個程式,因此這也讓智能合約可以重複使用,才能將複雜的金融概念在智能合約中譜寫出來。
來看由Solidity語言所寫的智能合約
pragma solidity ^0.8.0;
contract SimpleStorage{
uint256 private storedData;
function set(uint 256_data) public{
stroedData = _data;
}
function get() public view returns (uint256){
return storedData;
}
}
好的,讓我們來看這是什麼意思:
//SPDX-License-identifier: MIT
這是在註解說智能合約是用的授權條碼,其中 SPDX 是一個標準,用於在程式碼中標示許可證,方便於自動化處理,減少許可證合規性檢查的複雜度;而 License-identifier用來告知授權類型;MIT就是代表MIT授權,是一個非常寬鬆和自由的許可證。
pragma solidity ^0.8.0;
這則是代表要編譯此智能合約所需的最低Solidity版本。
contract SimpleStorage
宣告一個名為SimpleStorage的合約。
uint256 private storedData;
宣告一個變數storedData,是一個256bit 的unsigned integer(只能表示正數或0),而private則表示外界無法直接讀到此storedData的值,除非透過合約裡的get function。
function set(uint 256_data) public{
stroedData = _data;
}
宣告一個可以設定(set)storedData的程式,需要接收一個也是256-bits unsigned integer 的_data的變數,然後將_data的值賦予storedData。
function get() public view returns (uint256){
return storedData;
}
這裡宣告一個名為get的程式,會回傳(return)一個uint256的資料,並且只能檢視(view),不能做修改,也就是說這個get function會把set function設定好的storedData的值回傳出去。
以上就是今日份的內容,程式碼的解釋可能會看得有點吃力,實在不好意思Q_Q。
ref>Web3 專業開發者教你如何守護數位資產