智慧型合約的手動編譯,測試,部署,互動

2021-08-27 05:32:45 字數 3326 閱讀 1199

我們脫離remix環境,或者說對remix的工作原理自己實現,對智慧型合約進行手動編譯,測試,部署,呼叫,徹底理解remix背後工作的原理。

專案的結構如圖

contracts存放合約原始碼

test存放合約測試檔案

compile.js是合約編譯檔案

deploy是合約部署檔案

package.json內容如下:

,

"scripts": ,

"author": "",

"license": "isc",

"dependencies":

}

可以看出該專案我們使用solc進行編譯,mocha進行測試,測試環境使用ganache,

真實環境則使用truffle-hdwallet-provider,互動使用web3

第一步,合約原始碼

pragma solidity ^0.4.17;

contract inbox

string message;

function setmessage(string str) public

function getmessage() view public returns (string)

}

非常簡單的業務,就是向以太坊寫訊息,看訊息。

第二步,編譯合約

const path = require('path');

const fs = require('fs');

const solc = require('solc');

const srcpath = path.resolve(__dirname, 'contracts', 'inbox.sol');

const contractcode = fs.readfilesync(srcpath, 'utf-8');

const compile = solc.compile(contractcode, 1);

console.log("compile:", compile)

//export

module.exports = compile.contracts[':inbox'];

核心** solc.compile(contractcode)

就是使用solc(remix的編譯環境)對原始碼進行編譯,最後我們將 :inbox資料匯出,後面有地方用到

第三,合約測試

我們在package.json中指定了測試框架使用mocha

我們再使用ganache提供的的測試環境

const assert = require('assert');

const ganache = require('ganache-cli');

const web3 = require('web3');

const web3 = new web3(ganache.provider());//測試環境

const = require('../compile')

beforeeach(() => );

describe("test contract", () => )

.send();

//合約位址

console.log("address:" + result.options.address);

//呼叫合約方法getmessage()

let message = await result.methods.getmessage().call();

console.log("message method value:" + message);

assert.equal(message, "sun");

//呼叫合約方法setmessage(),注意該方法由於向以太坊寫入資料,需要花費gas

await result.methods.setmessage("sungege").send();

//驗證getmessage的值是否寫入成功

message = await result.methods.getmessage().call();

console.log("message method value:" + message);

assert.equal(message, "sungege");

});});

測試框架跑起來只需 npm run test即可

第四步,測試通過後,部署到真實網路,假如我們部署到rinkeby網路

我們知道,在remix環境中選用injected web3時我們是通過metamask來支援部署的

metamask需要你的12個助記詞以及他背後的以太坊**商infura來和以太坊網路進行通訊

這裡我們選用truffle-hdwallet-provider來代替metamask的功能

使用infura需要先註冊,建專案得到各個網路的endpoint,這裡我們使用rinkby,因此採用相應的rinkby節點

const web3 = require('web3');

const = require('./compile');

const hdwalletprovider = require("truffle-hdwallet-provider");

//12個助記詞

let mnemonic = "usual sentence...";

/** * just like metamask ,use mnemonic and infura

* @type

*/let provider = new hdwalletprovider(mnemonic, "");

//web3的網路切換到以太坊真實網路,而不是之前的ganache了

const web3 = new web3(provider);

deploy = async () => )

.send();

console.log("address:" + result.options.address);

};deploy();

我們只需要node deploy.js就可以部署了

部署成功後,我們會得到合約在以太坊rinkeby上的位址

根據該位址,可以索引到合約例項

在remix環境中,我們輸入該位址,就可得到我們寫的合約的api,進入進行互動

以上就是合約編譯測試部署互動的全流程,就是remix背後的工作原理

NEO智慧型合約黑盒測試框架

最近在做nns合約測試工具,目標是簡單好用,適用非技術人員測試,同時開發快捷,實現快速。再寫完後,發現這不就是乙個neo智慧型合約黑盒測試框架嗎嘛,所以寫個文章分享給大家。選擇的 平台是c 顯示和邏輯處理分開兩部分,邏輯部分用netstandard2.0 同時支援.net framework4.6....

智慧型合約的理念

何謂 抵押品 抵押品 的目的是什麼?它怎樣梳理了我們的已有的關係?我認為,尤其是合約的規範化,為我們的關係實現了理想化抵押品的藍圖。多種型別的合同條款,如抵押品,債券,產權界定等等,都可以嵌入在我們執行條款的硬體和軟體中,通過這樣的方式使那些不遵守協議者的違約成本很高,如果需要的話,令人望而卻步的 ...

智慧型合約的公升級

做軟體開發的都知道,沒有完美的 在當前設計的時候由於考慮不完備或者後續需要增加一些新功能,需要對軟體進行迭代公升級。在以太坊的智慧型合約中也存在這種情況,由於功能的完善可能會 公升級 智慧型合約。大家都知道,部署到鏈上的合約 是不可修改的,怎麼實現合約 的 公升級 呢?比如小強就讀某小學二年級,納入...