千家信息网

怎么在.NET应用中访问以太坊智能合约Nethereum

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本篇文章为大家展示了怎么在.NET应用中访问以太坊智能合约Nethereum,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Nethereum基本上是目前唯一可
千家信息网最后更新 2025年01月23日怎么在.NET应用中访问以太坊智能合约Nethereum

本篇文章为大家展示了怎么在.NET应用中访问以太坊智能合约Nethereum,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

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

智能合约开发与部署

首先安装开发用以太坊节点软件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应用中。

上述内容就是怎么在.NET应用中访问以太坊智能合约Nethereum,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

合约 应用 智能 以太 内容 文件 开发 地址 文件夹 终端 节点 项目 平台 技能 目录 知识 账户 投票 简明 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库文件或附属文件有缺失 房山区网络技术服务职责 dm1数据库怎么打开 小型数据库管理应用系统设计 智慧城市智能管控平台软件开发 软件开发的升级版怎样做 市民网络安全防范 安徽常见软件开发性价比 网络技术知识学习网站 网络安全意识大学班会策划 c写服务器端 无线传感网络技术的发展 幻塔手机账号如何改换服务器 服务器2个网口做互通 软件开发服务 还是技术服务 成都做网络安全的上市公司 布置服务器 山东千石网络技术 软件开发公司 系统规范移交 雷电模拟器4连接不到服务器 博雅高考数据库2021江苏文科 数据库技术与什么学科有关 怀旧服不同服务器的对战 云服务器租用哪个最好 国际奥林匹克网络安全竞赛 创意软件开发公司 数据库简单的查询使用的语句 网络安全和个人信息保护手抄报 华为云有自己的服务器吗 徐州数据库防伪技术
0