Nethereum基本上是目前惟一可用的.NET平台下的web3.js移植包。在这个教程中,咱们将首先编写并部署一个简单的智能合约,而后建立一个简单的.NET应用,并使用Nethereum来访问以太坊上的智能合约。Nethereum是经过以太坊节点旳标准RPC接口访问智能合约,所以使用Nethereum能够对接全部的以太坊节点实现,例如geth或parity。web
若是你但愿快速掌握Netherem的开发,能够访问汇智网的互动教程C#以太坊开发详解,技术问题能够直接咨询课程助教。npm
首先安装开发用以太坊节点软件Ganache:windows
~$ npm install -g ganache-cli
而后安装以太坊开发框架Truffle:app
~$ npm install -g truffle
如今建立一个项目目录,进入该目录,并执行truffle init
进行初始化:框架
~$ mkdir demo && cd hubwiz ~/hubwiz$ truffle init
truffle会建立一些新的文件夹:contract、test、migration等。在contract文件夹中,建立一个新的合约文件Vote.sol:ui
~/hubwiz/contracts$ touch Vote.sol
按以下内容编辑Vote.sol,这个合约只是简单地跟踪两个候选人的得票数,它使用交易发起帐户做为投票人,而且每一个帐户只能投一票:url
pragma solidity ^0.4.16; contract Vote { uint public candidate1; uint public candidate2; mapping (address => bool) public voted; function castVote(uint candidate) public { require(!voted[msg.sender] && (candidate == 1 || candidate == 2)); if(candidate == 1){ candidate1++; }else{ candidate2++; } voted[msg.sender] = true; } }
接下来在migration文件夹建立一个新的js文件2_vote.js,内容以下:spa
var vote = artifacts.require("Vote"); module.exports = function(deployer) { // deployment steps deployer.deploy(vote); };
而后打开项目文件夹下的truffle.js,用如下内容替换:code
module.exports = { networks: { ganache: { host: "127.0.0.1", port: 7545, network_id: "*" // Match any network id } } };
如今打开一个终端,启动ganache:blog
~$ ganache-cli
而后打开另外一个终端,用truffle部署合约:
~/hubwiz$ truffle deploy --reset --network ganache
你会看到终端输出相似下面的合约地址,拷贝下来,后面还要用到:
Vote: 0xe4e47451aad6c89a6d9e4ad104a7b77ffe1d3b36
建立一个新的控制台项目,添加对以下开发包的依赖:
而后按以下内容修改program.cs:
using System; using System.Numerics; using System.Threading.Tasks; using Nethereum.Contracts; using Nethereum.Hex.HexTypes; using Nethereum.Web3; namespace console { class Program { static void Main(string[] args) { //The URL endpoint for the blockchain network. string url = "HTTP://localhost:7545"; //The contract address:合约部署的地址 string address = "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10"; //The ABI for the contract. string ABI = @"[{'constant':true,'inputs':[],'name':'candidate1','outputs':[{'name':'','type':'uint256'}],'payable':false,'stateMutability':'view','type':'function'},{'constant':false,'inputs':[{'name':'candidate','type':'uint256'}],'name':'castVote','outputs':[],'payable':false,'stateMutability':'nonpayable','type':'function'},{'constant':true,'inputs':[],'name':'candidate2','outputs':[{'name':'','type':'uint256'}],'payable':false,'stateMutability':'view','type':'function'},{'constant':true,'inputs':[{'name':'','type':'address'}],'name':'voted','outputs':[{'name':'','type':'bool'}],'payable':false,'stateMutability':'view','type':'function'}]"; //Creates the connecto to the network and gets an instance of the contract. Web3 web3 = new Web3(url); Contract voteContract = web3.Eth.GetContract(ABI, address); //Reads the vote count for Candidate 1 and Candidate 2 Task<BigInteger> candidate1Function = voteContract.GetFunction("candidate1").CallAsync<BigInteger>(); candidate1Function.Wait(); int candidate1 = (int)candidate1Function.Result; Task<BigInteger> candidate2Function = voteContract.GetFunction("candidate2").CallAsync<BigInteger>(); candidate2Function.Wait(); int candidate2 = (int)candidate2Function.Result; Console.WriteLine("Candidate 1 votes: {0}", candidate1); Console.WriteLine("Candidate 2 votes: {0}", candidate2); //Prompts for the account address. Console.Write("Enter the address of your account: "); string accountAddress = Console.ReadLine(); //Prompts for the users vote. int vote = 0; Console.Write("Press 1 to vote for candidate 1, Press 2 to vote for candidate 2: "); Int32.TryParse(Convert.ToChar(Console.Read()).ToString(), out vote); Console.WriteLine("You pressed {0}", vote); //Executes the vote on the contract. try{ HexBigInteger gas = new HexBigInteger(new BigInteger(400000)); HexBigInteger value = new HexBigInteger(new BigInteger(0)); Task<string> castVoteFunction = voteContract.GetFunction("castVote").SendTransactionAsync(accountAddress, gas, value, vote); castVoteFunction.Wait(); Console.WriteLine("Vote Cast!"); }catch(Exception e){ Console.WriteLine("Error: {0}", e.Message); } } } }
别忘了用你本身部署的合约地址修改上面代码中的合约地址。如今运行应用,就能够投票了!
用Nethereum很容易就能够为.Net应用添加访问以太坊智能合约的能力,因为Nethereum基于.NET平台,所以它能够用于.NET Core应用、.NET Standard应用、Xamarin以及各类windows应用中。