你可能聽說過「智能合約」,甚至可能知道它們是在區塊鏈上運行的代碼。但是你如何才能在區塊鏈上運行代碼?這不是可以輕易理解的簡單概念。本文解釋了智能合約是如何在以太坊區塊鏈上運行的。對編程的基礎理解將會有所幫助,因爲本文包含了一些用於舉例的簡單代碼。爲了清晰起見,本文將其中的一些技術細節稍微進行了簡化,但概念是有效的。

原文標題:《Understanding Ethereum Smart Contracts》
原文作者:Gjermund Bjaanes
翻譯:藍狐筆記社羣 Dyna

一、區塊鏈 —— 快速入門

這裏不講太多細節,區塊鏈技術的核心概念是分佈式賬本。它是一種在衆多參與者之間共享的特殊類型的數據庫。

這個特殊的數據庫就是一個交易列表,記錄了網絡中發生的每一筆交易。每個人都有一個副本。這種去中心化分佈結合強有力的貨幣激勵措施 , 消除了各方之間信任的必要性。

傳統意義上,當事人之間的信任是通過中間人,即第三方來解決的,比如 Paypal、銀行。與你不信任的人之間的交易將通過雙方都信任的中間人進行。

有了區塊鏈,這種需求消失了。因爲你可以把你的信任放在網絡上,在這裏,強有力的激勵措施消除了作弊欺騙的慾望 (簡而言之:遵守規則更有利可圖)。

深入交易細節,理解以太坊智能合約的工作原理

更具體地說:區塊鏈網絡是一組機器,它們記錄着相同的交易列表副本 (例如,從 A 轉給 B 的錢)。

因爲每個人都有相同的列表,所以很難欺騙網絡接受錯誤的交易。結合一些加密算法和貨幣獎勵以便遵守規則,你的網絡會非常安全。

所有這些也使得區塊鏈幾乎是不可變的,因爲改變歷史記錄的唯一方法是獲得全網大多數人的同意。

二、什麼是智能合約?

區別於比特幣,以太坊最大的不同是引入了智能合約的概念。比特幣是數字貨幣,以太坊也是數字貨幣,但遠不止這些。

「智能合約」這個名稱有點誤導人。它們不是真正的合約,也不特別智能。它們只是一些可以運行在區塊鏈上的代碼 – 或者說是計算機邏輯運算。

首先,我將介紹有關智能合約是以太坊網絡上的一種特殊賬戶。你有用戶賬戶,你還有智能合約賬戶。

一個用戶賬戶包括:

  • 一個地址(類似於你的銀行賬號-它也存在於比特幣上)
  • 餘額(我有多少錢)

一個智能合約賬戶包括:

  • 一個地址
  • 餘額(以太坊)
  • 一個狀態
  • 代碼

地址和普通賬戶的地址是一樣的,它是該賬戶的唯一識別符。

餘額和普通賬戶也是一樣的概念。唯一令人激動的是,智能合約上的餘額意味着代碼可以擁有金錢。它可以處理這些錢,也可能因爲編碼錯誤而造成處理不當。

智能合約帳戶的狀態是智能合約中聲明的所有字段和變量的當前狀態。它的工作方式與大多數編程語言中類的字段變量相同。事實上,一個類的實體化對象可能是理解智能合約的最簡單方法。唯一的區別是這個對象是永久存在的 (除非被編程爲自我毀滅)。

智能合約的代碼是編譯好的字節代碼,以太坊客戶機和節點可以在上面運行。它是在創建智能合約時執行的代碼,並且包含可以調用的函數。就像面向對象編程的語言中的任何對象一樣。

關於智能合約的趣事:它們可以調用其它的智能合約。這就開啓了創建自主代理的能力,這些代理可以自己花錢和進行交易

深入交易細節,理解以太坊智能合約的工作原理

假設我用上面的代碼創建了一個智能合約。該代碼有一個名爲 counter 的字段,類型爲 uint(整數)。counter 變量的內容是本合約的狀態。每當我調用 count() 函數時,任何人都能看到這個智能合約在區塊鏈上的狀態將會加 1。

深入交易細節,理解以太坊智能合約的工作原理

稍後我們將通過更多的例子來解釋它是如何工作的,但首先我想回到以太坊和比特幣的交易,並以此來解釋一些事情。

三、交易水平上,以太坊 VS 比特幣

比特幣交易非常簡單。你可以只做一件事。一種類型的交易。略過一些細節,一切都可以歸結爲 TO (付給,誰在收錢),FROM (來自於,誰在付錢)和 AMOUNT(數量,多少錢)。這使得比特幣成爲一種價值儲存手段,能夠在網絡參與者之間傳遞價值。

以太坊的不同之處在於交易還有一個「DATA」(數據)字段。該「DATA」字段支持三種類型的交易:

價值轉移(和比特幣一樣)

  • TO 接收地址;
  • DATA 字段爲空或包含要附加的任何消息;
  • FROM
  • AMOUNT 是你要發送的以太坊數量

創建智能合約

  • TO 字段爲空(它觸發智能合約的創建)
  • DATA 字段包含編譯爲字節代碼的智能合約代碼
  • FROM 你
  • AMOUNT 可以是 0 或者任意你想放在合約裏的以太坊數量

調用智能合約

  • TO 字段是智能合約賬戶地址
  • DATA 字段包含函數名稱和參數 —— 如何調用智能合約
  • FROM 你
  • AMOUNT 可以是 0 或者任何數量的以太坊,比如你需要爲一項服務合約支付的數目

在這些交易中還有更多的字段和複雜性,但以上這些已經很好地解釋了核心概念。讓我們看看關於這些交易的一些更具體的例子。

價值轉移

深入交易細節,理解以太坊智能合約的工作原理

非常簡單。TO 向一個地址發送一定數目的以太坊代幣。你也可以爲一筆交易加上一條消息。

創建智能合約

深入交易細節,理解以太坊智能合約的工作原理

正如以上提到的,一個空的 TO 字段表示創建一份智能合約。DATA 字段包含編譯爲字節代碼的智能合約。

調用合約

深入交易細節,理解以太坊智能合約的工作原理

我們稍後會回到這個問題,但是其主要概念是你將交易發送到你想要調用的智能合約地址,然後將函數調用放在 DATA 字段中。

四、注意成本和執行

正如你所想象的,你不能一直在區塊鏈上免費運行計算量很大的程序。

代碼的執行是由調用者用一種叫做 gas 的東西來支付的。Gas 是運行以太坊虛擬機的燃料。你可以將其視爲每次執行指令的費用 (就像一行代碼)。

你需要爲一個特定的合約調用設置可花費的最大 gas。比如,如果你調用的代碼進入了一個永久循環,將會確保在執行過程中所花費的 gas 不會超過設置的最大 gas。

gas(執行) 的成本由網絡的礦工 (運行代碼的節點) 決定。關於 gas 和執行,還有很多知識。但以上這些值得牢牢記住。

五、智能合約如何工作?

當一個智能合約被部署到以太坊網絡時,任何人都可以調用智能合約的函數。雖然出於安全考慮該函數可能阻止人們調用,但你可以自由嘗試。

假設有一個 MyObject 類型的對象。該對象有一個名爲 myFunction 的函數。要調用它,只需引用對象的實例、調用哪個函數和使用哪個參數調用。

像這樣:

myObjectReference.myFunction(parameters);

該函數返回的任意值,可以將其存在變量中:

myVariable = myObject.myFunction (parameters)

調用一個智能合約在概念上是一樣的。唯一的區別是,你必須將調用相關的所有信息放在交易中,對其簽名併發送到網絡上來執行。

假設你想要調用函數 myFunction,其中包含智能合約「0x0123456」裏的一些參數。調用智能合約分四步:

深入交易細節,理解以太坊智能合約的工作原理

現在,當交易被放進區塊鏈中的一個塊,該狀態變化便會被記錄在整個網絡中。

六、世界計算機

許多人把以太坊稱爲世界計算機。這是個不錯的類比。它就像一臺由整個世界來維護的虛擬機。

但是請記住:雖然智能合約是圖靈完備的,並且理論上可以做任何事情,但它們不太適合繁重的計算工作。

以太坊世界計算機就像一臺運行簡單程序的老式慢速計算機。由於成本和安全性,保持以太坊的智能合約小而簡單是至關重要的。

合約需要的計算量越多,運行的成本就越大。合約越複雜,就越有可能存在安全漏洞。而且智能合約中的安全漏洞是很難處理的——畢竟區塊鏈是不可變的。

深入交易細節,理解以太坊智能合約的工作原理

舉例:通證

迴歸重點,我想解釋一下通證是如何工作的。

大多數這些通證都是在以太坊上創建的,而且概念非常簡單(它運行良好,但是太簡單了,以至於幾乎可以說是愚蠢的)。

如何使用 Javascript 或其他編程語言編寫一個簡單的貨幣系統 ? 你可以在一個文件中完成所有的操作。你真正需要記錄的是:

  1. 總供應量
  2. 賬戶
  3. 賬戶中的餘額
  4. 資金流向

通過用戶和餘額之間的簡單映射,你可以得到 123 的答案:

深入交易細節,理解以太坊智能合約的工作原理

該 map 只是把一個賬戶映射到一筆錢。

使用構造函數(constructor),你可以在自己的帳戶中設置初始供應量 (或分佈在任意數量的賬戶中)

深入交易細節,理解以太坊智能合約的工作原理

資金的流動是通過簡單的函數來完成的,即從一個賬戶中減去,然後加在另一個賬戶上。

深入交易細節,理解以太坊智能合約的工作原理

創建通證與我們在以太坊使用的概念完全相同。當然,還有一些更復雜和額外的功能,但是基本概念非常簡單。

以下就是基本的通證合約在以太坊編程語言中呈現的樣子 (再次重申:爲清晰起見進行了簡化):

深入交易細節,理解以太坊智能合約的工作原理

這就是基礎編程概念。我認爲這說明了以太坊作爲一個平臺的力量。通過一些簡單的代碼,你可以憑空生成一個代幣,它本質上就是由世界計算機記錄的一些變量。歡迎來到新的互聯網。

來源鏈接:www.gjermundbjaanes.com