在这一部分,我们将使用C#开发一个最简单的.Net控制台应用,来接入以太坊节点,并打印 所连接节点旳版本信息。通过这一部分的学习,你将掌握以下技能:
- 如何使用节点仿真器
- 如何在命令行访问以太坊节点
- 如何在C#代码中访问以太坊节点
我们将使用ganache来模拟以太坊节点。ganache虽然不是一个真正的以太坊节点软件, 但它完整实现了以太坊的JSON RPC接口,非常适合以太坊智能合约与去中心化应用开发的 学习与快速验证:
ganache启动后将在8545端口监听http请求,因此,我们会将JSON RPC调用请求 使用http协议发送到节点旳8545端口。不同的节点软件可能会使用不同的监听端口,但 大部分节点软件通常默认使用8545端口。
以太坊规定了节点必须实现web3_clientVersion 调用来返回节点软件的版本信息,因此我们可以用这个命令来测试与 节点旳链接是否成功。
ganache-cli是以太坊节点仿真器软件ganache的命令行版本,可以方便开发者快速进行 以太坊DApp的开发与测试。在windows下你也可以使用其GUI版本。启动ganache很简单,只需要在命令行执行ganache-cli即可:ganache-cli是一个完整的词,-两边是没有空格的。一切顺利的话,你会看到与下图类似的屏幕输出:
默认情况下,ganache会随机创建10个账户,每个账户中都有100ETH的余额。你可以在 命令行中指定一些参数来调整这一默认行为。例如使用-a
或--acounts
参数来指定 要创建的账户数量为20:
ganache-cli -a 20
使用curl获取节点版本信息
以太坊规定了节点必须实现web3_clientVersion 接口来向外部应用提供节点旳版本信息。接口协议的交互流程如下:
这是一个典型的请求/应答模型,请求包和响应包都是标准的JSON格式。其中,jsonrpc字段用来 标识协议版本,id则用来帮助建立响应包与请求包的对应关系。
在请求包中,使用method字段来声明接口方法,例如web3_clientVersion,使用params 字段来声明接口方法的参数数组。 在响应包中,result字段中保存了命令执行的返回结果。
以太坊JSON RPC并没有规定传输层的实现,不过大部分节点都会实现HTTP和IPC的访问。因此 我们可以使用命令行工具curl来测试这个接口:
curl http://localhost:8545 -X POST -d '{"jsonrpc": "2.0","method": "web3_clientVersion","params": [], "id": 123}'
使用C#获取节点版本信息
就像前一节看到的,我们只要在C#代码中按照以太坊RPC接口要求发送http请求包就可以了。 你可以使用任何一个你喜欢的http库,甚至直接使用socket来调用以太坊的JSON RPC API。例如,下面的代码使用.Net内置的HttpClient类来访问以太坊节点,注意代码中的注释:
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace GetVersionByHttpDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("cuiyw-test");
GetVersion().Wait();
GetAccounts().Wait();
Console.ReadLine();
}
static async Task GetVersion()
{
HttpClient httpClient = new HttpClient();
string url = "http://localhost:7545";
string payload = "{\"jsonrpc\":\"2.0\",\"method\":\"web3_clientVersion\",\"params\":[],\"id\":7878}";
Console.WriteLine("<= " + payload);
StringContent content = new StringContent(payload, Encoding.UTF8, "application/json");
HttpResponseMessage rsp = await httpClient.PostAsync(url, content);
string ret = await rsp.Content.ReadAsStringAsync();
Console.WriteLine("=> " + ret);
}
static async Task GetAccounts()
{
HttpClient httpClient = new HttpClient();
string url = "http://localhost:7545";
string payload = "{\"jsonrpc\":\"2.0\",\"method\":\"eth_accounts\",\"