部署智能合约到公链
🍁博主簡(jiǎn)介:
????????🏅云計(jì)算領(lǐng)域優(yōu)質(zhì)創(chuàng)作者
????????🏅2022年CSDN新星計(jì)劃python賽道第一名
????????🏅2022年CSDN原力計(jì)劃優(yōu)質(zhì)作者
????????🏅阿里云ACE認(rèn)證高級(jí)工程師
????????🏅阿里云開(kāi)發(fā)者社區(qū)專(zhuān)家博主
💊交流社區(qū):CSDN云計(jì)算交流社區(qū)歡迎您的加入!
目錄
1.?連接公鏈
1.1設(shè)置錢(qián)包
1.2 連接以太坊節(jié)點(diǎn)
1.3 更新項(xiàng)目設(shè)置
1.4 訪(fǎng)問(wèn)以太坊節(jié)點(diǎn)
2.?部署智能合約到公鏈
2.1獲取測(cè)試以太幣
2.2 部署智能合約
2.3?驗(yàn)證部署
3.?truffle腳本
1.?連接公鏈
以太坊公鏈除了主網(wǎng),還有多個(gè)測(cè)試網(wǎng)絡(luò)。主網(wǎng)(Mainnet)是正式的以太坊網(wǎng)絡(luò),里面的以太幣是真正有價(jià)值的,測(cè)試網(wǎng)絡(luò)中的以太幣沒(méi)有價(jià)值,只用于測(cè)試。
我們最終目標(biāo)是連接到主網(wǎng),但先連接到測(cè)試網(wǎng)絡(luò)Kovan,雖然本地區(qū)塊鏈網(wǎng)絡(luò)(Ganache)也能測(cè)試,但與公鏈還是有區(qū)別的。
連接到公鏈的步驟如下:
1.1設(shè)置錢(qián)包
首先需要設(shè)置一個(gè)錢(qián)包,來(lái)管理我們的公鏈帳戶(hù)。
簡(jiǎn)單起見(jiàn),可以借用Ganache本地區(qū)塊鏈錢(qián)包,由于區(qū)塊鏈的工作原理,這個(gè)錢(qián)包在公共區(qū)塊鏈和本地區(qū)塊鏈上都是有效的。
打開(kāi)Ganache,主界面上可以看到一個(gè)名為“MNEMONIC”的部分:
?這是一個(gè)種子短語(yǔ),用于構(gòu)建由Ganache管理的錢(qián)包。我們可以使用這個(gè)種子短語(yǔ)加密重建錢(qián)包,來(lái)連接到公鏈。
復(fù)制這個(gè)值,保存到一個(gè)秘密文件,MNEMONIC是一個(gè)秘密值,需要保密。在項(xiàng)目根目錄中創(chuàng)建一個(gè).env文件,保存MNEMONIC值,如下所示:
MNEMONIC="你的mnemonic"1.2 連接以太坊節(jié)點(diǎn)
現(xiàn)在已經(jīng)創(chuàng)建了錢(qián)包,下一步需要訪(fǎng)問(wèn)Ethereum節(jié)點(diǎn),以便連接到公共區(qū)塊鏈網(wǎng)絡(luò)。
有幾種方法可以做到這一點(diǎn),可以使用Geth或Parity運(yùn)行自己的Ethereum節(jié)點(diǎn)。但這需要從區(qū)塊鏈下載大量數(shù)據(jù)并保持同步,很麻煩。
比較方便的方法是,使用Infura訪(fǎng)問(wèn)Ethereum節(jié)點(diǎn)。Infura是一個(gè)免費(fèi)提供Ethereum節(jié)點(diǎn)的服務(wù)。
在Infura上注冊(cè)賬號(hào),創(chuàng)建項(xiàng)目,在項(xiàng)目詳情頁(yè)上可以查看API KEY:
?使用API KEY,就可以訪(fǎng)問(wèn)以太坊網(wǎng)絡(luò)節(jié)點(diǎn)。
在.env文件中添加Infura api key的配置:
INFURA_API_KEY="https://kovan.infura.io/v3/543526cd4d3846acbc3826484e934564" MNEMONIC="你的mnemonic"1.3 更新項(xiàng)目設(shè)置
接下來(lái)使用MNEMONIC與INFURA_API_KEY,更新項(xiàng)目的網(wǎng)絡(luò)配置,以便連接到公共區(qū)塊鏈網(wǎng)絡(luò)。
修改truffle-config.js文件:
// 導(dǎo)入dotenv庫(kù)創(chuàng)用于讀取`.env`文件中的設(shè)置 require('dotenv').config(); // 導(dǎo)入truffle-hdwallet-provider庫(kù)重建錢(qián)包 const HDWalletProvider = require('truffle-hdwallet-provider');module.exports = {networks: {development: {host: "127.0.0.1", // Localhost (default: none)port: 7545, // Standard Ethereum port (default: none)network_id: "*", // Any network (default: none)},// Useful for deploying to a public network.// NB: It's important to wrap the provider as a function.kovan: {provider: () => new HDWalletProvider(process.env.MNEMONIC, process.env.INFURA_API_KEY),gas: 5000000,gasPrice: 25000000000,network_id: 42},},solc: {optimizer: {enabled: true,runs: 200}} }可以看到,我們使用了.env配置文件中的MNEMONIC與INFURA_API_KEY配置了kovan網(wǎng)絡(luò)。
由于用到了dotenv與truffle-hdwallet-provider這2個(gè)庫(kù),我們需要先安裝:
切換到項(xiàng)目目錄,執(zhí)行以下命令
npm install dotenv --save-dev npm install truffle-hdwallet-provider --save-dev注意?安裝truffle-hdwallet-provider時(shí),如果出現(xiàn)node-gyp相關(guān)的錯(cuò)誤,可參考這里解決。
1.4 訪(fǎng)問(wèn)以太坊節(jié)點(diǎn)
使用truffle console連接到公共區(qū)塊鏈網(wǎng)絡(luò):
$ truffle console --network kovan要驗(yàn)證連接,可以從區(qū)塊鏈中讀取一些數(shù)據(jù),獲取一些關(guān)于最新區(qū)塊的信息,在控制臺(tái)上執(zhí)行:
web3.eth.getBlock('latest').then(console.log)輸出:
{ author: '0x03801efb0efe2a25ede5dd3a003ae880c0292e4d',difficulty: '340282366920938463463374607431768211454',extraData:'0xde830206028f5061726974792d457468657265756d86312e33362e30826c69',gasLimit: '0x7a1200',gasUsed: '0x17d23',hash:'0xc7390c4f492c8c1da60608135fc9e05930123b645b39f221cba33d8b3c577b2a',logsBloom:'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000080000000000000000000100000008000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400800000000000010000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000008000000',receiptsRoot:'0x3d05bb2ed4fcc90234eea6d840e7d0e3ce7f598a15e5314536b17bcd11c78b5b',sealFields:[ '0x84175e8801','0xb84155a8cdb108dccec1d314124058fa6f22e7400ee200db0a94b7b165e4c3454c1818cc05f815cb7ce48f7a88b8401515740311a3566d9cf079428d506a6daca50101' ],sha3Uncles:'0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',signature:'55a8cdb108dccec1d314124058fa6f22e7400ee200db0a94b7b165e4c3454c1818cc05f815cb7ce48f7a88b8401515740311a3566d9cf079428d506a6daca50101',size: 877,stateRoot:'0x03af5adce52a81ce5d332cddb9955e344214bff00859b78868116e1e839efdf7',step: '392071169',timestamp: 1568284676,totalDifficulty: '4524524338444961608702071789512829094373049115',transactions:[ '0xded7fed0842fd65ec808bc3652ec4175bc190acc11345c49c44b1fb5d954610f','0x7e9112a46fa3c07aad813ea86355b15eebb44023c040d198ee7d15d379bbc2be' ],transactionsRoot:'0x0dd10d90686dda2684bd0ba70d1c9e1d9a5302c30ca75eb2c5b07a7b6e4498b9',uncles: [] }可以看到,已經(jīng)成功連接到了公鏈。
2.?部署智能合約到公鏈
現(xiàn)在,我們將智能合約部署到公鏈。步驟如下:
2.1獲取測(cè)試以太幣
部署需要消耗Gas,Gas需要支付以太幣,我們部署到的是公鏈測(cè)試網(wǎng)Kovan,網(wǎng)絡(luò)中的以太幣沒(méi)有市場(chǎng)價(jià)值。
可以從Kovan faucet Gitter聊天室獲取測(cè)試用的偽以太幣。只需把錢(qián)包地址發(fā)送出去,約5分鐘內(nèi),有人會(huì)給你發(fā)測(cè)試用的偽以太幣。
打開(kāi)Ganache并復(fù)制列表中第一個(gè)帳戶(hù)的地址(錢(qián)包地址),類(lèi)似下面所示:
0x29920e756f41F8e691aE0b12D417C19204371E91發(fā)送到聊天室內(nèi),稍等片刻,你的賬號(hào)將收到一筆以太幣。
2.2 部署智能合約
現(xiàn)在帳戶(hù)里已經(jīng)有了資金,可以進(jìn)行部署了。
執(zhí)行部署命令:
truffle migrate --network kovan一旦部署完成,應(yīng)該會(huì)看到部署成功的消息。
部署命令執(zhí)行詳情:
G:\qikegu\ethereum\mydapp>truffle migrate --network kovanCompiling your contracts... =========================== > Everything is up to date, there is nothing to compile.Migrations dry-run (simulation) =============================== > Network name: 'kovan-fork' > Network id: 42 > Block gas limit: 0x7a1200...Starting migrations... ====================== > Network name: 'kovan' > Network id: 42 > Block gas limit: 0x7a12001_initial_migration.js ======================Deploying 'Migrations'----------------------> transaction hash: 0x7e30b5c716afed45888a9dd2d6af7e6f52a9fade0346e8ad7d0c268de508a26a> Blocks: 2 Seconds: 9> contract address: 0x168A7247B58786edd259502948f5Bf9449C863AD> block number: 13447029> block timestamp: 1568294312> account: 0x29920e756f41F8e691aE0b12D417C19204371E91> balance: 2.993465175> gas used: 261393> gas price: 25 gwei> value sent: 0 ETH> total cost: 0.006534825 ETH> Saving migration to chain.> Saving artifacts-------------------------------------> Total cost: 0.006534825 ETH2_deploy_contracts.js =====================Deploying 'MyContract'----------------------> transaction hash: 0xc1f7ec8fee1a23e3d08d0c9e9d6e15fef24feb8ba163e0071dccb1bb90cc0eca> Blocks: 0 Seconds: 0> contract address: 0x4D3CFaF8457CEA76c0409f989f9870115B4d2d82> block number: 13447036> block timestamp: 1568294340> account: 0x29920e756f41F8e691aE0b12D417C19204371E91> balance: 2.9850534> gas used: 294448> gas price: 25 gwei> value sent: 0 ETH> total cost: 0.0073612 ETH> Saving migration to chain.> Saving artifacts-------------------------------------> Total cost: 0.0073612 ETHSummary ======= > Total deployments: 2 > Final cost: 0.013896025 ETHSummary ======= > Total deployments: 2 > Final cost: 0.013896025 ETH2.3?驗(yàn)證部署
現(xiàn)在打開(kāi)truffle控制臺(tái),與kovan測(cè)試網(wǎng)絡(luò)上的智能合約進(jìn)行交互:
$ truffle console --network kovan在控制臺(tái)中執(zhí)行:
truffle(kovan)> MyContract.deployed().then((c) => { contract = c })然后:
truffle(kovan)> contract.get() 'myValue' truffle(kovan)> contract.set("hello world") { tx:'0x7bf63444f3a7bd70e981a7bd49228b1cf1a8c3754daf64c4c7765b8eee46bf37',receipt:{ blockHash:'0xe03d0f43d85f4e41c18a90aa563ebda08899c6b9c38d0cd7779937046e2aed0c',blockNumber: 13447763,contractAddress: null,cumulativeGasUsed: 33629,from: '0x29920e756f41f8e691ae0b12d417c19204371e91',gasUsed: 33629,logs: [],logsBloom:'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',root: null,status: true,to: '0x4d3cfaf8457cea76c0409f989f9870115b4d2d82',transactionHash:'0x7bf63444f3a7bd70e981a7bd49228b1cf1a8c3754daf64c4c7765b8eee46bf37',transactionIndex: 0,rawLogs: [] },logs: [] } truffle(kovan)> contract.get() 'hello world'可以看到智能合約已經(jīng)成功部署。
3.?truffle腳本
Truffle包含一個(gè)腳本運(yùn)行器,可對(duì)以太坊網(wǎng)絡(luò)執(zhí)行自定義腳本。
讓我們創(chuàng)建一個(gè)腳本并執(zhí)行。
在項(xiàng)目根目錄下,創(chuàng)建script.js文件,內(nèi)容如下:
module.exports = function(callback) {web3.eth.getBlock('latest').then(console.log) }該腳本將從Kovan測(cè)試網(wǎng)絡(luò)獲取最新區(qū)塊的信息。
執(zhí)行腳本:
truffle exec script.js --network kovan輸出:
{ author: '0x596e8221a30bfe6e7eff67fee664a01c73ba3c56',difficulty: '340282366920938463463374607431768211454',extraData:'0xde830205058f5061726974792d457468657265756d86312e33362e30826c69',gasLimit: '0x7a1200',gasUsed: '0x5e61',hash:'0x225a1e0b13fd20396af60d049ce9bb94c2f3f7df06c7db260880b62c91997004',logsBloom:'0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',miner: '0x596e8221A30bFe6e7eFF67Fee664A01C73BA3C56',number: 13448162,parentHash:'0x28d00fd7b66771130ed98de5073c7797ee293e7bee4b546793a4b79171555066',receiptsRoot:'0x44617b5733ee59bde159af08ffd6edae36e0964f1724c333f3d1bef0808dee15',sealFields:[ '0x84175e95d7','0xb8412ed900e67f4a72925fb3b495efb3f547411f40d26e972cc0e8b2cf26e40cf84a545e0328199d4880b79c62670129a7db12ac58234bee0866c6376b46ab99e8a200' ],sha3Uncles:'0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',signature:'2ed900e67f4a72925fb3b495efb3f547411f40d26e972cc0e8b2cf26e40cf84a545e0328199d4880b79c62670129a7db12ac58234bee0866c6376b46ab99e8a200',size: 797,stateRoot:'0xe1bbaacfb950361bec70f4ad53a2605e1ac1d2ff0bfd913fe063dc6c5f3252a0',step: '392074711',timestamp: 1568298844,totalDifficulty: '4525729278306228651801195598997744985609807728',transactions:[ '0xf1ae41eac6b32419bc62a6cde9cab4b4ca244899a3d49b4a2461bcf94f504176' ],transactionsRoot:'0xf08c8097ea946f84ce9594ce73648fc0f9f683adef105a5db00c5f1f15e61c2c',uncles: [] }下面的代碼智能合約MyContract中,讀取value值,將script.js腳本文件中的代碼替換為:
const MyContract = artifacts.require("./MyContract.sol");module.exports = async function(callback) {const contract = await MyContract.deployed()const value = await contract.get()console.log("Value:", value) }執(zhí)行腳本:
truffle exec script.js --network kovan輸出:
Value: hello world腳本運(yùn)行器是一個(gè)非常有用的功能。
總結(jié)
- 上一篇: Java读取pdf模板,并动态生成pdf
- 下一篇: 微信小程序实现搜索关键词高亮