{"id":1772,"date":"2023-03-25T12:09:09","date_gmt":"2023-03-25T04:09:09","guid":{"rendered":""},"modified":"2023-03-25T12:41:12","modified_gmt":"2023-03-25T04:41:12","slug":"%e4%bb%a5%e5%a4%aa%e5%9d%8aethereum-%e6%99%ba%e8%83%bd%e5%90%88%e7%ba%a6%e5%89%8d%e7%ab%af%e9%a1%b5%e9%9d%a2","status":"publish","type":"post","link":"https:\/\/bianchenghao6.com\/1772.html","title":{"rendered":"\u4ee5\u592a\u574a\u2013\u667a\u80fd\u5408\u7ea6\u524d\u7aef\u9875\u9762"},"content":{"rendered":"
\n
\u663e\u793a\u5f53\u524d\u8fde\u63a5\u7684\u5e10\u6237<\/span> \u914d\u7f6eweb\u670d\u52a1\u5668\uff0c\u7528\u6765\u90e8\u7f72\u9875\u9762<\/span> <\/code>\n <\/div>\n <\/code>\n <\/div>\n baseDir<\/b>\u914d\u7f6e\u544a\u8bc9lite-server\u5c06.\/src<\/b>\u548c.\/build\/contracts<\/b>\u76ee\u5f55\u4f5c\u4e3aweb\u670d\u52a1\u5668\u7684\u6839\u76ee\u5f55\uff0c\u6240\u6709\u6587\u4ef6\u90fd\u53ef\u4ee5\u88ab\u8bbf\u95ee<\/span> <\/code>\n <\/div>\n <\/code>\n <\/div>\n web3.min.js<\/b> \u2013 web3.js\u5e93\u6587\u4ef6\uff0c\u76f4\u63a5\u4ecehttps:\/\/etherscan.io\/\u5f15\u5165<\/span> <\/code>\n <\/div>\n <\/code>\n <\/div>\n loadWeb3()<\/b>\u51fd\u6570\u6dfb\u52a0\u4e86\u7528Metamask\u5c06web\u6d4f\u89c8\u5668\u8fde\u63a5\u5230\u533a\u5757\u94fe\u6240\u9700\u7684\u914d\u7f6e\u3002\u8fd9\u662f\u76f4\u63a5\u4eceMetamask\u7684\u914d\u7f6e\u89c4\u8303\u4e2d\u590d\u5236\u7c98\u8d34\u7684\uff0c\u5982\u51fd\u6570\u4e0a\u9762\u4ee3\u7801\u6ce8\u91ca\u4e2d\u7684url\u6240\u793a\u3002<\/span> <\/code>\n <\/div>\n <\/body>
\n \u8bfb\u53d6\u667a\u80fd\u5408\u7ea6\u4e2d\u5b58\u50a8\u7684value\u503c<\/span>
\n \u66f4\u65b0\u667a\u80fd\u5408\u7ea6\u4e2d\u5b58\u50a8\u7684value\u503c<\/span> <\/p>\n\n <\/div>\n
\n \u521b\u5efa\u524d\u7aef\u7684h5\u3001js\u6587\u4ef6<\/span> <\/p>\n\u914d\u7f6eweb\u670d\u52a1\u5668<\/h2>\n
$ npm install lite-server--save-dev\r\n<\/pre>\n
\n bs-config.json<\/b>\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a\n <\/div>\n{\r\n \"server\"<\/span>: {\r\n \"baseDir\"<\/span>: [\r\n \".\/src\"<\/span>,\r\n \".\/build\/contracts\"<\/span>\r\n ],\r\n \"routes\"<\/span>: {\r\n \"\/vendor\"<\/span>: \".\/node_modules\"<\/span>\r\n }\r\n }\r\n}\r\n<\/pre>\n
\n routes<\/b>\u628a.\/node_modules<\/b>\u6620\u5c04\u4e3a\/vendor<\/b>\uff0c\u5728\u5f15\u7528\u6587\u4ef6\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\/vendor<\/b><\/span> <\/p>\n\u521b\u5efa\u524d\u7aef\u9875\u9762<\/h2>\n
\n src<\/b>\u76ee\u5f55\uff0c\u7528\u4e8e\u5b58\u653e\u524d\u7aef\u9875\u9762\u3002\n <\/div>\nsrc\/index.html\r\nsrc\/app.js\r\n<\/pre>\n
index.html<\/h3>\n
\n index.html<\/b>\u9875\u9762\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a\n <\/div>\n<!DOCTYPE html>\r\n<html lang=\"zh-CN\"<\/span>>\r\n <head>\r\n <meta charset=\"utf-8\"<\/span>>\r\n <meta http-equiv=\"X-UA-Compatible\"<\/span> content=\"IE=edge\"<\/span>>\r\n <meta name=\"viewport\"<\/span> content=\"width=device-width, initial-scale=1\"<\/span>>\r\n <title>\u4ee5\u592a\u574a DApp Demo<\/title>\r\n <!--HTML5 shim and Respond.js for <\/span>IE8 support of HTML5 elements and media queries-->\r\n <!--WARNING: Respond.js doesn't work if <\/span>you view the page via file:\/\/-->\r\n <!--[if <\/span>lt IE 9]>\r\n <script src=\"https:\/\/oss.maxcdn.com\/html5shiv\/3.7.3\/html5shiv.min.js\"<\/span>><\/script>\r\n <script src=\"https:\/\/oss.maxcdn.com\/respond\/1.4.2\/respond.min.js\"<\/span>><\/script>\r\n <![endif]-->\r\n <\/head>\r\n <body>\r\n <h1>\u8d26\u53f7: <span id=\"account\"<\/span>><\/span><\/h1>\r\n <hr>\r\n <div id=\"content\"<\/span>>\r\n <h2>\u667a\u80fd\u5408\u7ea6\uff1aMyContract<\/b><\/h2>\r\n <p>\u83b7\u53d6\u667a\u80fd\u5408\u7ea6\u4e2d\u7684value\u503c: <span id=\"value\"<\/span>><\/span><\/p>\r\n <h5>\u8bbe\u7f6evalue\u503c<\/h5>\r\n <form onSubmit=\"App.set<\/span>(); return <\/span>false;\"<\/span> role=\"form\"<\/span>>\r\n <div >\r\n <input id=\"newValue\"<\/span> type=\"text\"<\/span>><\/input>\r\n <\/div>\r\n <button type=\"submit\"<\/span> >\u8bbe\u7f6e<\/button>\r\n <\/form>\r\n <\/div>\r\n <div id=\"loader\"<\/span>>\u6b63\u5728\u52a0\u8f7d...<\/div>\r\n <\/div>\r\n <!--jQuery (necessary for <\/span>Bootstrap's JavaScript plugins)-->\r\n <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jquery\/3.4.1\/jquery.min.js\"<\/span>><\/script>\r\n <!--Include all compiled plugins (below), or include individual files as needed-->\r\n <script src=\"https:\/\/etherscan.io\/jss\/web3.min.js\"<\/span>><\/script>\r\n <script src=\"vendor\/@truffle\/contract\/dist\/truffle-contract.js\"<\/span>><\/script>\r\n <script src=\"app.js\"<\/span>><\/script>\r\n <\/body>\r\n<\/html>\r\n<\/pre>\n
\n truffle-contract.js<\/b> \u2013 truffle\u63d0\u4f9b\u7684\u5904\u7406\u667a\u80fd\u5408\u7ea6\u7684\u5e93\u6587\u4ef6<\/span> <\/p>\n
\n @truffle\/contract<\/b>\n <\/div>\n$ npm install @truffle\/contract--save-dev\r\n<\/pre>\n
app.js<\/h3>\n
\n app.js<\/b>\n <\/div>\nApp = {\r\n web3Provider: null<\/span>,\r\n contracts: {},\r\n account: '0x0'<\/span>,\r\n loading: false<\/span>,\r\n contractInstance: null<\/span>,\r\n init: async () => {\r\n \/\/ \u52a0\u8f7dweb3\r\n await App.loadWeb3<\/span>()\r\n \/\/ \u52a0\u8f7d\u667a\u80fd\u5408\u7ea6\r\n await App.loadContract<\/span>()\r\n \/\/ \u7f51\u9875\u5237\u65b0\r\n await App.render<\/span>()\r\n },\r\n \/\/ https:\/\/medium.com\/metamask\/https-medium-com-metamask-breaking-change-injecting-web3-7722797916a8\r\n loadWeb3: async () => {\r\n if <\/span>(typeof web3 !== 'undefined'<\/span>) {\r\n App.web3Provider = web3.currentProvider\r\n web3 = new <\/span>Web3(web3.currentProvider)\r\n } else <\/span>{\r\n window.alert<\/span>(\"Please connect to Metamask.\"<\/span>)\r\n }\r\n \/\/ MetaMask\u65b0\u7248\u672c\u2026\r\n if <\/span>(window.ethereum) {\r\n window.web3 = new <\/span>Web3<\/span>(ethereum)\r\n try <\/span>{\r\n \/\/ \u5411\u7528\u6237\u8bf7\u6c42\u5e10\u6237\u8bbf\u95ee\r\n await ethereum.enable<\/span>()\r\n \/\/ \u7528\u6237\u5141\u8bb8\u4f7f\u7528\u8d26\u6237\r\n web3.eth.sendTransaction<\/span>({\/* ... *\/ })\r\n } catch <\/span>(error) {\r\n \/\/ \u7528\u6237\u62d2\u7edd\u4f7f\u7528\u8d26\u6237\r\n }\r\n }\r\n \/\/ MetaMask\u8001\u7248\u672c\u2026\r\n else <\/span>if <\/span>(window.web3) {\r\n App.web3Provider = web3.currentProvider\r\n window.web3 = new <\/span>Web3<\/span>(web3.currentProvider)\r\n \/\/ \u65e0\u9700\u5411\u7528\u6237\u8bf7\u6c42\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u8d26\u53f7\r\n web3.eth.sendTransaction<\/span>({\/* ... *\/ })\r\n }\r\n \/\/ \u6ca1\u6709\u5b89\u88c5\u4ee5\u592a\u574a\u94b1\u5305\u63d2\u4ef6(MetaMask)...\r\n else <\/span>{\r\n console.log<\/span>('\u9700\u8981\u5b89\u88c5\u4ee5\u592a\u574a\u94b1\u5305\u63d2\u4ef6(\u4f8b\u5982MetaMask)\u624d\u80fd\u4f7f\u7528!'<\/span>)\r\n }\r\n },\r\n loadContract: async () => {\r\n const contract = await $.getJSON<\/span>('MyContract.json'<\/span>)\r\n App.contracts.MyContract = TruffleContract<\/span>(contract)\r\n App.contracts.MyContract.setProvider<\/span>(App.web3Provider)\r\n },\r\n render: async () => {\r\n \/\/ \u5982\u679c\u6b63\u5728\u52a0\u8f7d\uff0c\u76f4\u63a5\u8fd4\u56de\uff0c\u907f\u514d\u91cd\u590d\u64cd\u4f5c\r\n if <\/span>(App.loading) {\r\n return\r\n }\r\n \/\/ \u66f4\u65b0app\u52a0\u8f7d\u72b6\u6001\r\n App.setLoading<\/span>(true)\r\n \/\/ \u8bbe\u7f6e\u5f53\u524d\u533a\u5757\u94fe\u5e10\u6237\r\n const accounts = await ethereum.enable<\/span>()\r\n App.account = accounts[0]\r\n $('#account'<\/span>).html<\/span>(App.account)<\/span>\r\n \/\/ \u52a0\u8f7d\u667a\u80fd\u5408\u7ea6\r\n const contract = await App.contracts.MyContract.deployed<\/span>()\r\n App.contractInstance = contract\r\n const value = await App.contractInstance.get<\/span>()\r\n $('#value'<\/span>).html<\/span>(value)<\/span>\r\n App.setLoading<\/span>(false)\r\n },\r\n set: async () => {\r\n App.setLoading<\/span>(true)\r\n const newValue = $('#newValue'<\/span>).val<\/span>()<\/span>\r\n await App.contractInstance.set<\/span>(newValue, {from: App.account})\r\n window.alert<\/span>('\u66f4\u65b0\u6210\u529f\uff0c\u9875\u9762\u503c\u4e0d\u4f1a\u9a6c\u4e0a\u66f4\u65b0\uff0c\u7b49\u5f85\u51e0\u79d2\u540e\u591a\u5237\u65b0\u51e0\u6b21\u3002'<\/span>)\r\n App.setLoading<\/span>(false)\r\n },\r\n setLoading: (boolean) => {\r\n App.loading = boolean\r\n const loader = $('#loader'<\/span>)<\/span>\r\n const content = $('#content'<\/span>)<\/span>\r\n if <\/span>(boolean) {\r\n loader.show<\/span>()\r\n content.hide<\/span>()\r\n } else <\/span>{\r\n loader.hide<\/span>()\r\n content.show<\/span>()\r\n }\r\n }\r\n}\r\n$(document).ready<\/span>(function () {\r\n App.init<\/span>()\r\n});\r\n<\/pre>\n
\n loadContract()<\/b>\u51fd\u6570\u4f7f\u7528TruffleContract<\/b>\u5e93\u521b\u5efa\u667a\u80fd\u5408\u7ea6\u7684javascript\u5bf9\u8c61\uff0c\u53ef\u4ee5\u7528\u4e8e\u8c03\u7528\u667a\u80fd\u5408\u7ea6\u4e2d\u7684\u51fd\u6570\u3002<\/span>
\n render()<\/b>\u51fd\u6570\u8bbe\u7f6e\u9875\u9762\u5185\u5bb9\uff0c\u5305\u62ec\u5e10\u6237\u53ca\u667a\u80fd\u5408\u7ea6\u7684value\u503c\u3002<\/span> <\/p>\n$ npm run dev\r\n<\/pre>\n
\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"\u4ee5\u592a\u574a(Ethereum) \u2013 \u667a\u80fd\u5408\u7ea6\u524d\u7aef\u9875\u9762zh-cn","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[],"class_list":["post-1772","post","type-post","status-publish","format-standard","hentry","category-ytfjc"],"_links":{"self":[{"href":"https:\/\/bianchenghao6.com\/wp-json\/wp\/v2\/posts\/1772"}],"collection":[{"href":"https:\/\/bianchenghao6.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bianchenghao6.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bianchenghao6.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bianchenghao6.com\/wp-json\/wp\/v2\/comments?post=1772"}],"version-history":[{"count":0,"href":"https:\/\/bianchenghao6.com\/wp-json\/wp\/v2\/posts\/1772\/revisions"}],"wp:attachment":[{"href":"https:\/\/bianchenghao6.com\/wp-json\/wp\/v2\/media?parent=1772"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bianchenghao6.com\/wp-json\/wp\/v2\/categories?post=1772"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bianchenghao6.com\/wp-json\/wp\/v2\/tags?post=1772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}