互助模式FDF循環(huán)游戲智能合約開(kāi)發(fā)系統(tǒng)技術(shù)
實(shí)現(xiàn)智能合約就需要“圖靈完備”的計(jì)算機(jī)編程語(yǔ)言?!皥D靈完備”這個(gè)詞大家似乎了解的不多,可以簡(jiǎn)單地理解為能把世間一切可以計(jì)算解決的問(wèn)題都計(jì)算出來(lái)的,這樣的一種虛擬機(jī)或者編程語(yǔ)言就叫圖靈完備。
智能合約之所以可以在以太坊上完美應(yīng)用,就是因?yàn)橐蕴辉谄鋮^(qū)塊鏈上提供了一種近乎圖靈完備的計(jì)算環(huán)境。只要是編程語(yǔ)言能夠?qū)崿F(xiàn)的計(jì)算,其都能支持,這也為智能合約在更加廣泛的環(huán)境中得以應(yīng)用堅(jiān)實(shí)了基礎(chǔ)。
對(duì)比智能合約和傳統(tǒng)合約,F(xiàn)DF循環(huán)互助系統(tǒng)13z開(kāi)4z77發(fā)z558,我們就能知道智能合約為什么會(huì)出現(xiàn)了。隨著科技的進(jìn)步,我們都會(huì)有一些通過(guò)雙方簽訂合同來(lái)約束彼此經(jīng)濟(jì)活動(dòng)的經(jīng)歷,但即使簽訂合同,我們也無(wú)法保證雙方都能在規(guī)定期限內(nèi)完整的履行合同規(guī)定的內(nèi)容。
傳統(tǒng)合約受到諸如主客觀、經(jīng)濟(jì)成本、適用范圍、執(zhí)行力度和執(zhí)行時(shí)間等因素的影響,而智能合約便可以在很大程度上解決這些因素的影響。智能合約的主要特點(diǎn)可以簡(jiǎn)單地概括為:去中心化、智能高效(自動(dòng)執(zhí)行、無(wú)人為干預(yù))、準(zhǔn)確、低成本。
眾所周知,區(qū)塊鏈最大的特質(zhì)就是去中心化,在不信任中創(chuàng)造出信任?;趨^(qū)塊鏈的智能合約是將合約以數(shù)字化的形式寫入到區(qū)塊鏈中,在區(qū)塊鏈優(yōu)秀特性的加持下自然的具備了去中心化的特點(diǎn),合約內(nèi)容公開(kāi)透明、條理清晰且不可篡改,編程語(yǔ)言就是規(guī)束合約的法律條文,交易雙方可完全放心的進(jìn)行交易。
智能合約的整個(gè)產(chǎn)生和執(zhí)行過(guò)程都是可追溯、不可篡改的。一旦觸發(fā)合約就會(huì)立即執(zhí)行,自動(dòng)按照合約規(guī)范進(jìn)行操作。整個(gè)過(guò)程智能高效,短時(shí)間快速完成更是體現(xiàn)了它的準(zhǔn)確和經(jīng)濟(jì)。
在solidity中合約之間的相互調(diào)用有兩種方式:
使用封裝的方式,將合約地址封裝成一個(gè)合約對(duì)象來(lái)調(diào)用它的函數(shù)
直接使用函數(shù)來(lái)調(diào)用其他合約
solidity提供了call()、delegatecall()、callcode()三個(gè)函數(shù)來(lái)實(shí)現(xiàn)合約直接的調(diào)用及交互,這些函數(shù)的濫用導(dǎo)致了各種安全風(fēng)險(xiǎn)和漏洞。在使用第二種方式時(shí),如果處理不當(dāng)很可能產(chǎn)生致命的漏洞——跨合約調(diào)用漏洞,主要就是call()注入函數(shù)導(dǎo)致的
call()函數(shù)對(duì)某個(gè)合約或者本地合約的某個(gè)方法的調(diào)用方式:
<address>.call(方法選擇器,arg1,arg2,...)
<address>.call(bytes)
通過(guò)傳遞參數(shù)的方式,將方法選擇器、參數(shù)進(jìn)行傳遞,也可以直接傳入一個(gè)字節(jié)數(shù)組(bytes要自己構(gòu)造)
舉一個(gè)簡(jiǎn)單的例子
contract sample_1{
function info(bytes data){
this.call(data);
}
function secret()public{
require(this==msg.sender);
//secret operations
}
}
合約的兩個(gè)函數(shù)中secret函數(shù)必須是合約自身調(diào)用的,然而有個(gè)info函數(shù),調(diào)用了call(),并且外界是可以直接控制call函數(shù)的字節(jié)數(shù)組的
this.call(bytes4(keccak256("secret()")));這樣就調(diào)用了secret
第二個(gè)例子
contract sample2{
...
function logAndCall(address _to,uint _value,bytes data,string _fallback){
...
assert(_to.call(bytes4(keccak256(_fallback)),msg.sender,_value,_data));
...
...
}
在logAndCall函數(shù)中,我們的_falback參數(shù)可以控制,所以我們可以控制_to的任何方法。另外assert有三個(gè)參數(shù),我們沒(méi)必要調(diào)用完全符合三個(gè)參數(shù)類型的合約,因?yàn)樵贓VM中,只要找到了方法需要的參數(shù),就會(huì)去執(zhí)行,其他參數(shù)就會(huì)被忽略,不會(huì)產(chǎn)生任何影響