分享實錄|區塊鏈技術與智能合約入門(開發實例)

1

什么是區塊鏈

1.1白話講解區塊鏈

現在區塊鏈特別火,可能大家都聽說過區塊鏈,聽說過比特幣,那到底什么是區塊鏈?

前幾天和一個朋友擼串,我給他安利區塊鏈和比特幣以及一些數字貨幣的知識,這個朋友也是一個技術人,他問了我一句:你說了半天區塊鏈、數字貨幣,我是做技術的能聽懂,但是別人就不一定了,所以除了這些技術名詞以外,你能不能通俗地介紹一下什么是區塊鏈。

當時一下就把我問住了,百度搜索出來的一個官方答案是:區塊鏈是分布式數據存儲、點對點傳輸、共識機制、加密算法等計算機技術的新型應用模式 。看完這句話之后,相信大部分人還是不能完全理解。

那么,我用大白話重新解釋一下“什么是區塊鏈”。區塊鏈就是人人參與的、不需要中介的、帶有獎勵機制的一種記賬方式。因為人人都有這個賬本的備份,每筆賬具有連續性,所以不會作假,公開透明。并且不會有一家獨大的情況存在,因為需要大家達成共識后才會記這筆帳。

舉個例子來幫助理解。

比如有一個村子,村民老孫找老李借一百塊錢,但老李怕他賴賬,于是就找來村長做公證,并記下這筆賬。這個就叫中心化。但如果你不找村長,直接拿個喇叭在村里大喊“我老李借給老孫一百塊錢!請大家記在賬本里”,然后大家過來驗證過確實有這么回事,于是記到了賬本上,就叫去中心化。

以前村長德高望重,掌握全村的賬本,大家都把錢存在他這里,這是過去大家對中心化的信任。現在,大家都擔心村長會偷偷挪用大家的錢,怎么辦呢?于是大家就給每個人都發了一本賬本,任何人之間轉賬都通過大喇叭發布消息,收到消息后,每個人都在自家的賬本上記下這筆交易,這就是去中心化。有了分布式賬本,即使老張或老李家的賬本丟了也沒關系,因為老趙、老馬等其他家都有賬本。

后來,村民覺得每個人都記太麻煩了,可以每天輪流換人來記,誰來干這個活給誰一定的獎勵。這樣大家都搶著來記于是大家約定,誰搖骰子先搖到6了,就可以來記,但是記帳的格式有要求,后一筆帳的開頭必須帶上前一筆帳的一個標識,這樣防止作假帳,并且記完帳要向大家公布出來,讓大家能公開的查賬。

這個村子自從采用了這種新的記賬方式以后,每個人都很開心,不用擔心假賬、賴賬的事情發生,記賬還能拿到獎勵,于是周圍的村子也紛紛效仿這種方式。

其實區塊鏈技術沒有想象中的那么神秘,它的運行方式和運行原理就像例子中所說的村里的記賬方式。我們通過這個例子,可以比較生動地理解區塊鏈本身的運轉模式。

2.2 比特幣和區塊鏈的關系

說到區塊鏈就必然會提到比特幣,從去年開始,比特幣一路飆升,連帶其它數字加密貨幣一起火爆起來,使得數字加密貨幣市場風頭一度蓋過股票、外匯、黃金等市場。那么比特幣又是什么呢?區塊鏈和比特幣之間有什么關系呢?其實比特幣就是世界上第一個使用區塊鏈技術的應用。

2008年的金融危機幾乎席卷了整個世界,2008年年底,一個叫中本聰的人發表了一篇論文**《比特幣:一種點對點的電子現金系統》,他通過這篇論文闡述了一些觀點以及對金融危機后的思考。這篇論文主要提出了一個系統設計:**

通過隨機散列(hashing)對全部交易加上時間戳(timestamps),將它們合并入一個不斷延伸的基于隨機散列的工作量證明(proof-of-work)的鏈條作為交易記錄,除非重新完成全部的工作量證明,形成的交易記錄將不可更改。最長的鏈條不僅將作為被觀察到的事件序列(sequence)的證明,而且被看做是來自CPU計算能力最大的池(pool)。只要大多數的CPU計算能力都沒有打算合作起來對全網進行攻擊,那么誠實的節點將會生成最長的、超過攻擊者的鏈條。

(也就是說如果想要攻擊,必須掌握超過半數以上也就是51%的節點的算力,就是我們常說的51%攻擊,要做到是非常難的,攻擊的成本遠大于攻擊帶來的收益。)

這個系統本身需要的基礎設施非常少。信息盡最大努力在全網傳播即可,節點(nodes)可以隨時離開和重新加入網絡,并將最長的工作量證明鏈條作為在該節點離線期間發生的交易的證明。

這個系統有一個非常完善的經營模型來確保系統的正常運轉以及不受黑客攻擊。

比特幣的數據結構

從圖上來看,一個區塊是由區塊頭和區塊體構成的,區塊頭中有前一個區塊頭的哈希值和梅克爾根,每個區塊頭中的梅克爾根關聯了區塊中眾多的交易事務,而每個區塊之間又是通過區塊頭的哈希值也就是它的散列值關聯起來的。

可以看出來這是很有意思的數據格式,它將連續不斷發生的數據分成了一個個的數據塊,在下載同步這些數據的時候可以并行地從各個節點來獲得。不管數據先后,到達本地后再根據數據塊的標識組裝起來就行。另外,這是一種鏈式的結構,鏈式結構的最大特點是一環扣一環,很難從中破壞。

簡單介紹一下梅克爾樹,如上圖右下方樹形的數據結構。比特幣中的梅克爾樹稱為二叉梅克爾樹,它是通過區塊中的交易事務哈希值兩兩結對計算出的新的哈希值。交易事務哈希值兩兩結對后再進行一段遞歸循環,直到計算出最后一個根哈希值,這樣的一棵樹就是梅克爾樹。

為什么要用梅克爾樹這樣的數據結構來存儲交易的事務數據呢?因為比特幣系統是分布式的網絡結構,當一個節點需要同步自己的區塊鏈賬本數據時,并沒有一個明確的服務器來下載數據,而是通過與其他節點的通信來實現的。在下載區塊數據的時候,難免會有某部分數據可能會發生損壞,所以對于一條條的交易事務就可以用梅克爾樹這種形式來進行驗證。

后來人們通過研究比特幣的白皮書和它的源代碼,提煉出一系列背后的思想及技術,并將提煉出來的結果稱之為區塊鏈。區塊鏈技術不僅僅能實現數字貨幣,還能基于這個技術實現各種各樣的應用。因此比特幣是區塊鏈技術的一種實踐方式,區塊鏈是比特幣的技術基礎,這就是比特幣和區塊鏈兩者之間的關系。

現在的比特幣是一個家族,包括BTC 、BCC、BTG等,還出現了類似于比特幣的各種加密貨幣。

為什么現在有比特現金、比特黃金、萊特幣這些幣?這要從擴容說起:比特幣本身的區塊容量限定為1M,隨著時間的推移,運行速度越來越慢,因為1M的容量是在是太小了,一個區塊只能容納有限的交易事務,網絡中等待確認的交易會排很長的隊伍,這時就需要進行擴容。

所謂的區塊鏈擴容主要是指增加區塊容納交易事務的能力,通常有兩種做法:一是增加許可空間的大小,二是縮小交易數據的尺寸。

第一種做法符合一般思維,相當于我們的衣服越來越多,一個衣柜放不下,就多買了幾個衣柜;第二種做法的意思是,比如還是之前的例子,衣服越來越多,我們在不增加衣柜的情況下,把衣服好好地疊一疊壓縮打包起來,這樣同樣的空間就能容納更多的衣服。第二種做法引申出來一個概念:segregated witness隔離驗證。

隔離驗證

比特幣的交易數據結構是通過發起者簽署自己的UTXO(未花費的交易輸出),然后填上接收者的地址建立起來的。這個交易的過程就像簽署一張支票,這張支票就相當于一條比特幣的交易事務,簽署UTXO相當于給支票簽名,也就是所謂的驗證,這個簽名就是用來確認支票的合法性,然后我們可以看到支票上的關鍵內容:發起方的簽名、接收方的地址以及要支付的金額。

那怎么來確定支票數據的唯一性或完整性呢?在比特幣中對每一條交易事務進行一次哈希計算得到一個事務ID,在計算這個事務ID的過程中,整條交易事務包括前面所說的簽名都參與進去。簽名信息的主要作用就是驗證交易數據來源的合法性。實際上驗證的過程也就是交易的過程,只需要進行一次也就是計算一次就可以了。礦工負責驗證交易是否得到合法授權,而其他普通節點只關心接收的結果,這部分切分數據對于普通節點來說其實沒有太大的用處,可以在接收的時候把這部分數據丟棄掉,然后起到一個節省資源的目的,這種將驗證信息與交易數據分離的思想就是隔離驗證。

分叉

而分叉是分布式共識的副產物,只要兩個礦工幾乎同時發現區塊就會發生分叉。當后續區塊添加到其中一個區塊,這種不確定性就會消失,使這個鏈最長;另一個區塊則被網絡“孤立”或“拋棄”。

分叉又分為硬分叉和軟分叉。

硬分叉是軟件升級,將不兼容舊軟件的新規則引入網絡。你可以將它看作規則的延伸(使區塊大小為2MB,而不是1MB的新規則將需要硬分叉)。

分叉后,繼續運行舊版軟件的節點將發現新交易是無效的。因此為了切換到新鏈繼續挖有效區塊,所有網絡節點必須升級為新規則。

當出現某種政治僵局,社區部分人堅持舊規則,就會出現問題。舊鏈的哈希率、網絡算力將變得不合時宜。重要的是,舊鏈的數據和規則仍被看作具備價值,礦工當然希望繼續挖礦,開發者也希望繼續支持它。

比特幣的第一次硬分叉是在2017年8月1日,產生了比特現金,當時也有大量的礦工和社區支持,比特現金的市值一度超過了ETH,成了一個主流的數字貨幣。在此之后,比特幣的分叉就一發不可收拾了,出現了各種幣,但從走勢來看,這些分叉幣如果沒有很好的技術支撐的話,并沒有那么多人支持,這主要取決于市場的走勢以及它能不能給礦工帶來收益。

軟分叉是強化一些規則。因此新規則可能否定1MB的區塊,而支持500K的區塊。軟分叉是向后兼容的。

沒升級的節點會繼續將新交易視為有效的。然而未升級節點繼續挖出的區塊將被升級節點拒絕。因此軟分叉需要網絡的大部分算力。

如果軟分叉獲得少數哈希算力支持,可能變成最短的鏈,然后被網絡鼓勵。或者它可以向硬分叉一樣分離出來,單獨運行。

軟分叉是升級比特幣的常用方法,因為它使網絡分裂的風險被認為是較低的。過去成功的軟分叉包括BIP 66軟件升級(涉及簽名驗證)、P2SH(修改比特幣地址格式)。

比特幣比較重要的一次升級是2012年,當時升級了一個P2SH機制,被社區稱之為多重簽名軟分叉,這次升級修改了比特幣的一個數據結構中的鎖定腳本字段,使得比特幣比較方便地通過多重簽名的方式來發送交易。

除了修改數據結構以外,軟分叉還能定向地修改比特幣的交易歷史。舉個例子,2010年8月有一個黑客利用比特幣“沒有禁止輸出值為負值”這個漏洞,在74638這個高度的區塊上刷出了一筆包含1844個比特幣的交易,半天后開發人員發現了這個事故,緊急發布了一個補丁:將一類負值輸出的交易定義為無效,利用軟分叉的特性將這個補丁發布出去修補了漏洞。

因為硬分叉以及擴容,所以會有比特現金、比特黃金等分叉幣,因為一開始的擴容問題,所以萊特幣等山寨幣在一開始就設計了8M的區塊大小,而運行機制幾乎與比特幣是一樣的。

2

什么是以太坊

2.1 區塊鏈1.0——數字加密貨幣

以前我們常說的web1.0、web2.0、移動互聯網等概念,那么區塊鏈1.0,區塊鏈2.0乃至區塊鏈3.0又是什么呢?區塊鏈1.0是數字加密貨幣。

上圖是數字加密貨幣的結構,從整體來看,一個區塊鏈系統分為節點后臺和前端兩大部分,前端包含多種表現形式,比如錢包、命令行接口、區塊鏈瀏覽器、圖形化界面開發工具等。

我們接觸得比較多的就是各種各樣的錢包,錢包的主要作用是保管賬戶或者說保管私鑰,在交易的時候進行簽名,發送交易驗證等。

節點后臺包含著系統最核心的功能,包括共識機制、鄰節點的管理、區塊鏈管理、交易驗證、內存管理、腳本引擎等。節點可以安裝在各式各樣的計算機或設備中,專門用來挖礦的設備叫礦機。

2.2 區塊鏈2.0 可編程區塊鏈

接下來一起看看區塊鏈2.0。區塊鏈2.0是創建去中心化的程序、自治組織和智能合約的一個系統。

和1.0不同的是2.0提供了一個平臺,可以在平臺上搭建應用。最大的代表是以太坊,提供了各種模塊,讓用戶可以在其基礎上搭建應用,這個應用本質上就是智能合約。

除了構建貨幣體系之外,智能合約可以用來做股票債券期貨貸款產權智能財產等功能。智能合約的核心是利用程序算法替代人去執行合同,這些合同需要自動化的資產過程。合約包含三個基本要素:要約、承諾和價值交換。智能合約有效定義了新的應用形式,使得區塊鏈從最初的貨幣體系拓展到金融以及其他行業的應用。

如圖,我們來看看2.0的內部結構,和1.0相比,2.0也是分為前端應用和后臺節點兩大部分。前端應用大同小異,不同的是,在區塊鏈2.0中有一個智能合約開發工具,這個開發工具是一個基于web的應用,它在智能合約的開發中被廣泛使用。

節點后臺最大的變化也是加入了智能合約這一模塊以及EVM虛擬機。EVM是用來執行智能合約的虛擬機,它類似于Java的虛擬機,可以執行智能合約編譯后的字節碼。

以太坊目前支持三種編程語言:solidity、serpent、LLL。Solidity比較主流,除了金融類的應用,solidity還被廣泛應用在游戲的表現上,比如去年流行的加密貓就是用solidity開發的。

除此以外,以太坊還加入了數據庫模塊,數據庫模塊是存儲以太坊的事件狀態的,以太坊的區塊并不存儲所有的交易信息,而只存交易的哈希值。關于以太坊的存儲結構,我們會在后面的章節中詳細介紹。

2.3 區塊鏈3.0 區塊鏈在金融行業之外的各行業的應用場景

上面介紹了區塊鏈1.0和區塊鏈2.0的特征,那么區塊鏈3.0是什么呢?

區塊鏈3.0:區塊鏈3.0是指區塊鏈在金融行業之外的各行業的應用場景。能夠滿足更加復雜的商業邏輯。區塊鏈3.0被稱為互聯網技術之后的新一代技術創新,足以推動更大的產業改革。

2.4 什么是以太坊

以太坊的概念首次在2013至2014年間由程序員Vitalik Buterin,受比特幣啟發后提出,大意為“下一代加密貨幣與去中心化應用平臺”,在2014年通過ICO眾籌開始得以發展。

與其它區塊鏈一樣,以太坊需要幾千人在自己的計算機上運行一個軟件,為該網絡提供動力。網絡中的每個節點(計算機)運行一個叫做以太坊虛擬機(EVM)的軟件。將以太坊虛擬機想象成一個操作系統,它能理解并執行通過以太坊特定編程語言編寫的軟件。由以太坊虛擬機執行的軟件/應用程序被稱為“智能合約”。

要在這一世界計算機上做任何事都需付費。不過,付的不是美元或英鎊等普通貨幣,而是該網絡自帶的加密貨幣,叫做以太幣。以太幣與比特幣大致相同,除了一點,即以太幣可以為在以太坊上執行智能合約而付費。

可以換個方式來理解,就像現在的云計算一樣,比如我們要做虛擬機需要付費,以太坊可以理解成另外一種形式的云,我們在它上面跑自己的應用或服務業需要用它自己的貨幣來支付費用。

以太坊不像比特幣那樣只是一種加密貨幣,它還存在其它特征,使其成為了一個巨大的分布式計算機。但是,它運行起來極其緩慢——比如今的普通計算機的運行速度緩慢約5至100倍——而且成本很高。那么為什么這個看起來不怎么樣的計算機系統能火遍全球呢?

在以太坊上,無論是人還是智能合約都可作為用戶。人類用戶能做的事,智能合約也能做,而且還遠不止如此。以太坊提供了一個內部的圖靈完備的腳本語言以供用戶來構建任何可以精確定義的智能合約或交易類型。想建立一個全規模的守護程序(Daemon)或天網(Skynet),你可能需要幾千個聯鎖合約并且確定慷慨地喂養它們,一切皆有可能。

2.5智能合約

那什么是智能合約呢?

想象一下,我們倆關于明天的天氣打個賭。我賭明天天晴,你賭明天下雨。我們約定輸家必須給贏家100美元。我們如何打這個賭,還要確保輸家會履行諾言呢?我能想出以下三種不同方法:

  • 互相信任

最簡單的方法是互相信任。如果我們已經是老朋友了,很容易信任對方。我知道你的家庭住址而你知道我的黑歷史。然而,如果我們是陌生人的話,那就難辦多了。你沒理由信任我,我也沒理由信任你。

  • 簽署法定合同

另一個可行的方法是根據我們之間的賭約制定一份法定合同。我們雙方會簽署一份詳細規定了賭約條款的合同——包括關于輸家違約的規定。該合同會讓我們有向贏家支付賭金的法律義務,卻不具實用性。因為如果通過法律途徑強迫對方履行合同,其代價高出賭金本身。

  • 尋求共同朋友的幫助

我們可以找一個雙方都信任的共同朋友,各交100美元在他/她那里保管。第二天,他/她會查看天氣情況,將這200美元都交給贏家。這種方式簡單明了,除非出現一種情況:要是這位朋友卷款而逃該怎么辦呢?

以太坊的智能合約在這種情況下就可以派上用場了。智能合約就像是尋求共同朋友的幫助,不過是被編寫成了代碼。通過以太坊,我們可以編寫一款軟件,向兩方各收取價值100美元的以太幣。第二天打開接入天氣應用的API查看天氣情況,并將總價值為200美元的以太幣轉給贏家。因為區塊鏈的特性,智能合約一旦完成,無論如何都無法被編輯或修改。因此,可以肯定的是不管合約中有何規定,無論如何都會被執行。

2.6 智能合約的原理

本質上來說,智能合約也是一條以太坊交易。不管智能合約于何時執行,它都記錄了在區塊上執行的交易的信息。上圖描述了以太坊的交易,它分為幾個字段:時間戳、發送方、接收方、賬戶發送的金額、data。在這里發送方就是調用者,接收方是智能合約的地址,data就是智能合約要調用的內容,也就是俗稱的API,DATA字段,賦予了以太坊獨特的能力,用于創建記錄和執行智能合約。

通常來說以太坊的交易分為三種:

第一種是人類用戶之間的互相轉賬,如下圖所示,這個時候 Data字段是沒有內容的,發送者和接收者都是人類。

第二種是無接收方的以太幣轉賬。在進行沒有接收方的交易時,這就意味著該交易的目的是在網絡中利用“數據”項的內容創建一個智能合約。“數據”項中包含軟件代碼,該代碼會像網絡中的其它用戶一樣進行操作。

第三種是用戶和智能合約之間的以太幣轉賬。無論用戶(或智能合約)何時想要執行智能合約,他/她/它需要與智能合約進行一次交易,將執行指令置于“數據”項中。

2.6.1? 以太坊的賬戶

在以太坊中有兩種賬號共享地址空間:外部賬號和合約賬號。外部賬號是由公鑰和私鑰控制的(如人),合約賬號是由賬號存儲的代碼所控制。

無論賬戶類型是什么都存在這四個組成部分:Nonce、Balance、StorageRoot、CodeHash。

外部賬號的地址是由公鑰決定的,而合約地址是在智能合約被創建的時候決定的(這個地址由創建者的地址和發送方發送過來的交易數字衍生而來,這個數字通常被叫做“nonce”)不管是否賬號存有代碼(合約賬號存儲了代碼,而外部賬號沒有),對于EVM來說這兩種賬號是相等的。每一個賬號都有持久化存儲一個key和value長度都為256位字的鍵值對,被稱為“storage”。而且,在以太坊中,每個賬號都有一個余額(確切的是用“Wei”來作為基本單位),該余額可以被發送方發送過來帶有以太幣的交易所更改。

2.6.2 交易

交易的本質是一個賬戶和另一個賬戶之間的信息交換,它包含了二進制數據(也就是消費數據)和以太數據。如果目標賬號包含了代碼,這個代碼一旦被執行,那么它的消費數據就會作為一個輸入數據。如果目標賬號是一個0賬號(地址為0的賬號),交易會生成一個新的合約。

上圖中紅框的內容就是一個新的合約所編譯出來的字符串。

這個合約的地址不為0,但是是來源于發送方,之后這個賬號的交易數據會被發送。這個合約消費會被編譯為EVM的二進制代碼,并執行。這次的執行會被作為這個合約的代碼持久化。這就是說:為了創建一個合約,你不需要發送真正的代碼到這個合約上,事實上是代碼的返回作為合約代碼。

2.6.3 Gas

以太坊上的每筆進行一筆交易都會被收取一定數量的Gas.這是為了限制交易的數量,同時對每一筆交易的進行支付額外費用。當EVM執行一個交易,交易發起方就會根據定義的規則消耗對應的Gas。交易的創造者定義了的Gas 價格。所以交易發起方每次需要支付?gas_price * gas 。如果有gas在執行后有剩余,會以同樣的方法返回給交易發起方。如果gas在任何時候消耗完,out-of-gas?異常會被拋出,那當前的這邊交易所執行的后的狀態全部會被回滾到初始狀態。

這是一個保護機制,用來保護以太坊不會受到惡意攻擊,讓整個網絡中一些惡意的程序無法進行。這里又可以看出區塊鏈是用經濟模型的方式,或者說用經濟的方式來限制黑客攻擊的。黑客并不是不能用技術手段來進行惡意攻擊,但是他要付出的代價成本遠大于獲得的價值。

2.6.4? 以太坊虛擬機的內存結構

  • 內存、主存和棧

以太坊每個賬號都有持久化的內存空間叫做存儲. 存儲是一個key和value長度都為256位的key-value鍵值對。從一個合約里列舉存儲是不大可能的。讀取存儲里的內容是需要一定的代價的,修改storage里的內容代價則會更大。一個合約只能讀取或是修改自己的存儲內容。

以太坊的第二內存區域叫做主存。系統會為每個消息的調用分配一個新的,被清空的主存空間。主存是線性并且以字節粒度尋址。讀的粒度為32字節(256位),寫可以是1個字節(8位)或是32個字節(256字節)。當訪問一個字(256位)內存時,主存會按照字的大小來擴展。主存擴展時候,消耗Gas也必須要支付,主存的開銷會隨著其增長而增大(指數增長)。

EVM不是一個基于寄存器,而是基于棧的。所以所有的計算都是在棧中執行。最大的size為1024個元素,每個元素為256位的字。棧的訪問限于頂端,按照如下方式:允許拷貝最上面的16個元素中的一個到棧頂或是棧頂和它下面的16個元素中的一個進行交換。所有其他操作會從棧中取出兩個(有可能是1個,多個,取決于操作)元素,把操作結果在放回棧中。當然也有可能把棧中元素放入到存儲或是主存中,但是不可能在沒有移除上層元素的時候,隨意訪問下層元素。

2.6.5 指令集

為了避免錯誤的實現而導致的一致性問題,EVM的指令集保留最小集合。所有的指令操作都是基于256位的字。包含有常用的算術,位操作,邏輯操作和比較操作。條件跳轉或是非條件跳轉都是允許的。而且合約可以訪問當前區塊的相關屬性比如編號和時間戳。

2.6.6 消息調用

合約可以通過消息調用來實現調用其他合約或是發送以太幣到非合約賬號。消息調用和交易類似,他們都有一個源,一個目標,數據負載,以太幣,gas和返回的數據。事實上,每個交易都包含有一個頂層消息調用,這個頂層消息可以依次創建更多的消息調用。

一個合約可以定義內部消息調用需要消耗多少gas,多少gas需要被保留。如果在內部消息調用中出現out-of-gas異常,合約會被通知,會在棧里用一個錯誤值來標記。這種情況只是這次調用的gas被消耗完。在Solidity,這種情況下調用合約會引起一個人為異常,這種異常會拋出棧的信息。

上面提到,調用合約會被分配到一個新的,并且是清空的主存,并能訪問調用的負載。調用負載時被稱為calldata的一個獨立區域。調用結束后,返回一個存儲在調用主存空間里的數據。這個存儲空間是被調用者預先分配好的。調用限制的深度為1024.對于更加復雜的操作,我們更傾向于使用循環而不是遞歸。

2.6.7 代理調用/ 代碼調用和庫

存在一種特殊的消息調用,叫做代理調用。除了目標地址的代碼在調用方的上下文中被執行,而且msg.sender和msg.value不會改變他們的值,其他都和消息調用一樣。這就意味著合約可以在運行時動態的加載其他地址的代碼。存儲,當前地址,余額都和調用合約有關系。只有代碼是從被調用方中獲取。這就使得我們可以在Solidity中使用庫。比如為了實現復雜的數據結構,可重用的代碼可以應用于合約存儲中。

2.6.8日志

我們可以把數據存儲在一個特殊索引的數據結構中。這個結構映射到區塊層面的各個地方。為了實現這個事件,在Solidity把這個特性稱為日志。合約在被創建出來后是不可以訪問日志數據的。但是他們可以從區塊鏈外面有效的訪問這些數據。因為日志的部分數據是存儲在bloom filters上。我們可以用有效并且安全加密的方式來查詢這些數據。即使不用下載整個區塊鏈數據(輕客戶端)也能找到這些日志。

2.6.9創建

合約可以通過特殊的指令來創建其他合約。這些創建調用指令和普通的消息調用唯一區別是:負載數據被執行,結果作為代碼被存儲,調用者在棧里收到了新合約的地址。

2.6.10 自毀

從區塊鏈中移除代碼的唯一方法是合約在它的地址上執行了selfdestruct操作。這個賬號下剩余的以太幣會發送給指定的目標,存儲和代碼從棧中刪除。

3

附:基于solidity的實例PPT

內容來源:HiBlock區塊鏈課堂011期?尚濤老師的線上分享《區塊鏈技術與智能合約入門

本文編輯:Cynthia

點擊“閱讀原文”即可回聽課程分享。

線上課程推薦

線上課程:《8小時區塊鏈智能合約開發實踐》

培訓講師:《白話區塊鏈》作者 蔣勇

課程原價:999元,現價 399元

更多福利:

  • @所有人,識別下圖二維碼轉發課程邀請好友報名,即可獲得報名費50%返利

  • @學員,報名學習課程并在規定時間內完成考試即可瓜分10000元獎金

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282590.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282590.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大型網站技術架構:核心原理與案例分析筆記

1.大型網站軟件系統的特點: 高并發,大流量  高可用 海量數據  用戶分布廣泛,網絡情況復雜  安全環境惡劣  需求快速變更,發布頻繁  漸進式發展  2.大型網站演變架構 1)初步應用:數據(數據…

1777:文件結構“圖”

1777:文件結構“圖” 查看提交統計提問總時間限制: 1000ms內存限制: 65536kB描述在計算機上看到文件系統的結構通常很有用。Microsoft Windows上面的"explorer"程序就是這樣的一個例子。但是在有圖形界面之前,沒有圖形化的表示方法的,那時候最…

thinkphp出現Call to undefined function Think\C() in ... online 313

造成這個問題的原因很多,在這里我只說明我自己遇到之后解決的辦法 我將functions.php改成了function.php之后,修改了一些其他無關緊要的東西出現了這個問題,來回排查,各種嘗試,最后,將function.php改回functions.php,可以正常運行

Oracle數據庫IP訪問限制(IP白名單黑名單)

1、編輯sqlnet.ora內容為:#允許訪問的IP(白名單)TCP.INVITED_NODES(127.0.0.1,192.168.56.109,ip2,ip3,..,..本地IP..)若使用白名單,必須有本地IP,否則監聽會起不來#不允許訪問的IP(黑名單)#TCP…

WPF效果第一百九十九篇之Gamma曲線

前面效果中分享了模塊對比;今天大周末那就再來分享一下最近實現的效果;基于YX^n公式根據不同的系數繪制Gamma曲線效果如下圖:1、曲線的話,咱就用最簡單的方式繪制一堆點:PathFigure pathFigure new PathFigure(){StartPoint new Point(0, count),};for(double x 0; x < 1…

圖片序列化和反序列化成圖片文件(代碼)

// // ViewController.m // 圖片序列化和反序列化 // // Created by Qlinchao on 17/3/14. // Copyright © 2017年 QLC. All rights reserved. //#import "ViewController.h"interface ViewController () property (weak, nonatomic) IBOutlet UIImageView …

windows 下 MyEclipse 逆向工程生成hiberate 對應配置文件以及 javaBean。

步驟1&#xff1a; 右邊工具欄 -> 右擊你的項目 -> 選中 MyEclipse -> Project Facets -> install Hibernate Facet -> 選擇對應的版本&#xff08;以及一些你想要的配置&#xff09; 步驟2&#xff1a; 導航欄 -> window -》 show View -> Other 。 然…

php加解密

一 對稱加密 1.mycyrpt的對稱加密: /*** param $key //數據加密密鑰 由自己定義,長度有限制 string* param $string //需要進行加解密的字符串 string* param $decrypt //加密還是解密 (最簡單的,0代表加密,1代表解密)* return string*/ function encryptDecrypt($key, $st…

深入理解Spring Boot數據源與連接池原理

? Create by ysterfoxmail.com 2018-8-2一&#xff1a;開始 在使用Spring Boot數據源之前&#xff0c;我們一般會導入相關依賴。其中數據源核心依賴就是spring‐boot‐starter‐jdbc 如下 <dependency><groupId>org.springframework.boot</groupId> …

Dapr 集成 Open Policy Agent 實現 接口的訪問控制

大型項目中基本都包含有復雜的訪問控制策略&#xff0c;特別是在一些多租戶場景中&#xff0c;例如Kubernetes中就支持RBAC&#xff0c;ABAC等多種授權類型。Dapr 的 中間件 Open Policy Agent 將Rego/OPA策略應用到傳入的Dapr HTTP請求中。Open Policy AgentOpen Policy Agent…

【Java】BigDecimal

一、前言 在使用Java&#xff0c;double 進行運算時&#xff0c;經常出現精度丟失的問題&#xff0c;總是在一個正確的結果左右偏0.0000**1。 特別在實際項目中&#xff0c;通過一個公式校驗該值是否大于0&#xff0c;如果大于0我們會做一件事情&#xff0c;小于0我們又處理其他…

PHP獲取當前頁面URL

//獲取頁面url function curPageURL() {$pageURL http;if (!empty($_SERVER[HTTPS])) {$pageURL . "s";}$pageURL . "://";if ($_SERVER["SERVER_PORT"] ! "80") {$pageURL . $_SERVER["SERVER_NAME"].":".$_SER…

【招聘(大連)】北森云計算 .NET 專場招聘

為了更好的實現戰略布局&#xff0c;逐步形成以三個產品研發中心&#xff08;北京、成都、大連&#xff09;為主&#xff0c;青島和南京為輔的產品研發團隊配置。北森云第三研發中心&#xff08;大連&#xff09;正式成立&#xff0c;目前大連的人選招聘正式開啟&#xff0c;歡…

PHP強制下載文件

//有時我們不想讓瀏覽器直接打開文件&#xff0c;如PDF文件&#xff0c;而是要直接下載文件&#xff0c;那么以下函數可以強制下載文件 //函數中使用了application/octet-stream頭類型。 function downloads($filename,$dir./) {$filepath $dir.$filename;if (!file_exists($f…

F5基于證書認證的客戶端登錄

1.生成密鑰RSA類型&#xff0c;密碼&#xff1a;123456保存為Openssl格式2.上傳客戶機SecureCRT生成的公鑰 Identity.pub到用戶home目錄下.ssh文件夾中cd .sshmv Identity.pub authorized_keys ##cat .ssh/id_rsa.pub >> ~/.ssh/authorized_keys3.更改F5 ssh配置文件tmsh…

C#多線程編程-必知必會

“發現問題的能力&#xff0c;運用技術解決問題的能力&#xff0c;是一個技術人成長的關鍵”圖片故事&#xff1a;洋姜的花&#xff0c;拍攝于2022年7月23日&#xff0c;地點&#xff1a;北京奧林匹克森林公園 &#xff0c;攝影師&#xff1a;劉先生概要&#xff1a;使用C#發起…

理解Go Interface

理解Go Interface1 概述Go語言中的接口很特別&#xff0c;而且提供了難以置信的一系列靈活性和抽象性。接口是一個自定義類型&#xff0c;它是一組方法的集合&#xff0c;要有方法為接口類型就被認為是該接口。從定義上來看&#xff0c;接口有兩個特點:接口本質是一種自定義類型…

『中級篇』Dockerfile詳解(17)

一般的&#xff0c;Dockerfile 分為四部分&#xff1a;基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。 ####官網學習 https://docs.docker.com/engine/reference/builder/#usage ####FROM 必須為第一個命令&#xff0c;指定基礎鏡像 FROM <image> FROM &…

洛谷 1165日志分析

題目描述 M 海運公司最近要對旗下倉庫的貨物進出情況進行統計。目前他們所擁有的唯一記錄就是一個記錄集裝箱進出情況的日志。該日志記錄了兩類操作&#xff1a;第一類操作為集裝箱入庫操作&#xff0c;以及該次入庫的集裝箱重量&#xff1b;第二類操作為集裝箱的出庫操作。這些…

KestrelServer詳解[1]:注冊監聽終結點(Endpoint)

具有跨平臺能力的KestrelServer是最重要的服務器類型。針對KestrelServer的設置均體現在KestrelServerOptions配置選項上&#xff0c;注冊的終結點是它承載的最重要的配置選項。這里所謂的終結點&#xff08;Endpoint&#xff09;與“路由”介紹的終結點不是一回事&#xff0c;…