我們脫離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....
智慧型合約的理念
何謂 抵押品 抵押品 的目的是什麼?它怎樣梳理了我們的已有的關係?我認為,尤其是合約的規範化,為我們的關係實現了理想化抵押品的藍圖。多種型別的合同條款,如抵押品,債券,產權界定等等,都可以嵌入在我們執行條款的硬體和軟體中,通過這樣的方式使那些不遵守協議者的違約成本很高,如果需要的話,令人望而卻步的 ...
智慧型合約的公升級
做軟體開發的都知道,沒有完美的 在當前設計的時候由於考慮不完備或者後續需要增加一些新功能,需要對軟體進行迭代公升級。在以太坊的智慧型合約中也存在這種情況,由於功能的完善可能會 公升級 智慧型合約。大家都知道,部署到鏈上的合約 是不可修改的,怎麼實現合約 的 公升級 呢?比如小強就讀某小學二年級,納入...