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

來源:互聯網
上載者:User

標籤:col   網路   pil   ali   cal   callback   func   thread   .so   

參考: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可以啟用最佳化器optimiserlet 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});//獲得這個合約部署大概所需的gaslet 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‘));//0xf889808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000571ca08a8bbf888cfa37bbf0bb965423625641fc956967b81d12e23709cead01446075a01ce999b56a8a88504be365442ea61239198e23d1fce7d00fcfc5cd3b44b7215fweb3.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



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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.