亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在.NET應用中訪問以太坊智能合約Nethereum

發布時間:2021-12-22 15:18:25 來源:億速云 閱讀:298 作者:柒染 欄目:互聯網科技

本篇文章為大家展示了怎么在.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<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應用中。

上述內容就是怎么在.NET應用中訪問以太坊智能合約Nethereum,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴业县| 周至县| 柳林县| 永胜县| 崇礼县| 缙云县| 乳山市| 谷城县| 溧阳市| 阳曲县| 佛教| 连平县| 惠安县| 封丘县| 霍林郭勒市| 磴口县| 堆龙德庆县| 区。| 广宁县| 乌兰县| 多伦县| 上饶县| 喜德县| 延长县| 公主岭市| 临澧县| 西充县| 镇巴县| 会理县| 民乐县| 普洱| 花莲市| 博乐市| 沙雅县| 两当县| 吴堡县| 六枝特区| 灌阳县| 上高县| 镶黄旗| 宕昌县|