跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

以太坊之DAPP开发(完整例子)

开发以太坊dapp首先可以用官方框架 安装truffle

npm install -g truffle

环境依赖

NodeJS v8.9.4 或 之后的版本

Windows, Linux or Mac OS X

安装过程中可能遇到问题解决办法如下: 安装命令:sudo npm install -g truffle 安装过程中可能遇到问题解决: sudo npm install -g n sudo n stable 安装完成检车是否成功:truffle -v 接下来说一下怎么使用truffle 开发属于自己的dapp 一:创建相关文件夹下载模板

1.cd Voting

2.truffle unbox webpack

二:创建合约

cd contracts

rm meta.sol Lib.sol vim Voting 把写好的代码拷贝到其中

三:修改模板配置文件 (truffle\voting\webpack-box\migrations\2_deploy_contracts.js)

//const ConvertLib = artifacts.require("ConvertLib");

//const MetaCoin = artifacts.require("MetaCoin"); const Voting = artifacts.require("Voting");

module.exports = function(deployer) { //deployer.deploy(ConvertLib); //deployer.link(ConvertLib, MetaCoin); //deployer.deploy(MetaCoin);

deployer.deploy(Voting,["0x4100000000000000000000000000000000000000000000000000000000000000","0x4200000000000000000000000000000000000000000000000000000000000000"]); };

四:编译合约

cd truffle\voting\webpack-box

truffle compile

五:部署合约 启动ganache-cli(如果失败,则重新安装npm install -g ganache-cli) 注意:启动以太坊模拟区块链,默认端口8545

/**

* Use this file to configure your truffle project. It's seeded with some * common settings for different networks and features like migrations, * compilation and testing. Uncomment the ones you need or modify * them to suit your project as necessary. * * More information about configuration can be found at: * * truffleframework.com/docs/advanced/configuration * * To deploy via Infura you'll need a wallet provider (like truffle-hdwallet-provider) * to sign your transactions before they're sent to a remote public node. Infura accounts * are available for free at: infura.io/register. * * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate * public/private key pairs. If you're publishing your code to GitHub make sure you load this * phrase from a file you've .gitignored so it doesn't accidentally become public. * */

// const HDWallet = require('truffle-hdwallet-provider'); // const infuraKey = "fj4jll3k....."; // // const fs = require('fs'); // const mnemonic = fs.readFileSync(".secret").toString().trim();

module.exports = { /** * Networks define how you connect to your ethereum client and let you set the * defaults web3 uses to send transactions. If you don't specify one truffle * will spin up a development blockchain for you on port 9545 when you * run `develop` or `test`. You can ask a truffle command to use a specific * network from the command line, e.g * * $ truffle test --network */

networks: { // Useful for testing. The `development` name is special - truffle uses it by default // if it's defined here and no other network is specified at the command line. // You should run a client (like ganache-cli, geth or parity) in a separate terminal // tab if you use this network and you must also set the `host`, `port` and `network_id` // options below to some value. // development: { host: "localhost", // Localhost (default: none) port: 8545, // Standard Ethereum port (default: none) network_id: "*", // Any network (default: none) },

//develop: { // port: 8545 //},

// Another network with more advanced options... // advanced: { // port: 8777, // Custom port // network_id: 1342, // Custom network // gas: 8500000, // Gas sent with each transaction (default: ~6700000) // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) // from:

, // Account to send txs from (default: accounts[0]) // websockets: true // Enable EventEmitter interface for web3 (default: false) // },

// Useful for deploying to a public network. // NB: It's important to wrap the provider as a function. // ropsten: { // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), // network_id: 3, // Ropsten's id // gas: 5500000, // Ropsten has a lower block limit than mainnet // confirmations: 2, // # of confs to wait between deployments. (default: 0) // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) // },

// Useful for private networks // private: { // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), // network_id: 2111, // This network is yours, in the cloud. // production: true // Treats this network as if it was a public net. (default: false) // } },

// Set default mocha options here, use special reporters etc. mocha: { // timeout: 100000 },

// Configure your compilers compilers: { solc: { // version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version) // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) // settings: { // See the solidity docs for advice about optimization and evmVersion // optimizer: { // enabled: false, // runs: 200 // }, // evmVersion: "byzantium" // } } } }

部署

truffle migrate

部署完检验方法 打开truffle console控制台

truffle console

let instance = await Voting.deployed() instance

六:修改前端页面

MyVoting 投票DAPP测试

MyVoting 投票DAPP测试

Jerry : loding... tickets

Amy : loding... tickets

七:修改index.js

import Web3 from "web3";

import votingArtifact from "../../build/contracts/Voting.json";

const aInBytes32="0x4100000000000000000000000000000000000000000000000000000000000000"; const bInBytes32="0x4200000000000000000000000000000000000000000000000000000000000000";

const App = { web3: null, account: null, voting: null,

start: async function() { const { web3 } = this;

try { // get contract instance const networkId = await web3.eth.net.getId(); const deployedNetwork = votingArtifact.networks[networkId]; this.voting = new web3.eth.Contract( votingArtifact.abi, deployedNetwork.address, ); // get accounts const accounts = await web3.eth.getAccounts(); this.account = accounts[0];

//this.refreshBalance(); this.ready(); } catch (error) { console.error("Could not connect to contract or chain."); } }, refresh : async function (id,nameInBytes32){ const {LookForCandidate} =this.voting.methods; const tickets = await LookForCandidate(nameInBytes32).call(); const element = document.getElementById(id); element.innerHTML = tickets.toString(); }, ready: async function(){ try{ this.refresh("Jerry",aInBytes32); this.refresh("Amy",bInBytes32); }catch(err){ console.log(err) } }, voteForCandidate: async function(){ try{ const {voteForCandidate} = this.voting.methods; const candidateName = document.getElementById("candidate").value; console.log(candidateName); if(candidateName == "Jerry"){ await voteForCandidate(aInBytes32).send({from:this.account}); this.refresh("Jerry",aInBytes32);

}else if(candidateName == "Amy"){ await voteForCandidate(bInBytes32).send({from:this.account}); this.refresh("Amy",bInBytes32); } }catch(err){ console.info(err) } } };

window.App = App;

window.addEventListener("load", function() { if (window.ethereum) { // use MetaMask's provider App.web3 = new Web3(window.ethereum); window.ethereum.enable(); // get permission to access accounts } else { console.warn( "No web3 detected. Falling back to http://127.0.0.1:8545. You should remove this fallback when you deploy live", ); // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail) App.web3 = new Web3( new Web3.providers.HttpProvider("http://127.0.0.1:8545"), ); }

App.start(); });

八:运行即可

npm run dev

浏览器输入对应网站

相关文章