基於windows10以太坊私有鏈eth搭建DApp開發環境並演示HelloWorld智能合約


基於windows10以太坊私有鏈eth安裝DApp開發環境

本文是學習篇,參考網絡上一系列的DApp開發環境搭建,結合自己在本機測試驗證所寫,便於加深對智能合約了解。

1.1  准備階段

本文搭建的環境基於windows10(家庭版),獲取相關軟件版本如下:

  • Node.js:v8.11.3
  • solcjs :0.40.2+commit.3155dd80.Emscripten.clang
  • web3:0.20.2
  • Truffle:v4.1.3 (core 4.1.3)
  • Webpack:3.11.0

備注:本文搭建的環境沒有安裝節點仿真器ganache,是直接部署以太坊私有鏈eth。

太坊私有鏈eth搭建請參考另外一篇文章:

https://www.cnblogs.com/taoweizhong/p/10459379.html

 

第一步:安裝Node.js

打開官網下載鏈接:https://nodejs.org/en/download/ 下載對應你系統的Node.js版本

Node.js 就是運行在服務端的 JavaScript。Node.js 是一個 JavaScript 運行環境。Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。Node.js 的包管理器 npm,是全球最大的開源庫生態系統。下載64位包裝包,下載后直接安裝即可。安裝完畢,打開一個控制台窗口,可以使用node了:

C:\Users\45014>node -v

v8.11.3

此處說明下:新版的Node.js已自帶npm,安裝Node.js時會一起安裝,npm的作用就是對Node.js依賴的包進行管理,也可以理解為用來安裝/卸載Node.js需要裝的東西。

說明:這里的環境配置主要配置的是npm安裝的全局模塊所在的路徑,以及緩存cache的路徑,之所以要配置,是因為以后在執行類似:npm install express [-g] (后面的可選參數-g,g代表global全局安裝的意思)的安裝語句時, 會將安裝的模塊安裝到  C:\Users\45014\AppData\Roaming\npm

第二步:安裝solidity編譯器

C:\Users\45014> npm install –g solc

安裝完畢后,執行命令驗證安裝成功

C:\Users\45014> solcjs –version

0.40.2+commit.3155dd80.Emscripten.clang

第三步:安裝web3

C:\Users\45014> npm install –g web3@0.20.2

安裝驗證:

C:\Users\hubwiz> node –p 'require("web3")'

{[Function: Web3]

  providers:{…}}

第四步:安裝truffle框架

執行以下命令安裝truffle開發框架:

C:\Users\45014> npm install –g truffle

驗證安裝:

C:\Users\45014> truffle.cmd version

Truffle v4.1.3 (core 4.1.3)

第五步:安裝webpack

執行以下命令安裝webpack:

C:\Users\45014> npm install –g webpack@3.11.0

驗證安裝:

C:\Users\45014> webpack –v

3.11.0

1.2  智能合約開發

1.2.1  創建合約項目

 D:\Study\geth> mkdir test

D:\Study\geth\test>cd test

D:\Study\geth\test>mkdir HelloWorld

D:\Study\geth\test>cd HelloWorld

D:\Study\geth\test\ HelloWorld >truffle init

此時會出現如下錯誤:

truffle initDownloading…Error: Truffle Box

at URL https://github.com/truffle-box/bare-box.git doesn’t exist. If

you believe this is an error, please contact Truffle support.

解決方法可以是直接git代碼取代truffle init命令

git clone https://github.com/truffle-box/bare-box

后續的命令需要先執行:cd bare-box

以上兩條命令的功能就相當於truffle init,自動生成好了框架。

  

 

目錄結構說明:

contracts/:Truffle默認的合約文件存放地址;

migrations/:存放發布的腳本文件;

test/:存放測試應用和合約的測試文件;

truffle-config.js:Truffle的配置文件。

 

1.2.2  編寫與部署合約

第一步:在 contracts 文件夾下新建 HelloWorld.sol 文件:

D:\Study\geth\test\ HelloWorld\ bare-box> cd contracts/
D:\Study\geth\test\ HelloWorld\ bare-box\contracts> truffle create contract HelloWorld

 

編寫一個簡單的HelloWorld代碼如下: 

pragma solidity ^0.4.22;

contract HelloWorld {

  function sayHello() public pure returns (string) {

    return ("Hello World");

    }

}

 

 第一行指名目前使用的 solidity 版本,不同版本的 solidity 可能會編譯出不同的 bytecode。^ 代表兼容。

contract 關鍵字類似於其他語言中較常見的 class。因為solidity 是專為智能合約(Contact)設計的語言,聲明 contract 后即內置了開發智能合約所需的功能。也可以把這句理解為 class HelloWorld extends Contract。

函數的結構與其他程序類似,但如果有傳入的參數或回傳值,需要指定參數或回傳值的類型(type)。


第二步: 編譯合約:

現在執行 truffle compile 命令,我們可以將 HelloWorld.sol 原始碼編譯成 Ethereum bytecode:

D:\Study\geth\test\HelloWorld\bare-box>truffle compile

Compiling .\contracts\HelloWorld.sol...

Writing artifacts to .\build\contracts

命令運行成功后會多出一個 build 的目錄,如下:

 

在 HelloWorld 文件夾下面的 build/contracts 文件夾下面會看見 HelloWorld.json 文件:

 

 

第三步:修改 truffle-config.js 文件內容:

添加以下內容到truffle-config.js文件並保存 :

  networks: {

      development: {

      host: 'localhost',

      port: 8545,

      network_id: '*' // Match any network id

    }

第四步:在 migrations 目錄下創建移植文件:

D:\Study\geth\test\HelloWorld\bare-box\migrations>truffle create migration deploy_helloworld

查看目錄,生成如下文件:

  

修改1552730530_deploy_helloworld.js

var HelloWorld = artifacts.require("./HelloWorld.sol");

 module.exports = function(deployer) {

  deployer.deploy(HelloWorld);

};

 

使用 artifacts.require 語句來取得准備部署的合約。
使用deployer.deploy 語句將合約部署到區塊鏈上。這邊HelloWorld 是 contract 的名稱而不是文件名。因此可以用此語法讀入任一 .sol 文件中的任一合約。

 

第五步:執行 truffle migrate 命令:

D:\Study\geth\test\HelloWorld\bare-box>truffle migrate

Using network 'development'.

 

Running migration: 1_initial_migration.js

  Deploying Migrations...

  ... undefined

Error encountered, bailing. Network state unknown. Review successful transactions manually.

Error: account is locked

    at Object.InvalidResponse (C:\Users\45014\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\errors.js:38:1)

在部署合約時需要一個解鎖的賬戶。在geth控制台使用personal對象的unlockAccount()方法來解鎖指定的賬戶,參數為賬戶地址和賬戶密碼(在創建賬戶時指定的那個密碼):

在eth執行:

> personal.unlockAccount(eth.accounts[0])

Passphrase:

true

 

然后再次執行:

D:\Study\geth\test\HelloWorld\bare-box>truffle migrate

Using network 'development'.

Running migration: 1_initial_migration.js

  Deploying Migrations...

  ... 0x87a3f9c57e1d01bcd8f138c67167028444c1de145596338a0af9e571f654984f

  Migrations: 0x5980c9cfbe8dac5a7f0b100c6fad75ec7b7763bb

Saving artifacts...

Running migration: 1552730530_deploy_helloworld.js

  Replacing HelloWorld...

  ... 0x1e24213f8f21917d9d2159b3b43845b1fb13f19ebc5045b0b8976224ba136294

  HelloWorld: 0x613f2408babedbadd55783bd60a893cd4a89c0b9

Saving artifacts...

 

(此時會停在部署階段,需要啟動挖礦,才可以部署完成)

 

 我們先看下是否有交易在處理,在eth下執行命令。

> txpool.status

{

  pending:1,

  queued:0

}

 

的確有一個掛起的交易!下面開啟啟動挖礦:

> miner.start(1)

 ...

I0316 21:08:35.926452 eth/api.go:1191] Tx(0x1e24213f8f21917d9d2159b3b43845b1fb13f19ebc5045b0b8976224ba136294) created: 0x613f2408babedbadd55783bd60a893cd4a89c0b9

I0316 21:08:37.285819 miner/worker.go:339] ??  Mined block (#224 / 2190b58b). Wait 5 blocks for confirmation

I0316 21:08:37.286816 miner/worker.go:573] commit new work on block 225 with 1 txs & 0 uncles. Took 0

I0316 21:08:37.288811 miner/worker.go:435] ?? ??  Mined 5 blocks back: block #219

I0316 21:08:37.289809 miner/worker.go:573] commit new work on block 225 with 1 txs & 0 uncles. Took 0

I0316 21:08:42.536780 miner/worker.go:339] ??  Mined block (#225 / d5e9a63b). Wait 5 blocks for confirmation

I0316 21:08:42.536780 miner/worker.go:573] commit new work on block 226 with 0 txs & 0 uncles. Took 0

I0316 21:08:42.538776 miner/worker.go:435] ?? ??  Mined 5 blocks back: block #220

I0316 21:08:42.542765 miner/worker.go:573] commit new work on block 226 with 0 txs & 0 uncles. Took 964.2μs

部署成功以后,我們可以得到合約的地址:0x613f2408babedbadd55783bd60a893cd4a89c0b9,后面會使用這個地址來實現與合約的交互,這里需要先記錄下來。

 

稍等一段時間,再查看交易池的狀態:

> txpool.status

{

  pending:0,

  queued:0

}

交易已經成功提交了,然后我們可以停止挖礦了:

> miner.stop()

 

1.3  與合約交互

第一步:首先我們找到build/contracts/Helloworld.json中的abi的value,通過json壓縮成一行在eth命令行執行:

abi= [{ "constant": true, "inputs": [], "name": "sayHello","outputs": [ { "name": "", "type": "string" } ],"payable": false,"stateMutability": "pure", "type": "function"}]

 

 第二步:注冊合約對象:

> hello = eth.contract(abi).at('0x613f2408babedbadd55783bd60a893cd4a89c0b9')

{

  abi: [{

      constant: true,

      inputs: [],

      name: "sayHello",

      outputs: [{...}],

      payable: false,

      stateMutability: "pure",

      type: "function"

  }],

  address: "0x613f2408babedbadd55783bd60a893cd4a89c0b9",

  transactionHash: null,

  allEvents: function(),

  sayHello: function()

}

第三步:對象注冊成功以后,就可以像正常合約那樣去調用了。

 

> hello.sayHello()

"Hello World"

> hello.sayHello()

"Hello World"

這就是一個最基本的部署完成了第一個智能合約,也驗證了合約確實可以運作,雖然沒有實際意義,但可以幫助我們開始學習並了解智能合約


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM