1. 程式人生 > >用web3.js與智慧合約互動(修改版)

用web3.js與智慧合約互動(修改版)

工具:Truffle v4.0.4  
ganache-1.1.0-beta(ui介面版)
nodejs 8.9.4
npm 5.6.0   
web3 1.0.0

思路:

1、先用truffle建立一個以太坊智慧合約專案,部署在ganache測試網路。

2、用npm建立另外一個專案,使用web3和智慧合約互動

建立truffle專案:

1、mkdir truffle_test & cd truffle test

2、初始化:truffle init

3、編寫智慧合約,在contracts資料夾下新建智慧合約:Data.sol:(功能:存、取一個字串)

  1. pragma solidity ^0.4.17;

  2. contract Data{

  3. string public data;

  4. function Data()public{

  5. data = "init data";

  6. }

  7. function setData(string str) public payable{

  8. data = str;

  9. }

  10. function getData() public view returns (string) {

  11. return data;

  12. }

  13. }

4、編譯:truffle compile

5、部署在測試網路上

(1)開啟ganache

(2)修改migrations資料夾下的部署配置

  1. var Migrations = artifacts.require("./Migrations.sol");

  2. var Data = artifacts.require("./Data.sol");

  3. module.exports = function(deployer) {

  4. deployer.deploy(Migrations);

  5. deployer.deploy(Data);

  6. };

(3)修改truffle.js配置檔案,新增連線網路資訊:

  1. module.exports = {

  2. networks: {

  3. development: {

  4. host: "localhost",

  5. port: 7545,

  6. network_id: "*"

  7. }

  8. }

  9. };

(4)執行truffle migrate(如果執行失敗,可以試試truffle migrate --reset)

現在truffle專案已經做好,接下來使用web3和智慧合約進行互動。

web3與智慧合約互動

新增web3到專案中:

1、mkdir web3test & cd web3test

2、初始化 npm init

3、下載web3.js到專案中:

npm install web3 --save

以上命令會將web3.js下載到web3test/node_modules目錄下,其中--save引數會web3.js新增到package.json配置檔案中。

4、建立web3物件

要使用web3.js與區塊鏈互動,需要先建立web3物件,然後連線到以太坊節點。
在web3test目錄下新建index.js檔案,在其中輸入以下程式碼:

  1. var Web3 = require("web3");

  2. var web3 = new Web3();

  3. web3.setProvider(new Web3.providers.HttpProvider("http://localhost:7545"));

5、獲取已部署的智慧合約例項

  1. var abi = [{"constant":true,"inputs":[],"name":"getData","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"str","type":"string"}],"name":"setData","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"data","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}];

  2. var address = '0x345ca3e014aaf5dca488057592ee47305d9b3e10';

  3. var data = new web3.eth.Contract(abi,address);

合約地址取得:

truffle的智慧合約專案部署,使用下面的命令:"truffle migrate",這個命令會執行所有migrations目錄下的js檔案。使用 "truffle migrate --reset"命令,則會重新執行所有指令碼的部署。

如果要部署到指定的網路,可以使用"truffle migrate --network live"命令。

執行完“truffle migrate --reset”後,build/Data.json 裡會在最後出現 address地址;

其中abi是truffle專案中build目錄下Data.json檔案中的abi,複製過來即可。address是合約部署的地址。通過abi和合約地址就可以獲取合約的例項data。下面就可以通過data來呼叫合約裡面的內容了。

6、呼叫合約函式

  1. data.methods.getData().call(null,function(error, result){

  2. console.log("the data:"+result);

  3. });

  4. data.methods.setData("hello blockchain").send({from: '0x627306090abaB3A6e1400e9345bC60c78a8BEf57'}).on('transactionHash', function(hash){

  5. console.log("hash:", hash);

  6. data.methods.getData().call(null,function(error, result){

  7. console.log("the data:"+result);

  8. });

  9. });

call()和send()的作用可以從官方文件中檢視。send裡面的from是傳送交易的地址,這裡我寫的是ganache中第0個賬戶的地址。

以上的執行結果是:

the data:init data
the data:hello blockchain
hash: 0x86a8674614c5ac4772cdf3aba6bf2786d366460bb524e49b8012b5dbe89b64dd