《為以太坊區塊鏈創建 Solidity 智能合約》一書。 實用指南》

《為以太坊區塊鏈創建 Solidity 智能合約》一書。 實用指南》
一年多來,我一直在寫《為以太坊區塊鏈創建 Solidity 智能合約》一書。 實用指南”,現在這部作品已經完成了,這本書 已發布並以公升為單位提供.

我希望我的書能幫助您快速開始為以太坊區塊鏈創建 Solidity 智慧合約和分散式 DApp。 它由 12 節帶有實際任務的課程組成。 完成這些任務後,讀者將能夠創建自己的本地以太坊節點,發布智能合約並調用其方法,使用預言機在現實世界和智能合約之間交換數據,並使用 Rinkeby 測試調試網絡。

本書面向所有對區塊鏈領域的先進技術感興趣並希望快速獲得知識以從事有趣和有前途的工作的人。

下面您將找到本書的目錄和第一章(也包括 文學 本書的片段可用)。 我希望收到回饋、意見和建議。 在準備本書的下一個版本時,我將盡力考慮到這一切。

目錄介紹我們的書面向那些不僅想要了解以太坊區塊鏈原理,還想要獲得使用 Solidity 程式語言為該網路創建分散式 DApp 的實用技能的人。

最好不僅閱讀這本書,還應該使用它,執行課程中描述的實際任務。 要工作,您需要一台安裝了 Debian 或 Ubuntu 作業系統的本機電腦、虛擬伺服器或雲端伺服器。 您也可以使用 Raspberry Pi 執行許多任務。

第一節課時 我們將了解以太坊區塊鏈的操作原理和基本術語,並討論該區塊鏈可以在哪裡使用。

目標 第二課 — 建立一個私有以太坊區塊鏈節點,以便在 Ubuntu 和 Debian 伺服器上進行本課程的進一步工作。 我們將了解安裝基本實用程式的功能,例如確保區塊鏈節點運行的 geth,以及 swarm 去中心化資料儲存守護程式。

第三課 將教您如何在廉價的 Raspberry Pi 微型計算機上試驗以太坊。 您將在 Raspberry Pi 上安裝 Rasberian 作業系統 (OS)、為區塊鏈節點提供支援的 Geth 實用程式以及 Swarm 去中心化資料儲存守護程式。

第四課 致力於以太坊網路上的帳戶和加密貨幣單位,以及從 Geth 控制台將資金從一個帳戶轉移到另一個帳戶的方法。 您將學習如何建立帳戶、發起資金轉帳交易以及取得交易狀態和收據。

在第五課中 您將熟悉以太坊網路上的智慧合約,並了解它們在以太坊虛擬機器上的執行情況。

您將在以太坊專用網路上建立並發布您的第一個智慧合約,並學習如何呼叫其函數。 為此,您將使用 Remix Solidity IDE。 您還將學習如何安裝和使用 solc 批次編譯器。
我們還將討論所謂的應用程式二進位介面(ABI)並教您如何使用它。

第六課 致力於建立執行 Node.js 的 JavaScript 腳本並使用 Solidity 智慧合約執行操作。

您將在 Ubuntu、Debian 和 Rasberian OS 上安裝 Node.js,編寫腳本在以太坊本地網路上發布智慧合約並呼叫其函數。

此外,您還將學習如何使用腳本在常規帳戶之間轉移資金,以及如何將資金存入智慧合約帳戶。

在第七課中 您將學習如何安裝和使用在 Solidity 智能合約開發人員中流行的 Truffle 框架。 您將學習如何使用 truffle-contract 模組建立呼叫合約函數的 JavaScript 腳本,並使用 Truffle 測試您的智慧合約。

第八課 專用於 Solidity 資料類型。 您將編寫適用於有符號和無符號整數、有符號數字、字串、位址、複雜變數、陣列、枚舉、結構體和字典等資料類型的智能合約。

在第九課中 您將距離為以太坊主網創建智能合約又更近了一步。 您將學習如何在 Geth 專用網路以及 Rinkeby 測試網路上使用 Truffle 發布合約。 在將智能合約發佈到主網絡之前,在 Rinkeby 網路上調試智能合約非常有用 - 那裡幾乎所有內容都是真實的,但是免費。

作為本課程的一部分,您將建立一個 Rinkeby 測試網路節點,為其提供資金,並發布智慧合約。

第 10 課 致力於以太坊Swarm分散式資料儲存。 透過使用分散式存儲,您可以節省在以太坊區塊鏈上存儲大量數據的費用。

在本教程中,您將建立本機 Swarm 存儲,對檔案和檔案目錄進行讀寫操作。 接下來,您將學習如何使用公共 Swarm 網關、編寫腳本以從 Node.js 存取 Swarm,以及使用 Perl Net::Ethereum::Swarm 模組。

課程目標 11 — 掌握使用流行的 Python 程式語言和 Web3.py 框架使用 Solidity 智能合約。 您將安裝框架,編寫腳本來編譯和發布智能合約,並呼叫其函數。 在本例中,Web3.py 將單獨使用,並與 Truffle 整合開發環境結合使用。

第12課時 您將學習使用預言機在智慧合約和現實世界之間傳輸資料。 這對於您從網站、物聯網設備、各種設備和感測器接收資料並將資料從智慧合約發送到這些裝置非常有用。 在本課程的實作部分,您將創建一個預言機和一個智慧合約,用於從俄羅斯聯邦中央銀行網站接收美元和盧布之間的當前匯率。

第 1 課. 簡單介紹區塊鏈和以太坊網絡上課目的: 熟悉以太坊區塊鏈的運作原理、應用領域和基本術語。
實際任務: 不包含在本課中。

今天幾乎沒有一個軟體開發人員沒有聽說過區塊鏈技術(Blockchain)、加密貨幣(Cryptocurrency或Cryptocurrency)、比特幣(Bitcoin)、首次代幣發行(ICO,Initial coin發行)、智能合約(Smart Contract )、以及與區塊鏈相關的其他概念和術語。

區塊鏈技術開闢了新的市場並為程式設計師創造了就業機會。 如果您了解加密貨幣技術和智能合約技術的所有複雜性,那麼在實踐中應用這些知識就不會有問題。

必須說,圍繞加密貨幣和區塊鏈有很多猜測。 我們將把有關加密貨幣匯率變化、金字塔的創建、加密貨幣立法的複雜性等問題的討論放在一邊。 在我們的培訓課程中,我們將主要關注以太坊區塊鏈(Ethereum,Ether)智能合約應用的技術方面以及所謂去中心化應用程式(Distributed Application,DApp)的開發。

什麼是區塊鏈

區塊鏈(Block Chain)是一種以一定方式相互連接的資料塊鏈。 在鏈的開頭有第一個區塊,稱為主區塊(創世區塊)或創世區塊。 接下來是第二個,然後是第三個,依此類推。

所有這些資料區塊都會自動複製到區塊鏈網路的眾多節點上。 這確保了區塊鏈資料的去中心化儲存。
您可以將區塊鏈系統視為網路中連接的大量節點(實體或虛擬伺服器),並複製資料塊鏈中的所有變更。 這就像一台巨型的多伺服器計算機,而這樣一台計算機的節點(伺服器)可以分散在世界各地。 您也可以將您的電腦加入區塊鏈網路。

分散式資料庫

區塊鏈可以被認為是在區塊鏈網路的所有節點上複製的分散式資料庫。 理論上,只要至少有一個節點在工作並儲存區塊鏈的所有區塊,區塊鏈就可以運作。

分散式資料註冊

區塊鏈可以被認為是資料和操作(交易)的分散式帳本。 這種登記冊的另一個名稱是分類帳。

資料可以加入到分散式帳本中,但不能更改或刪除。 這種不可能是透過使用密碼演算法、向鏈添加區塊的特殊演算法和去中心化資料儲存來實現的。

新增區塊和執行操作(交易)時,會使用私鑰和公鑰。 他們透過只允許區塊鏈用戶存取自己的資料塊來限制他們。

交易

區塊鏈將有關操作(交易)的資訊儲存在區塊中。 同時,舊的、已完成的事務無法回滾或更改。 新交易儲存在新新增的區塊中。

這樣,整個交易歷史就可以原封不動地記錄在區塊鏈上。 因此,區塊鏈可以用來安全地儲存銀行交易、版權資訊、業主變更歷史等。

以太坊區塊鏈包含所謂的系統狀態。 隨著事務的執行,狀態從初始狀態變成目前狀態。 交易記錄在區塊中。

公共和私有區塊鏈

這裡應該指出的是,上述一切僅適用於所謂的公共區塊鏈網絡,它不能被任何個人或法人實體、政府機構或政府控制。
所謂的私有區塊鏈網路處於其創建者的完全控制之下,一切皆有可能,例如完全替換鏈上的所有區塊。

區塊鏈的實際應用

區塊鏈可以用來做什麼?

簡而言之,區塊鏈可以讓你在互不信任的人或公司之間安全地進行交易(交易)。 區塊鏈中記錄的資料(交易、個人資料、文件、證書、合約、發票等)記錄後無法篡改或替換。 因此,基於區塊鏈,可以創建各種文件的可信任分散式註冊表等。

當然,您知道加密貨幣系統是在區塊鏈的基礎上創建的,旨在取代普通紙幣。 紙幣也稱為法定貨幣(來自 Fiat Money)。
區塊鏈確保區塊中記錄的交易的儲存和不變性,這就是它可以用來創建加密貨幣系統的原因。 它包含了不同用戶(帳戶)之間加密資金轉移的整個歷史記錄,任何操作都可以被追蹤。

儘管加密貨幣系統內的交易可以是匿名的,但提取加密貨幣並將其兌換為法定貨幣通常會導致加密貨幣資產所有者的身份洩露。

所謂的智慧合約是在以太坊網路上運行的軟體,讓您可以自動完成交易並監控其實施的過程。 如果使用以太加密貨幣進行交易支付,這尤其有效。

以 Solidity 程式語言編寫的以太坊區塊鏈和以太坊智能合約可用於以下領域:

  • 文件公證的替代方案;
  • 儲存房地產對象登記冊及有關房地產對象交易的資訊;
  • 知識產權版權資訊的儲存(書籍、圖像、音樂作品等);
  • 建立獨立投票系統;
  • 金融和銀行業;
  • 國際範圍內的物流,追蹤貨物的流動;
  • 個人資料的儲存類似於身分證系統;
  • 商業領域的安全交易;
  • 儲存體檢結果以及規定程序的歷史記錄

區塊鏈的問題

但是,當然,並非一切都像看起來那麼簡單!

在將資料添加到區塊鏈之前驗證資料存在問題(例如,它們是假的嗎?)、用於與區塊鏈一起工作的系統和應用軟體的安全性問題、使用社會工程方法竊取存取權限的可能性問題到加密貨幣錢包等。

再說一次,如果我們談論的不是節點分散在世界各地的公共區塊鏈,而是屬於個人或組織的私有區塊鏈,那麼這裡的信任等級不會高於信任等級在這個人或這個組織中。

還應該考慮到區塊鏈中記錄的數據可供所有人使用。 從這個意義上說,區塊鏈(尤其是公共的)不適合儲存機密資訊。 然而,區塊鏈上的資訊無法更改這一事實可以幫助預防或調查各種類型的詐欺活動。

如果您使用加密貨幣支付以太坊去中心化應用程式的使用費用,將會很方便。 擁有加密貨幣或願意購買加密貨幣的人越多,DApp 和智能合約就會越受歡迎。

區塊鏈阻礙其實際應用的常見問題包括添加新區塊的速度有限以及交易成本相對較高。 但這領域的技術正在積極發展,技術問題有望隨著時間的推移而解決。

另一個問題是以太坊區塊鏈上的智慧合約在虛擬機器的隔離環境中運行,無法存取現實世界的資料。 特別是,智慧合約程式本身無法從站點或任何實體設備(感測器、觸點等)讀取數據,也無法將數據輸出到任何外部設備。 我們將在專門討論所謂的預言機(智能合約的資訊中介)的課程中討論這個問題以及解決它的方法。

還有法律限制。 例如,在某些國家/地區,禁止使用加密貨幣作為支付手段,但您可以將其作為數位資產(如證券)擁有。 此類資產可以在交易所買賣。 無論如何,在創建使用加密貨幣的項目時,您需要熟悉您的項目所屬國家/地區的立法。

區塊鏈鏈是如何形成的

正如我們已經說過的,區塊鏈是一個簡單的資料塊鏈。 首先,形成該鏈的第一個區塊,然後將第二個區塊添加到其中,依此類推。 假設交易資料儲存在區塊中,並添加到最近的區塊中。

在圖中。 1.1 我們展示了區塊序列最簡單的版本,其中第一個區塊引用下一個區塊。

《為以太坊區塊鏈創建 Solidity 智能合約》一書。 實用指南》
米。 1.1. 簡單的區塊序列

然而,使用此選項,很容易篡改鏈中任何區塊的內容,因為這些區塊不包含任何防止變更的資訊。 考慮到區塊鏈的目的是供彼此之間沒有信任的個人和公司使用,我們可以得出結論,這種儲存資料的方法不適合區塊鏈。

讓我們開始保護積木免遭偽造。 在第一階段,我們將嘗試使用校驗和來保護每個區塊(圖1.2)。

《為以太坊區塊鏈創建 Solidity 智能合約》一書。 實用指南》
米。 1.2. 透過校驗和為這些區塊添加保護

現在攻擊者不能簡單地更改區塊,因為它包含區塊資料的校驗和。 檢查校驗和將顯示資料已變更。

要計算校驗和,可以使用雜湊函數之一,例如 MD-5、SHA-1、SHA-256 等。 雜湊函數透過對資料塊執行不可逆操作來計算值(例如,恆定長度的文字字串)。 這些操作取決於哈希函數的類型。

即使資料區塊的內容發生微小變化,哈希值也會發生變化。 透過分析哈希函數值,不可能重建其計算的資料塊。

這樣的保護足夠嗎? 很不幸的是,不行。

在這個方案中,校驗和(雜湊函數)僅保護單一區塊,而不是整個區塊鏈。 知道計算雜湊函數的演算法後,攻擊者可以輕鬆替換區塊的內容。 此外,沒有什麼可以阻止他從鏈上刪除區塊或添加新區塊。

為了保護整個鏈,您還可以在每個區塊中與資料一起儲存前一個區塊的資料的雜湊值(圖 1.3)。

《為以太坊區塊鏈創建 Solidity 智能合約》一書。 實用指南》
米。 1.3. 將前一個區塊的雜湊值加入到資料區塊中

在這個方案中,為了改變一個區塊,需要重新計算所有後續區塊的雜湊函數。 如此看來,問題出在哪裡呢?

在真實的區塊鏈中,增加新區塊會額外產生人為的困難——使用需要大量計算資源的演算法。 考慮到為了對一個區塊進行更改,您不僅需要重新計算這個區塊,還需要重新計算所有後續區塊,這將是非常困難的。

我們還請記住,區塊鏈資料儲存(重複)在許多網路節點上,即使用分散式儲存。 這使得偽造區塊變得更加困難,因為必須對所有網路節點進行更改。

由於區塊儲存了前一個區塊的信息,因此可以檢查鏈中所有區塊的內容。

以太坊區塊鏈

以太坊區塊鏈是一個可以創造分散式 DApp 的平台。 與其他平台不同,以太坊允許使用所謂的智能合約(智能合約),以 Solidity 程式語言編寫。

該平台由比特幣雜誌創始人 Vitalik Buterin 於 2013 年創建,並於 2015 年推出。 我們在培訓課程中學習或做的所有事情都與以太坊區塊鏈和 Solidity 智能合約特別相關。

挖礦或如何創建區塊

挖礦是一個相當複雜且資源密集的過程,為區塊鏈添加新區塊,根本不是「加密貨幣挖礦」。 挖礦確保了區塊鏈的功能,因為正是這個過程負責將交易添加到以太坊區塊鏈。

參與添加區塊的人和組織稱為礦工。
礦工節點上運行的軟體嘗試為最後一個區塊找到一個名為Nonce的雜湊參數,以獲得網路指定的特定雜湊值。 以太坊中使用的Ethash哈希演算法允許您僅通過順序搜尋即可獲得Nonce值。

如果礦工節點找到了正確的Nonce值,那麼這就是所謂的工作量證明(PoW,Proof-of-work)。 在這種情況下,如果在以太坊網路中增加一個區塊,礦工就會收到一定的網路貨幣獎勵——以太幣。 在撰寫本文時,獎勵為 5 以太幣,但隨著時間的推移,獎勵會減少。

因此,以太坊礦工透過添加區塊來確保網路的運行,並為此獲得加密貨幣資金。 網路上有很多關於礦工和挖礦的信息,但我們將專注於在以太坊網路上創建 Solidity 合約和 DApp。

課程總結

在第一課中,您熟悉了區塊鏈,並了解到它是一種特殊組成的區塊序列。 先前記錄的區塊的內容無法更改,因為這需要在許多網路節點上重新計算所有後續區塊,這需要大量的資源和時間。

區塊鏈可用於儲存交易結果。 其主要目的是組織之間不存在信任的各方(個人和組織)之間的安全交易。 您了解了哪些特定業務領域以及哪些領域可以使用以太坊區塊鏈和 Solidity 智能合約。 這是銀行部門,產權登記,文件等等。

您也了解到使用區塊鏈時可能會出現各種問題。 這些問題包括驗證添加到區塊鏈的資訊、區塊鏈的速度、交易成本、智能合約與現實世界之間的資料交換問題,以及攻擊者旨在從用戶帳戶竊取加密貨幣資金的潛在攻擊。 。

我們也簡要討論了挖礦作為向區塊鏈添加新區塊的過程。 挖礦是完成交易所必需的。 參與挖礦的人確保區塊鏈的運行,並因此獲得加密貨幣獎勵。

第 2 課. 在 Ubuntu 和 Debian 作業系統中準備工作環境選擇作業系統
安裝必要的實用程式
在 Ubuntu 上安裝 Geth 和 Swarm
在 Debian 上安裝 Geth 和 Swarm
初步準備
下載 Go 發行版
設置環境變量
檢查Go版本
安裝 Geth 和 Swarm
創建私有區塊鏈
準備 genesis.json 文件
建立工作目錄
建立一個帳戶
開始節點初始化
節點啟動選項
連接到我們的節點
採礦管理和平衡檢查
關閉 Geth 控制台
課程總結

第3課. 準備Raspberry Pi 3上的工作環境準備 Raspberry Pi 3 進行工作
安裝拉斯伯里安
在安裝更新
啟用 SSH 訪問
設定靜態IP位址
安裝必要的實用程式
安裝Go
下載 Go 發行版
設置環境變量
檢查Go版本
安裝 Geth 和 Swarm
創建私有區塊鏈
檢查您的帳戶和餘額
課程總結

第 4 課. 帳戶和帳戶之間的資金轉移查看和新增帳戶
查看帳戶列表
新增帳戶
geth 帳號指令選項
帳號密碼
以太坊中的加密貨幣
以太幣貨幣單位
我們確定帳戶的當前餘額
將資金從一個帳戶轉移到另一個帳戶
eth.sendTransaction方法
查看交易狀態
交易收據
課程總結

第 5 課. 發布您的第一份合同以太坊中的智能合約
智能合約執行
以太坊虛擬機
整合開發環境 Remix Solidity IDE
運行編譯
呼叫合約函數
在專用網路上發布合約
取得ABI定義和合約二進位代碼
合約的公佈
檢查合約發布交易狀態
呼叫合約函數
批次編譯solc
在 Ubuntu 上安裝 solc
在 Debian 上安裝 solc
編譯HelloSol合約
合約的公佈
在 Rasberian 上安裝 solc
課程總結

第 6 課:智能合約和 Node.js安裝 Node.js
在 Ubuntu 上安裝
在 Debian 上安裝
安裝並執行 Ganache-cli
Web3安裝
安裝solc
在 Rasberian 上安裝 Node.js
用於在控制台中取得帳戶清單的腳本
用於發布智能合約的腳本
啟動並取得參數
取得啟動選項
合約編制
解鎖您的帳戶
載入ABI和合約二進位代碼
估計所需的氣體量
建立物件並開始發布合約
運行合約發布腳本
呼叫智能合約函數
是否可以更新已發布的智慧合約?
使用 Web3 版本 1.0.x
取得帳戶列表
合約的公佈
呼叫合約函數
將資金從一個帳戶轉移到另一個帳戶
轉帳至合約帳戶
更新HelloSol智慧合約
建立腳本來查看您的帳戶餘額
將對 getBalance 函數的呼叫加入到 call_contract_get_promise.js 腳本中
我們為智能合約帳戶充值
課程總結

課 7. 松露簡介安裝松露
創建HelloSol項目
建立專案目錄和文件
合約目錄
目錄遷移
目錄測試
truffle-config.js 文件
編譯HelloSol合約
開始發布合約
在 Truffle 提示下呼叫 HelloSol 合約函數
從執行 Node.js 的 JavaScript 腳本呼叫 HelloSol 合約函數
安裝 truffle-contract 模組
呼叫合約函數 getValue 和 getString
呼叫合約函數setValue和setString
合約修改及重新公佈
使用 Web3 版本 1.0.x
更改 HelloSol 智能合約
呼叫合約方法的腳本
在松露中測試
堅固性測試
JavaScript 測試
課程總結

第 8 課:Solidity 資料類型學習資料類型的契約
布林資料類型
無符號整數和有符號整數
訂點數
地址
複雜類型的變數
固定大小的數組
動態數組
枚舉
結構
字典映射
課程總結

第 9 課. 將合約遷移到專用網路和 Rinkeby 網絡將合約從 Truffle 發佈到私人 Geth 網絡
準備私有網路節點
準備工作合約
編譯合約並將其遷移到 Truffle 網絡
啟動本地網路遷移 geth
取得松露文物
將 Truffle 合約發佈到 Rinkeby 測試網
準備 Geth 節點以與 Rinkeby 一起使用
節點同步
新增帳戶
用以太幣充值您的 Rinkeby 帳戶
啟動合約遷移至 Rinkeby 網絡
查看 Rinkeby 網路上的合約訊息
Rinkeby 網路的 Truffle 控制台
呼叫合約函數的更簡單方法
使用 Node.js 呼叫合約方法
在 Rinkby 的 Truffle 控制台中的帳戶之間轉移資金
課程總結

第 10 課:以太坊 Swarm 去中心化資料存儲以太坊群是如何運作的?
安裝並啟動 Swarm
檔案和目錄的操作
將檔案上傳到以太坊 Swarm
從以太坊 Swarm 讀取文件
查看上傳文件的清單
載入帶有子目錄的目錄
從下載的目錄中讀取文件
使用公共 Swarm 網關
從 Node.js 腳本存取 Swarm
Perl Net::以太坊::Swarm 模組
安裝 Net::Ethereum::Swarm 模組
寫入和讀取數據
課程總結

第 11 課:在 Python 中使用以太坊的 Web3.py 框架安裝Web3.py
更新並安裝必要的軟體包
安裝easysolc模組
使用 Web3.py 發布合約
合約編制
連接到提供者
執行合約發布
將合約地址和abi保存在文件中
運行合約發布腳本
呼叫合約方法
從 JSON 檔案讀取合約的地址和 abi
連接到提供者
建立合約對象
呼叫合約方法
Truffle 和 Web3.py
課程總結

課 12. 神諭智能合約可以信任來自外界的資料嗎?
預言機作為區塊鏈資訊中介
數據源
表示原始資料的程式碼
Oracle 用於在區塊鏈中記錄匯率
美元匯率甲骨文合約
更新智能合約中的匯率
使用 Web Socket 提供者
等待 RateUpdate 事件
處理 RateUpdate 事件
在智能合約中啟動資料更新
課程總結

來源: www.habr.com

添加評論