區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

區塊鏈 JavaScript 腳本語言 JSON 編譯器 編程語言 Git 文章 區塊鏈研究實驗室 2019-06-21
區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

以太坊智能合約的發展在2018年呈指數級增長,2019年似乎將遵循這一趨勢。有些框架,如Truffle,可以幫助我們快速構建和維護智能合約,如果您想讓親自動手體驗的話,我將解釋如何編譯您的智能合約,並使用自己的腳本將其部署到以太坊網絡(Rinkeby、Ropsten或Mainnet)。

注意:我將使用簡單的智能合約,因為本文的目的只是展示如何編譯和部署腳本。

項目具有以下結構:

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

文件夾合同包含我們的智能合約(您可以根據需要擁有任意多個智能合約)。對於這篇文章,我們將使用兩個簡單的智能合約:

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

MyContractA.sol

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

MyContractA.sol

如您所見,我們有兩個文件,其中一個包含兩個智能合約,證明我們可以擁有任意數量的智能合約。

腳本編譯

現在,一旦我們有了初始項目結構和智能合約,就可以開始構建編譯腳本了。

該腳本的目的是為每個合約生成一個JSON(在這種情況下,我們將使用三個JSON完成編譯過程),每個JSON都包含已編譯的合同信息。 這些JSON將存儲在名為build /的輸出路徑中

構建腳本的步驟如下:

  1. 創建構建/目錄。
  2. 獲取我們的合同來源。
  3. 編譯合同並將輸出寫入文件。

第1步 - 創建build/文件夾。

這一步是最簡單的,因為我們只需要瞭解JavaScript的一些基礎知識(這裡不需要以太坊概念)。

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

現在要將所有文件的來源都放到智能合約文件夾中。 在這一步中,只需要JavaScript就不需要以太坊概念,但還是有點複雜。

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

對於contracts文件夾中的每個文件,我們在sources對象中添加一個新字段(我們將在步驟3中看到這個sources的用途),其中鍵是文件名,值是.sol文件的內容。

第3步 - 編譯並寫入輸出

現在我們已經有了輸出文件夾和智能合約的內容,是時候編譯它們了(是的!最後出現了以太坊部分)。

首先,我們必須定義一個對象,該對象將作為Solidity編譯器的信息輸入。

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

  1. language:我們智能合約的編程語言,目前是使用Solidity,但你也可以選擇其他編程語言(Viper)。
  2. sources:我們合同的內容。
  3. settings:此選項告訴編譯器我們想要生成哪些輸出字段。 對於此示例,我選擇sources中的所有文件生成abi和evm.bytecode。 這兩條信息是部署階段所必需的。

一旦我們有了編譯器的配置對象,我們就可以執行它了。

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

第一行獲取一個包含我們編譯的腳本的對象。 兩個for循環允許我們在不同的JSON文件中存儲單個.sol文件中的智能合約(在我們的例子中就像MyContractA.sol)。

最後一步是把這三部分連接在一起

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

這樣我們就完成了編譯腳本。如果我們運行它,項目結構應該如下所示:

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

我們已經gitignored build文件夾,因為沒有意義在Git下跟蹤它。

現在我們已經編輯了我們的智能合約,是時候將它們部署到區塊鏈上了。

腳本部署

是時候將我們的智能合約部署到以太坊區塊鏈上了(在這種情況下,部署將針對Rinkeby,因此不會使用到主鏈上,但過程與其他以太坊區塊鏈類似)。

首先,我們需要兩件事來將智能合約部署到區塊鏈:

  1. 解鎖帳戶由於我們需要使用gas來發送將創建智能合約的交易。
  2. 連接到區塊鏈的節點:我們正在向網絡發送交易,因此我們需要連接到鏈上。

關於第一點,我們將使用HDWalletProvider,這個工具(感謝Truffle :))允許我們使用助記符十二個單詞短語解鎖帳戶並連接到以太坊節點。但是......節點在哪裡?好吧,我們可以做兩件事,運行我們自己的以太坊節點(這是我不推薦的事情,至少是為hobbie開發dApps)或使用Infura。 Infura是一項服務,它允許我們連接到以太坊網絡,而無需運行我們自己的以太坊節點。所以,我們似乎已經涵蓋了兩點。

解鎖帳戶並連接到以太坊節點。

要使用Infura,我們需要在其頁面中註冊。它將生成我們需要使用其服務的API密鑰(它是完全免費的)。

我們將使用Web3JS與區塊鏈進行交互。 Web3需要提供程序來連接節點並與節點交互。這個提供程序是HDWalletProvider,我們來配置它和Web3。

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

HDWalletProvider的第一個參數是我們的12個單詞助記詞。 這個短語允許提供者解鎖帳戶(它默認解鎖多個帳戶但我們此時只需要第一個),第二個參數告訴提供者以太網節點在哪裡,在這種情況下我們通過Infura連接(如果 你使用自己的節點,它應該看起來像ws:// localhost:4535或你的節點在哪裡)。

最後我們在web3中設置了提供者。

通過正確配置web3,我們可以最終部署合同。

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

首先,我們需要我們編譯的腳本(我們只需要部署一個腳本,但是其他流程是相同的,或者你可以構建一些邏輯來逐個編譯和部署)。

然後,在第8行中,我們使用Web3API創建智能合約,並將智能合約的接口傳遞給它。接下來,我們需要創建一個包含智能合約信息的部署事務:

  1. data:合同的字節代碼。它以0x開頭表示它是十六進制的。
  2. arguments:我們的智能合約構造函數的參數(如果構造函數沒有參數則不需要)。

創建事務後,我們將其發送到以太坊區塊鏈,以便為節點處理它:

  1. from:簽署交易併發送的帳戶。在第4行中,我們獲得了HDWalletProvider生成和解鎖的帳戶以及12個單詞短語。
  2. gas:我們想要用於發送交易的最大gas量。

第18行的console.log對於獲取部署合同的地址很重要,這樣我們將來可以將其用於DAPP、用於其他合同等。

腳本的最後一行告訴提供程序結束與以太坊節點的連接。

如果我們執行腳本,一段時間後,我們將獲得如下跟蹤:

區塊鏈研究實驗室 | 使用JavaScript編譯和部署以太坊智能合約

現在我們可以訪問EtherScan並查看我們在區塊鏈中部署的智能合約。

最後,我們已經部署了智能合約,並且每個人都可以訪問。 我希望這篇文章有所幫助。


相關推薦

推薦中...