nodejs部署智能合約的方法-web3 0.20版本


參考:https://www.jianshu.com/p/7e541cd67be2

部署智能合約的方法有很多,比如使用truffle框架,使用remix-ide等,在這里的部署方法是使用nodejs一步步編譯部署實現的:

const Web3 = require('web3');
const web3 = new Web3();//使用web3來進行區塊鏈接口的調用

//通過rpc連接區塊鏈,這里連接的是本地私有鏈
web3.setProvider(new Web3.providers.HttpProvider(‘http://127.0.0.1:7545'));
const fs = require("fs");
const solc = require("solc");
let source = fs.readFileSync(“token.sol",'utf8');//讀取sol智能合約文件
//對智能合約進行編譯,第二個參數設置為1可以激活優化器optimiser
let compiledContract = solc.compile(source,1);

for (let contractName in compiledContract.contracts) {
    var bytecode = compiledContract.contracts[contractName].bytecode;//獲得編譯后合約的bytecode
    var abi = JSON.parse(compiledContract.contracts[contractName].interface); //獲得編譯后合約的abi並寫成json形式
}

let gasEstimate = web3.eth.estimateGas({data:’0x’+bytecode});//獲得這個合約部署大概所需的gas
let MyContract = web3.eth.contract(abi);

 

//上面是編譯生成了Abi的方法,之后就有兩種進行使用的情況:
(1)
//當從來沒有部署過時,這里的gas例子上是gas:gasEstimate,但是我發現有些時候好像過小而不能成功,所以我每次為了保證能夠絕對地成功,都設為一個很大的數,反正用不完會返回來的,你也可以設置為gas:gasEstimate,但是如果后面有發現有錯誤,很有可能是這里的問題

    var instance = MyContract.new(50,{from:user1,data:'0x'+bytecode,gas:47000000},function(e,contract){
             if(typeof contract.address !== 'undefined'){
                console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
            }
    });


然后后面就可以使用instance來調用智能合約中的函數等信息了

(2)

//當已經在私有鏈上部署過時,里面的地址即為上面的方法得到的contract.address

let instance = MyContract.at('0x86757c9bdea10815e7d75a1577b6d9d2825dae0a');//可改

 

不過這種方式有一個問題,就是在發布合約時,你的私鑰處於聯網狀態,
處於安全策略,我們需要盡量避免私鑰在聯網狀態。

以太坊上部署合約是向空地址發送一個附有字節碼的簽名交易,其中發送者就是這個合約的擁有者。

因此我們只需要將合約構建成一筆交易,我們在無網狀態下對這筆交易進行簽名,然后將簽名發送到以太坊網絡中。這樣能夠降低我們私鑰被泄漏的風險。
在這里要使用方法進行合約部署,參考:https://my.oschina.net/u/3794778/blog/1801897

web3.eth.sendRawTransaction(signedTransactionData [, callback])

參數:

    signedTransacionData: String - 16進制格式的簽名交易數據。 callback: Function - 回調函數,用於支持異步的方式執行7。 返回值: String - 32字節的16進制格式的交易哈希串。 示例: 
var Tx = require('ethereumjs-tx');//ethereumjs-tx 提供了私鑰到公鑰的轉換方法
//你自己的私鑰
var privateKey = new Buffer('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex'); //構造的交易中,是不需要包含 from 的,因為這個交易是通過私鑰簽名的,而私鑰生成的簽名是可以還原出公鑰地址的,所以交易本身不需要冗余存儲發送方信息。 var rawTx = {
//這個字段需要取你的發送賬號所發起的交易的計數器,可以通過 eth_getTransactionCount 來獲取當前的 nonce,直接用,不用加1 nonce:
'0x00', gasPrice: '0x09184e72a000', gasLimit: '0x2710', to: '0x0000000000000000000000000000000000000000', //to到空地址 value: '0x00', //可以省略 data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057'//就是之前生成的'0x'+bytecode } var tx = new Tx(rawTx); tx.sign(privateKey); var serializedTx = tx.serialize();
//這里得到的值就是需要的16進制格式的簽名交易數據
//console.log(serializedTx.toString('hex')); //0xf889808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000571ca08a8bbf888cfa37bbf0bb965423625641fc956967b81d12e23709cead01446075a01ce999b56a8a88504be365442ea61239198e23d1fce7d00fcfc5cd3b44b7215f web3.eth.sendRawTransaction(serializedTx.toString('hex'), function(err, hash) { if (!err) console.log(hash); // "0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385"這里得到的就是交易成功返回的交易hash });

最后,生成的字節碼可以直接到第三方,比如 https://etherscan.io/pushTx 來廣播你的交易,如果廣播失敗,可以直接看到錯誤提示信息

下面這個網址是對 etherscan這個工具的解釋解釋得很好,可以看看
http://8btc.com/thread-75748-1-7.html




免責聲明!

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



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