博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在.NET应用中访问以太坊智能合约【Nethereum】
阅读量:7087 次
发布时间:2019-06-28

本文共 5018 字,大约阅读时间需要 16 分钟。

hot3.png

Nethereum基本上是目前唯一可用的.NET平台下的web3.js移植包。在这个教程中,我们将首先编写并部署一个简单的智能合约,然后创建一个简单的.NET应用,并使用Nethereum来访问以太坊上的智能合约。Nethereum是通过以太坊节点旳标准RPC接口访问智能合约,因此使用Nethereum可以对接所有的以太坊节点实现,例如geth或parity。

如果你希望快速掌握Netherem的开发,可以访问汇智网的互动教程,技术问题可以直接咨询课程助教。

智能合约开发与部署

首先安装开发用以太坊节点软件Ganache:

~$ npm install -g ganache-cli

然后安装以太坊开发框架Truffle:

~$ npm install -g truffle

现在创建一个项目目录,进入该目录,并执行truffle init进行初始化:

~$ mkdir demo && cd hubwiz~/hubwiz$ truffle init

truffle会创建一些新的文件夹:contract、test、migration等。在contract文件夹中,创建一个新的合约文件Vote.sol:

~/hubwiz/contracts$ touch Vote.sol

按如下内容编辑Vote.sol,这个合约只是简单地跟踪两个候选人的得票数,它使用交易发起账户作为投票人,并且每个账户只能投一票:

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,内容如下:

var vote = artifacts.require("Vote"); module.exports = function(deployer) {   // deployment steps   deployer.deploy(vote); };

然后打开项目文件夹下的truffle.js,用以下内容替换:

module.exports = {   networks: {     ganache: {       host: "127.0.0.1",       port: 7545,       network_id: "*" // Match any network id     }   } };

现在打开一个终端,启动ganache:

~$ ganache-cli

然后打开另一个终端,用truffle部署合约:

~/hubwiz$ truffle deploy --reset --network ganache

你会看到终端输出类似下面的合约地址,拷贝下来,后面还要用到:

Vote: 0xe4e47451aad6c89a6d9e4ad104a7b77ffe1d3b36

.Net应用开发与智能合约访问

创建一个新的控制台项目,添加对如下开发包的依赖:

  • Nethereum.Web3
  • Nethereum.Contracts

然后按如下内容修改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
candidate1Function = voteContract.GetFunction("candidate1").CallAsync
(); candidate1Function.Wait(); int candidate1 = (int)candidate1Function.Result; Task
candidate2Function = voteContract.GetFunction("candidate2").CallAsync
(); 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
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应用中。

原文链接:

转载于:https://my.oschina.net/u/3794778/blog/2997968

你可能感兴趣的文章
小白的进阶之路9
查看>>
Microsoft Security Essentials
查看>>
Winfrom 提示消息框公共类
查看>>
深度解读 - Windows 7核心图形架构细致分析(转贴)
查看>>
[leetcode-92-Reverse Linked List II]
查看>>
Qt读写Json格式配置文件
查看>>
Cannot change version of project facet Dynamic web module to 2.5
查看>>
Excel 点滴积累
查看>>
写一个函数,能获取文件后缀
查看>>
HDU 4349 Xiao Ming's Hope 找规律
查看>>
原生JS编写getByClass、addClass、removeClass、hasClass
查看>>
svn老鸟转用git必须理解的概念
查看>>
wechat-注意事项
查看>>
Element-diag中遮罩
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
在SUSE LINUX中如何用命令行关闭防火墙?
查看>>
IdentityServer4之Clients、Scopes、Claims与Token关联
查看>>
HTML中拖放介绍
查看>>
BAT面试题系列 基础篇(二) 数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?...
查看>>
(转)淘宝技术发展
查看>>