智能合約簡單來講就是:部署在去中心化區(qū)塊鏈上的一個合約或者一組指令,當(dāng)這個合約或者這組指令被部署以后,它就不能被改變了,并會自動執(zhí)行,每個人都可以看到合約里面的條款。更深層次的理解就是:這些代碼會被去中心化地執(zhí)行,就像一群人運(yùn)行了某個軟件,這意味著沒有一個人或者一個主體可以修改這些合約或者更改條款。
1.智能合約行業(yè)應(yīng)用
DeFi:代表去中心化金融,它讓用戶可以參與到金融市場,而不需要經(jīng)過中心化中介。
比如Robinhood,你不需要再信任Robinhood會持續(xù)給你提供服務(wù),讓你接入市場,相反,你可以直接查看智能合約,對,這樣就可以進(jìn)入市場?;蛘咴?008年金融危機(jī),你再也不用相信,這些集團(tuán)和機(jī)構(gòu)會在后臺給你提供正確的信息,你在區(qū)塊鏈上就可以看到所有的東西,它們都是透明的。你可以簡單,安全和高效的參與很多事情,像是貨幣市場和復(fù)雜的金融產(chǎn)品,截止到2022年為止,有大概2000億美元的資產(chǎn)在DeFi中被管理,并且還在快速增長。
Dao:去中心化自治組織,是另一個應(yīng)用。Dao是完全被去中心化管理的組織,它們被區(qū)塊鏈上的一組指令或者一個智能合約管理,這樣的管理方式很有優(yōu)勢,參與更加簡單,規(guī)則黑白分明,并且你可以直接在鏈上看到所有的事情。投票和治理,使用的是完全去中心化的技術(shù),區(qū)塊鏈?zhǔn)悄軌蜃屛覀兺苿又卫砑夹g(shù)進(jìn)步的重要技術(shù)之一。它讓治理更加的高效,公平和合理。
NFT:即非同質(zhì)化代幣,它在某種程度是一種電子藝術(shù)品,或者是一個獨(dú)一無二的資產(chǎn)。像是無聊猿和加密朋克這樣的項(xiàng)目,革新了人們獲得報(bào)酬的方式,人們可以通過工作,展示創(chuàng)造性和狀態(tài)而獲得報(bào)酬
2.Remix介紹
Remix是一個強(qiáng)大的工具,因?yàn)樗泻芏喙δ?,幫助我們查看和交互智能合約,雖然我們會漸漸脫離Remix,使用本地開發(fā)環(huán)境,但是Remix對學(xué)習(xí)智能合約基礎(chǔ)非常有幫助,Remix官網(wǎng)。
當(dāng)你進(jìn)入Remix頁面,你會發(fā)現(xiàn)有很多東西,還有很多Plugin,因?yàn)槲覀円褂肧olidity,也就是智能合約的語言。
3.Solidity數(shù)據(jù)類型
Solidity有多種基礎(chǔ)數(shù)據(jù)類型,最基礎(chǔ)的四種數(shù)據(jù)類型是,boolean,uint,int和address。 還有數(shù)組(array)、結(jié)構(gòu)體(struct)和映射(mapping)或者還有bytes,它們是一種更底層的數(shù)據(jù)類型。
boolean定義true和false;
uint是無符號整數(shù),表示這個數(shù)字不是可正可負(fù),只能是正數(shù);uint比較特殊,我們可以決定給它分配的空間,這個數(shù)字一直可以大到uint256,uint默認(rèn)就是uint256。通常,把分配空間顯式的寫出來是一個好習(xí)慣。
int可以表示正數(shù)或負(fù)數(shù);同樣的,我們也可以決定分配給int變量的空間。
address表示地址,就像在MetaMask中看到的地址一樣。
具體在Remix定義的變量類型代碼如下所示:
// SPDX-License-Identifier: MIT
// 定義solidity的版本 此處允許0.8.8以上的版本,但不允許0.9.0以上的版本
pragma solidity ^0.8.8 <0.9.0;
contract SimpleStorage{
bool hasFavoriteNumber = false;
//uint允許分配的空間只能以byte的速度增長 uint8 uint16...uint256 最大只能到uint256
uint256 favoriteNumber = 123;
int64 favoriteInt = -5;
string favoriteNumberInText = "five";//string類型變量只允許存儲文本
address myAddress = 0x993CC624c1350D52cCbe32F77652362F82fc4D41;
}
4.Solidity函數(shù)
函數(shù)或者方法指的是獨(dú)立模塊,在我們調(diào)用的時候會執(zhí)行某些指令。Solidity中定義函數(shù)與JavaScript中類似,使用function關(guān)鍵字即可。
函數(shù)變量有四種可見度標(biāo)識符:
public:在外部和內(nèi)部都可見,任何與合約交互的人,都可以看到被public修飾的變量和函數(shù),給變量或函數(shù)加上public修飾符,實(shí)際上給給其創(chuàng)建了getter函數(shù),創(chuàng)建一個返回其值的函數(shù)。
private:private表示只有這個合約可以調(diào)用這個函數(shù),private表示只對合約內(nèi)部可見;
external:external表示只對合約外部可見
internal:internal表示只有這個合約或者繼承它的合約可以讀取
一般變量或函數(shù)的修飾符的默認(rèn)值是internal,表示只對本合約和繼承合約可見
另外,solidity中還有兩個關(guān)鍵字可以用來修飾函數(shù),標(biāo)識函數(shù)的調(diào)用不需要消耗gas,分別是view和pure,如果一個函數(shù)被view修飾,意味著我們只會讀取這個合約的狀態(tài)。被view修飾的函數(shù)不允許修改任何狀態(tài),你在其函數(shù)中不能修改任何狀態(tài),同理,pure函數(shù)也不允許修改狀態(tài),同時pure函數(shù)也不允許讀取區(qū)塊鏈數(shù)據(jù)。pure函數(shù)通常用于執(zhí)行數(shù)學(xué)運(yùn)算或其他不涉及狀態(tài)更改的計(jì)算。
具體關(guān)于函數(shù)實(shí)現(xiàn)的solidity代碼如下所示:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8 <0.9.0;
contract SimpleStorage{
//uint允許分配的空間只能以byte的速度增長 uint8 uint16...uint256 最大只能到uint256
uint256 public favoriteNumber = 123;//設(shè)置公開可見
function store(uint256 _favoriteNumber) public {
favoriteNumber = _favoriteNumber;
}
function getFavoriteNumber() public view returns(uint256){
return favoriteNumber;
}
function testPure() pure public returns(uint){
return (1+1);
}
}
5.Mapping映射
使用mapping映射比數(shù)組遍歷查找元素更加高效,可以達(dá)到O(1)級別,而數(shù)組遍歷是O(n)級別;
你可以簡單把映射想象成字典,它是一組鍵值對,每個key鍵返回與該鍵關(guān)聯(lián)的某個value值,我們創(chuàng)建一個映射變量的方式與創(chuàng)建其他所有變量的方式完全相同;具體如下所示:
mapping(string => uint256) public nameToFavoriteNumber
具體有關(guān)映射的定義以及添加元素的操作如下所示:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.8 <0.9.0;
contract SimpleStorage{
//uint允許分配的空間只能以byte的速度增長 uint8 uint16...uint256 最大只能到uint256
uint256 public favoriteNumber = 123;//設(shè)置公開可見
struct People{
string name;
uint256 favoriteNumber;
}//定義結(jié)構(gòu)體
//定義映射
mapping(string => uint256) public nameToFavoriteNumber;
People[] public people;//定義結(jié)構(gòu)體數(shù)組(存儲多個結(jié)構(gòu)體的數(shù)組)
function store(uint256 _favoriteNumber) public {
favoriteNumber = _favoriteNumber;
}
//這里被view修飾的函數(shù)調(diào)用不消耗gas 表示只讀函數(shù) 不修改或改變區(qū)塊鏈已有的狀態(tài)
function getFavoriteNumber() public view returns(uint256){
return favoriteNumber;
}
//定義添加數(shù)組元素的函數(shù)
function addPerson(string memory _name,uint _favoriteNumber) public{
//這里由于string底層數(shù)bytes數(shù)組,因?yàn)樾枰褂胢emory關(guān)鍵字
people.push(People(_name,_favoriteNumber));
nameToFavoriteNumber[_name] = _favoriteNumber;
}
}
這里需要注意,代碼里面有關(guān)于數(shù)組和結(jié)構(gòu)體的定義與實(shí)現(xiàn),由于其與Java和C++定義方式類似,這里讀者可以類比理解,所以并沒有做詳細(xì)闡述。
6.EVM介紹
前面我們通過solidity編寫的所有合約代碼,它都是在EVM(Ethereum Virtual Machine)上編譯的。
EVM(Ethereum Virtual Machine)就是往以太坊區(qū)塊鏈上部署智能合約的一個標(biāo)準(zhǔn),并且任何實(shí)現(xiàn)某種EVM的區(qū)塊鏈,你都可以把solidity代碼部署上,例如Avalanche,F(xiàn)antom,Polygon,它們都是與EVM兼容的,意思就是我們可以把編寫的solidity代碼部署到這些區(qū)塊鏈上。
回顧整個智能合約:
在智能合約中你要做的第一件事就是告訴solidity,你正在使用哪個版本的solidity,并且你得在首行添加// SPDX-License-Identifier: MIT,從而消除警告信息,接著你就要使用關(guān)鍵字contract創(chuàng)建你的合約對象并為它命名,solidity中的合約(contract)就類似與其他面向?qū)ο笳Z言中的class類,并且花括號{}內(nèi)的所有內(nèi)容都是該合約的組成部分。
solidity中有許多不同的數(shù)據(jù)類型,例如無符號整形uint,布爾值(boolean)、字符串(string)、字節(jié)(bytes32) 等等。如果你想創(chuàng)建一種新類型,可以創(chuàng)建一個所謂的結(jié)構(gòu)體(struct),也可以創(chuàng)建數(shù)組(array)或者說列表(list),也可以創(chuàng)建字典(dictionary)或者說映射(mapping),當(dāng)你給它一個鍵(key)時,它就會返回該鍵對應(yīng)的值(value)。我們還可以在solidity中創(chuàng)建函數(shù),以修改區(qū)塊鏈的狀態(tài),函數(shù)使用view和pure修飾便表示是不修改區(qū)塊鏈狀態(tài)的函數(shù),我們也可以在函數(shù)中指定不同的數(shù)據(jù)位置,calldata和memory的意思就是該數(shù)據(jù)只是臨時數(shù)據(jù),它們只在函數(shù)運(yùn)行期間存在,storage變量則是永久存在的,而函數(shù)參數(shù)由于是臨時變量因此不能使用storage變量,當(dāng)我們編寫好solidity代碼并在Remix點(diǎn)編譯(compile),它就會將代碼按照以太坊虛擬機(jī)的格式進(jìn)行編譯。
編寫好智能合約代碼后,在Remix可以直接使用快捷鍵Ctrl+S編譯,編譯成功后會在側(cè)邊欄出現(xiàn)一個綠色的小圖標(biāo),然后點(diǎn)擊側(cè)邊第四個圖標(biāo)進(jìn)入部署界面,首先選擇虛擬賬戶,因?yàn)槲覀兪遣渴鸬絉emix自帶的虛擬機(jī)中,然后設(shè)置gas limit限制,然后點(diǎn)擊部署按鈕即可,部署成功后便可以看到自動生成了一個合約賬戶,到此,你便完成了你的第一份智能合約。文章來源:http://www.zghlxwxcb.cn/news/detail-758555.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-758555.html
到了這里,關(guān)于在Remix中編寫你的第一份智能合約的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!