日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 物聯(lián)網(wǎng) > 區(qū)塊鏈
[導讀] 1.智能合約的源起 區(qū)塊鏈技術(shù)自比特幣誕生之日起便受到了廣泛的關注。最初,區(qū)塊鏈僅僅作為記錄用戶交易的底層賬本,不支持用戶訂制其它功能。 比特幣為了實現(xiàn)交易,即用戶間轉(zhuǎn)賬的功能,

1.智能合約的源起

區(qū)塊鏈技術(shù)自比特幣誕生之日起便受到了廣泛的關注。最初,區(qū)塊鏈僅僅作為記錄用戶交易的底層賬本,不支持用戶訂制其它功能。

比特幣為了實現(xiàn)交易,即用戶間轉(zhuǎn)賬的功能,設計了一套基于棧的簡單腳本語言。這套語言不支持循環(huán),不具備圖靈完備性,僅限于比特幣客戶端內(nèi)部使用,且只圍繞交易這一項功能,一般被稱之為“Bitcoin Script”。

如果大家去查看比特幣區(qū)塊鏈中的每一筆交易記錄,那么會發(fā)現(xiàn)交易內(nèi)容其實是一串字節(jié)碼,這串字節(jié)碼就是Bitcoin Script。比特幣對Bitcoin Script書寫的交易代碼的格式進行了限制,這種做法保證了交易的合法性與資金的安全性,但犧牲了整個系統(tǒng)的可編程性與靈活性。

一般情況下,一套語言能實現(xiàn)成千上萬種功能,如果設計一套語言只是實現(xiàn)了一個功能,未免有些可惜?;蛟SVitalik Buterin正是發(fā)現(xiàn)了區(qū)塊鏈中腳本語言的可能性,于是他在以太坊中把語言請到了舞臺中央,供用戶創(chuàng)建與調(diào)用,這也成為了以太坊最具魅力的特性——智能合約。

與比特幣的Bitcoin Script對應,以坊中腳本語言名字叫EVM語言(Ethereum Virtual Machine Code)。EVM語言也是基于棧的語言,但它是圖靈完備的語言,且以太坊設計了專門的虛擬機EVM來為其提供運行環(huán)境,這和Bitcoin Script有明顯的區(qū)別。

2.智能合約的使用以交易為接口

為了明確系統(tǒng)的功能,以太坊擴充了交易的概念。在比特幣中,交易一般指用戶之間的轉(zhuǎn)賬操作,在以太坊中,交易除了轉(zhuǎn)賬,還包括創(chuàng)建或者調(diào)用智能合約。因此可以說EVM語言也是為了交易而存在,但它服務的交易的內(nèi)容廣泛得多。

我們先補充一些必要的概念。以太坊中賬戶分為外部賬戶與合約賬戶,外部賬戶就是用戶使用的賬戶,其中包括了用戶的私鑰和錢包等重要信息;合約賬戶用來存放一個智能合約,通常是由外部賬戶創(chuàng)建的。

用戶發(fā)送到以太坊區(qū)塊鏈上的每一筆交易中都包含幾個關鍵字段:“from”表示交易發(fā)起者,“to”表示交易接收者,“value”表示交易金額,“data”表示附帶的信息。

上文提及的三種操作的交易格式如下:

1) 普通轉(zhuǎn)賬操作:“from A, to B, value C”表示從外部賬戶A向外部賬戶B轉(zhuǎn)賬,轉(zhuǎn)賬金額為C;

2) 智能合約創(chuàng)建操作:“from A, to (空), value C, data D”表示外部賬戶A創(chuàng)建一個智能合約,向該合約賬戶里轉(zhuǎn)賬C, 合約的代碼為D;

3) 智能合約調(diào)用操作:“from A, to E, data F”表示外部賬戶A調(diào)用合約賬戶E的智能合約,本次調(diào)用傳入的參數(shù)為F。

3一筆交易的處理流程

下面我們來分析一筆交易在以太坊區(qū)塊鏈中是如何被處理與執(zhí)行的。

這部分在以太坊的源碼中十分清晰,因此我們跟隨源碼里的函數(shù)調(diào)用流程來進行說明。以太坊Go版本源碼地址:https://github.com/ethereum/go-ethereum。

首先先定位,我們可以從core/blockchain.go中找到執(zhí)行的core/state_processor.go中Process()方法,在Process()方法中可以找到如下一行代碼:

receipt, _,err:= ApplyTransaction(p.config, p.bc, nil, gp, statedb, header, tx, usedGas, cfg)

根據(jù)這個函數(shù)名字我們知道已經(jīng)找到了執(zhí)行交易的入口。

3.1 創(chuàng)建EVM虛擬機

瀏覽在core/state_processor.go中的ApplyTransacTIon()方法,可發(fā)現(xiàn)如下三行關鍵代碼:

context := NewEVMContext(msg, header, bc, author)

vmenv := vm.NewEVM(context, statedb, config, cfg)

_, gas, failed, err := ApplyMessage(vmenv, msg, gp)

第一行是創(chuàng)建新的EVM的執(zhí)行上下文環(huán)境,第二行是創(chuàng)建新的EVM,第三行是用新創(chuàng)建的EVM來處理交易消息。由此可知,每一筆交易在執(zhí)行之前以太坊都會創(chuàng)建一個EVM虛擬機來負責該交易的執(zhí)行。

繼續(xù)瀏覽core/state_transiTIon.go中的ApplyMessage()方法,發(fā)現(xiàn)該方法只有一行代碼:

return NewStateTransiTIon(evm, msg, gp).TransiTIonDb()

繼續(xù)看core/state_transition.go中的TransitionDb()方法,發(fā)現(xiàn)方法中有一個重要的分支:

if contractCreation {

ret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, st.value)

} else {

st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)

ret, st.gas, vmerr = evm.Call(sender, st.to(), st.data, st.gas, st.value)

}

這段代碼的意思是先判斷是不是創(chuàng)建合約的操作,如果是,則調(diào)用Create()方法,如果不是,則調(diào)用Call()方法。由此可知,交易的三種操作中,創(chuàng)建合約使用的方法是Create(),而調(diào)用合約與轉(zhuǎn)賬使用的方法是Call()。

接下來我們分別看一下這兩個方法。

3.2 智能合約的創(chuàng)建

先看core/vm/evm.go中的Create()方法。該方法只有兩行代碼:

contractAddr=crypto.CreateAddress(caller.Address(),evm.StateDB.GetNonce(caller.Address()))

return evm.create(caller, &codeAndHash{code: code}, gas, value, contractAddr)

第一行是根據(jù)外部賬戶的地址和nonce值計算將要創(chuàng)建的合約賬戶的地址,這個nonce參數(shù)用來記錄該外部賬戶已創(chuàng)建的合約的數(shù)目。

第二行是將創(chuàng)建的合約賬戶地址和其它參數(shù)一起傳給同文件中的create()方法。

繼續(xù)看create()方法可看到如下三行代碼:

nonce := evm.StateDB.GetNonce(caller.Address())

evm.StateDB.SetNonce(caller.Address(), nonce+1)

contractHash := evm.StateDB.GetCodeHash(contractAddr)

第一行是獲取想創(chuàng)建合約的外部賬戶的nonce值。

第二行是將該nonce的值加一后寫回去,第三行是計算合約地址的哈希值確保不會發(fā)生地址沖突。

在計算出合約地址后,可看到下面一行代碼:

evm.StateDB.CreateAccount(contractAddr)

這行代碼是根據(jù)合約地址創(chuàng)建出了合約賬戶。合約賬戶創(chuàng)建完后,可看到下面一行代碼:

evm.Transfer(evm.StateDB, caller.Address(), contractAddr, value)

創(chuàng)建者從外部賬戶向合約賬戶轉(zhuǎn)賬,金額為value。至此,合約賬戶創(chuàng)建工作完成了。

接下來需要創(chuàng)建合約對象并把合約代碼跑起來:

contract:=NewContract(caller, AccountRef(contractAddr), value, gas) contract.SetCallCode(&contractAddr, crypto.Keccak256Hash(code), code)

第一行是創(chuàng)建合約對象,第二行是將用戶定義的智能合約代碼綁定到該合約對象上。

合約對象創(chuàng)建完后,用下面一行代碼運行該合約:

ret, err = run(evm, contract, nil)

可能有人會疑惑:創(chuàng)建完合約為什么要運行一遍?

這主要有兩方面的原因:其一,系統(tǒng)需保證合約代碼是能正確運行的,這樣在以后的調(diào)用中才不會出錯;其二,系統(tǒng)需要通過運行才能計算出消耗的gas數(shù)量,進而完成對外部賬戶的創(chuàng)建合約操作的扣費。其實在create()方法中還有檢查棧深度、創(chuàng)建快照、出錯后回滾、gas計算等代碼,因它們不涉及到本文的主要內(nèi)容,故略過。

3.3 轉(zhuǎn)賬與智能合約的調(diào)用

然后我們看core/vm/evm.go中的Call()方法,該方法負責合約調(diào)用和轉(zhuǎn)賬兩種交易操作。

Call()方法中不需要創(chuàng)建新的地址,只需要:

to = AccountRef(addr)

該行代碼獲取交易接收方的地址。之后可看到下面一行代碼:

evm.Transfer(evm.StateDB, caller.Address(), to.Address(), value)

交易發(fā)起者向交易接收方轉(zhuǎn)賬value金額。接下來的代碼和Create()相像:

contract := NewContract(caller, to, value, gas)

contract.SetCallCode(&addr,evm.StateDB.GetCodeHash(addr),evm.StateDB.GetCode(addr))

第一行創(chuàng)建合約對象,第二行將接收者地址上的智能合約代碼綁定到合約對象上。如果是轉(zhuǎn)賬操作,接收者地址上沒有代碼,因此綁定的代碼是空,之后的運行會很快結(jié)束。綁定完成后,使用run()方法運行該合約完成調(diào)用:

ret, err = run(evm, contract, input)

在Call()方法中同樣還有檢查棧深度、創(chuàng)建快照、出錯會滾、gas計算等代碼,留給感興趣的讀者自行閱讀。

Create()與Call()中最后執(zhí)行都調(diào)用了core/vm/evm.go中的run()方法,而run()方法中可發(fā)現(xiàn):

return interpreter.Run(contract, input, readOnly)

接下來定位到core/vm/interpreter.go中的Run()方法。該方法是EVM中解釋器的運行流程,核心邏輯為循環(huán)取出合約的代碼,查表解析出具體的操作碼,再查表計算出需要消耗的gas數(shù)目,然后調(diào)用操作碼相應的處理函數(shù)執(zhí)行。

核心代碼如下:

for atomic.LoadInt32(&in.evm.abort) == 0 {

op = contract.GetOp(pc)

operation := in.cfg.JumpTable[op]

cost, err = operation.gasCost(in.gasTable, in.evm, contract, stack, mem, memorySize)

res, err := operation.execute(&pc, in, contract, mem, stack)

}

至此,一筆交易的運行就結(jié)束了。

4. 結(jié)語

綜上所述,我們能了解到以太坊設計的三種交易背后能給予用戶極大的自由度,也充分發(fā)揮了EVM語言及其虛擬機的功能。

用戶通過Solidity等語言編寫智能合約,然后編譯成EVM語言,再打包成交易的格式發(fā)送到區(qū)塊鏈上運行。以太坊得益于這種模式帶來的可編程的特性,引領區(qū)塊鏈技術(shù)進入了2.0時代。

然而,現(xiàn)在智能合約由于EVM的棧深度與gas消耗的限制,多數(shù)都是簡單且袖珍的程序。即使現(xiàn)在這樣的程序已經(jīng)足夠滿足需求,但未來必將面臨更多更加復雜化的交易場景。

如何去應對這些場景,需要廣大開發(fā)者們繼續(xù)努力。

本站聲明: 本文章由作者或相關機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉