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

.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完成下面的命令。

1
npm install -g truffle

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

1
truffle init

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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中,并保存。

1
2
3
4
5
6
var vote = artifacts.require("Vote");

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

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

1
2
3
4
5
6
7
8
9
module.exports = {
networks: {
ganache: {
host: "127.0.0.1",
port: 7545,
network_id: "*" // Match any network id
}
}
};

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

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

1
truffle deploy --reset --network ganache

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

1
Vote: 0xe4e47451aad6c89a6d9e4ad104a7b77ffe1d3b36

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

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

1
dotnet create new console

2.安装Nethereum包。

1
2
dotnet add package Nethereum.Web3
dotnet add package Nethereum.Contracts

3.编辑Program.cs文件。用下面的代码代替默认代码。这将能使控制台提示帐户地址和用户投票。保存文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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,将我们刚才记录的地址粘贴到部署联系人的地址,保存文件。

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

5.编译应用程序。

1
dotnet build

6.运行应用程序。

1
dotnet run

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

1
2
3
4
5
6
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.再次运行应用程序,将看到投票已经增加。

1
2
3
4
5
6
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进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

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