通过Nethereum和.NET开发以太坊智能合约

栏目: ASP.NET · 发布时间: 6年前

内容简介:.NET是独立开发者和企业开发者共同喜爱的古老框架。可以选择各种语言并且能部署到各种各样的平台,包括从移动端到服务器的各种能力,这使得.NET成为各种应用的一个很好的选择。虽然.NET做了很多,但也可以说它什么也没做。例如,不能在.NET中的浏览器中运行客户端代码(除非使用Silverlight……),也不存在.NET支持的语言,这使得开发人员能够编写智能合约。智能合约的开发语言是solidity。solidity是一种特定用途的语言,它假设许多关于它运行的环境的东西,它与区块链技术结合十分紧密。正是这些

.NET是独立开发者和企业开发者共同喜爱的古老框架。可以选择各种语言并且能部署到各种各样的平台,包括从移动端到服务器的各种能力,这使得.NET成为各种应用的一个很好的选择。虽然.NET做了很多,但也可以说它什么也没做。例如,不能在.NET中的浏览器中运行客户端代码(除非使用Silverlight……),也不存在.NET支持的语言,这使得开发人员能够编写智能合约。

智能合约的开发语言是solidity。solidity是一种特定用途的语言,它假设许多关于它运行的环境的东西,它与区块链技术结合十分紧密。正是这些假设特点排斥其他语言。

智能合约本身只是故事的一半。对于应用程序来说,智能合约需要通过RPC来调用它们。这就是Web3客户端接入的地方。Web3客户端仅仅是客户端应用程序,它使客户端应用程序能够与以太坊上运行的智能合约进行接口交互,因此只要一个给定语言存在,那么它就可以与以太坊进行接口交互。

对于.NET来说,最重要的就是一个叫做 Nethereum 的项目。(Nethereum是.NET和以太坊的一个门户)。这个库试图复制Web3.js提供的相同功能,这些功能类似于运行在浏览器和NodeJS中的JavaScript应用程序。

在本教程中,我们将向Ganache部署一个智能合约,然后使用.NET core创建一个简单的.NET应用程序来与智能合约进行接口交互。

创建和发布一个智能合约

1. 下载和安装Ganache ,Ganache是一个非常有用的进行以太坊开发的私有区块链。

2.在终端、命令提示符或Powershell会话中,安装Truffle。 Truffle 是一个框架和一套实用 工具 集,有助于促进solidity开发智能合约。使用NPM完成下面的命令。

npm install -g truffle

3.建一个文件夹然后在这个文件夹下运行 truffle init

truffle init

4.truffle将创建一些新文件夹 contract , testmigration 。在contract文件夹, contracts 文件夹中建一个新文件 Vote.sol

5.将下面的代码粘贴到新创建的 Vote.sol 中并保存该文件。这个智能合约只记录了2名候选人的选票数。合约使用消息发送者(即账户地址)作为投票人。它只允许每帐户投1票。

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;
    }
}

6.在 migrations 文件夹中创建一个名为2_vote.js的新文件。

7.复制下面的代码到2_vote.js中,并保存。

var vote = artifacts.require("Vote");

 module.exports = function(deployer) {
   // deployment steps
   deployer.deploy(vote);
 };

8.在你创建的文件夹的根目录中打开 truffle.js 并粘贴下面的代码,然后保存文件。这配置Truffle使用Ganache。

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

9.在开始菜单中启动Ganache。

10.使用Truffle部署智能合约。 ganache 网络是在 truffle.js 文件中定义的。

truffle deploy --reset --network ganache

11.注意输出。你将看到如下类似的输出。这是投票合同的地址。复制并粘贴十六进制字符串供以后使用。

Vote: 0xe4e47451aad6c89a6d9e4ad104a7b77ffe1d3b36

创建一个.NET应用调用智能合约

1.在一个新的目录,使用 dotnet 命令创建一个新的控制台应用程序。

dotnet create new console

2.安装Nethereum包。

dotnet add package Nethereum.Web3
dotnet add package Nethereum.Contracts

3.编辑 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);
             }               
         }
     }
 }

4.在 program.cs ,将我们刚才记录的地址粘贴到部署联系人的地址,保存文件。

//The contract address.
string address = "Your address goes here";

5.编译应用程序。

dotnet build

6.运行应用程序。

dotnet run

7.你会看到应用程序提示你输入。输入地址并投票。你可以在 Accounts 选项卡下从Ganache GUI复制帐户地址。

Candidate 1 votes: 0
Candidate 2 votes: 0
Enter the address of your account: 0x627306090abaB3A6e1400e9345bC60c78a8BEf57
Press 1 to vote for candidate 1, Press 2 to vote for candidate 2: 1
You pressed 1
Vote Cast!

8.再次运行应用程序,将看到投票已经增加。

Candidate 1 votes: 1
Candidate 2 votes: 0
Enter the address of your account: 0xf17f52151EbEF6C7334FAD080c5704D77216b732
Press 1 to vote for candidate 1, Press 2 to vote for candidate 2: 2
You pressed 2
Vote Cast!

对于Nethereum来说,很容易将智能合约与任何.NET应用程序连接起来。因为Nethereum是基于.NET的,它可以用于.NET核心应用程序、.NET标准、Xamarin和各种Windows应用程序。使用Nethereum,强大的以太坊和.NET的现在由你来支配!

====================================================================== 分享我们的在线互动实战教程:C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。

其他的以太坊教程,有兴趣可以关注下:

  • web3j教程,主要是针对 java 和android程序员进行区块链以太坊开发的web3j详解。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发,主要是介绍使用node.js、 mongodb 、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • python以太坊,主要是针对 python 工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用 php 进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

汇智网原创翻译,转载请标明出处。这里是 原文


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java RESTful Web Service实战

Java RESTful Web Service实战

韩陆 / 机械工业出版社 / 2014-10-1 / 69.00

国内首本完整、深度地讲解如何基于Java标准规范实现REST风格的Web服务的专著,阿里巴巴Java技术专家12年开发经验结晶,3位业内著名技术专家联袂推荐!不仅深刻解读了最新的JAX-RS标准和其API设计,以及Jersey的使用要点和实现原理,而且系统讲解了REST的基本理论,更重要的是从实践角度深度讲解了如何基于Jersey实现完整的、安全的、高性能的REST式的Web服务。 《Jav......一起来看看 《Java RESTful Web Service实战》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器