c#实战开发:用.net core开发一个简单的Web以太坊钱包 (六)

今天就来开发一个C# 版的简易钱包 先回顾以前的内容

c#实战开发:以太坊Geth 命令发布智能合约 (五)

c#实战开发:以太坊Geth 常用命令 (四)

c#实战开发:以太坊钱包快速同步区块和钱包卡死解决方案 (三)

c#实战开发:以太坊钱包对接私链 (二)

c#实战开发:以太坊私链搭建(一)

先看一下可视化钱包有哪些功能呢?

那这个钱包得有什么功能呢?

1.查看用户

2.查看交易记录

3.转账

4.发布智能合约

5.代币转账

6.代币查询

7.实时同步区块对比

8.智能填写手续费

首先新建一个项目 导入以太坊.net实现类库

Install-Package Nethereum.Geth -Version 2.5.1

安装完

初始对象 记住初始化连接记得把Geth客户端打开建立连接

private const string url = "http://localhost:8546/";
private static Web3Geth Web3 = new Web3Geth(url);

这个url端口号就是你的公链端口 可以不填直接默认

private static Web3Geth Web3 = new Web3Geth();

接下来我们来一一实现功能  可以先用私链测试结果 不会的看前面的文章导读

1.用户操作

首先新增一个用户

string passPhrase = "a123456";
var Result = await Web3.Personal.NewAccount.SendRequestAsync(passPhrase);

传入用户密码 等待异步结果返回 用户公钥

用户新增好了

查询余额  把刚刚新建的用户地址传入

var Result = await Web3.Eth.GetBalance.SendRequestAsync(address);

如果不知道命令可以看

以太坊API中文文档:http://web3.tryblockchain.org/Web3.js-api-refrence.html

2.以太坊操作

首先考虑钱包的稳定性和同步的差异性 要让转账有效   就要多准备几个客户端 防客户端死掉 先模拟三个客户端IP

private const string url1 = "http://localhost:8545/";
private const string url2 = "http://localhost:8546/";
private const string url3 = "http://localhost:8547/";
private static Web3Geth 1Web3 = new Web3Geth(url1);
private static Web3Geth 2Web3 = new Web3Geth(url2);
private static Web3Geth 3Web3 = new Web3Geth(url3);

怎么知道哪个客户端死掉了呢?

 var BlockNumber =await Web3.Eth.Blocks.GetBlockNumber.SendRequestAsync();

获取的当前客户端区块同步高度 0就直接切换 初始化对象继续查     比如在查到5400  但是以太坊浏览器上同步区块是5800 这时你的客户端同步差异性  区块太别太大? 手续费输入多少?

看以太坊的区块链也不是及时同步 怎么办呢?

好在发现了一个区块链同步网站

https://ethstats.net/

可以看到最新的区块高度 和交易手续费  每秒都在刷  底下各大节点同步最新的数据  把这些数据拿到就可以知道我的客户端区块和最高区块的差距 已经当前最新手续费  这样可以告诉要转账的人 最合理的手续费输入值。

我们可以用  HttpClient 但是建立连接之后数据相应太慢根本不能做到实时推送给用户最新的区块记录和手续费 。

不过认真观察了一下应该是用的websocket 所以

地址被我找到了  这样就不用爬了  用他的地址写成exe客户端建立连接

var ws = new WebSocket("wss://ethstats.net")

但是发现数据不准 什么情况  发现后面有一个参数

_primuscb=1536930413898-0    那他的规则是什么呢?

数了一个10秒请求一个新连接 之间没有回传 那这个规则只能是写在JS了

整整3万行 不过还是被我找到了

new data()

原来是获取当前js的时间戳+1;

DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
long timeStamp = (long)(DateTime.Now - startTime).TotalMilliseconds+1;
using (var ws = new WebSocket("wss://ethstats.net/primus/?_primuscb=" + timeStamp + "-0"))

不过数据太多要对获取数据进行筛选

这些都做好了 就准备转账了 先要解锁要转账的用户

 ulong? ul = null;
 var resultunlock =await Web3.Personal.UnlockAccount.SendRequestAsync(From, FromPassPhrase, ul);

ul  解锁时间   空默认一次   from 用户地址    from 用户地址的私钥

//转账
 var txId = Web3.Eth.Transactions.SendTransaction.SendRequestAsync(
new TransactionInput { From = From, To = To, Value = new HexBigInteger(long.Parse(GasPrice)), Gas = new HexBigInteger(long.Parse(GasLimit)) }).Result;

From  要转账地址  To 被转账地址    GasPrice 转账可以数量   Gas 数量  可以直接用 websocket 获取到最新的数据 填入 GasPrice,Gas

转账成功后  会返回交易哈希 可以在以太坊浏览器上查看

把刚刚的交易回传的哈希传入 看交易详情

Transaction Result =await Web3.Eth.Transactions.GetTransactionByHash.SendRequestAsync(txId);

3.智能合约

首先生成智能合约abi 网站

https://ethereum.github.io/browser-solidity/#optimize=false&version=soljson-v0.4.24+commit.e67f0147.js

   public static string BYTECODE = "0x6060......5654“

很长

  var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c";
 var privatekey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7";
var url = "https://rinkeby.infura.io/";
var deploymentMessage = new StandardTokenDeployment
            {
                TotalSupply = 100000,
                FromAddress = senderAddress
            };
 var web3 = new Web3.Web3(new Account(privatekey), url);

            var deploymentHandler = web3.Eth.GetContractDeploymentHandler<StandardTokenDeployment>();
            var transactionReceipt = await deploymentHandler.SendRequestAndWaitForReceiptAsync(deploymentMessage);

            ContractAddress = transactionReceipt.ContractAddress;

先获取发只能合约用户的私钥 让后

填入发布数量 名字 返回合约哈希

var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c";
 var balanceOfFunctionMessage = new BalanceOfFunction()
            {
                Owner = senderAddress,
            };
     var balanceHandler = web3.Eth.GetContractQueryHandler<BalanceOfFunction>();
            var balance = await balanceHandler.QueryAsync<BigInteger>(balanceOfFunctionMessage, contractAddress);

查询合同剩余币数  让后就是合同代笔转账

 var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c";
            var receiverAddress = "0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe";
            var privatekey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7";
            var url = "https://rinkeby.infura.io/";

var web3 =  new Web3.Web3(new Account(privatekey), url);

     var transactionMessage = new TransferFunction()
            {
                FromAddress = senderAddress,
                To = receiverAddress,
                TokenAmount = 100,
                //Set our own price
                GasPrice =  Web3.Web3.Convert.ToWei(25, UnitConversion.EthUnit.Gwei)

            };

  var transferHandler = web3.Eth.GetContractTransactionHandler<TransferFunction>();

            /// this is done automatically so is not needed.
            var estimate = await transferHandler.EstimateGasAsync(transactionMessage, ContractAddress);
            transactionMessage.Gas = estimate.Value;

            var transactionHash = await transferHandler.SendRequestAsync(transactionMessage, ContractAddress);

最后返回交易哈希

一下是上面用到的开源实例库 他还可以还发以太坊游戏

https://nethereum.readthedocs.io/en/latest/introduction/web3/

https://github.com/Nethereum/Nethereum

因为是开源的大家可以自己去学习

https://gitter.im/Nethereum/Nethereum  ETH学习论坛

智能合约

https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Accounts.IntegrationTests/SignOfflineTransactionTest.cs#L23-L39

https://github.com/Nethereum/Nethereum.Workbooks/blob/master/docs/nethereum-infura-transfer.workbook

https://github.com/Nethereum/Nethereum.Workbooks/blob/master/docs/nethereum-cqs-test.workbook

至此 大致功能已经完成! 感谢观看! 下期比特币!

原文地址:https://www.cnblogs.com/yuanzijian-ruiec/p/9607194.html

时间: 2024-09-30 18:59:21

c#实战开发:用.net core开发一个简单的Web以太坊钱包 (六)的相关文章

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的Web服务器来体会一下. 一.请求-处理-响应模型 1.1 基本过程介绍 每一个HTTP请求都会经历三个步凑:请求-处理-响应:每当我们在浏览器中输入一个URL时都会被封装为一个HTTP请求报文发送到Web服务器,而Web服务器则接收并解析HTTP请求报文,然后针对请求进行处理(返回指定的HTML页面

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载) POSTED ON 2014年6月27日 BY 天边的星星 本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击.浏览时item背景会变色,并解决了listview里setSelected造成item的选择状态混乱的问题.

JavaEE完全实战详解笔记--在Eclipse中创建一个简单的web项目

下面演示了Eclipse开发JavaEE的通用步骤--配置一个简单的web应用,不同版本的Eclipse可能略有不同,但是基本不会有太大出入. 这里就以"eclipse-jee-luna-SR2-win32"+"apache-tomcat-8.0.21-windows-x86"版本为例,(截止2015年5月份的最新版): (详细过程看图) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

Android开发以太坊钱包生成应用程序

Android应用程序以太坊钱包生成,要做的工作不少,不过如果我们一步一步来应该也比较清楚: 1.在app/build.gradle中集成以下依赖项: compile ('org.web3j:core-android:2.2.1') web3j核心是用于从服务器下载以太坊区块链数据的核心类库.它通常用于以太坊开发. 2.我们将设计一个Android UI示例,屏幕上将有文本编辑和按钮.在EditText中,将要求用户输入钱包的密码.然后在按钮的单击事件上,我们将开始发送密码的过程.以下是layo

编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(四)结语

四则运算编译器,虽然说功能很简单,只能编译四则运算表达式.但是编译原理前端部分几乎都有涉及,词法分析,语法分析,还有代码生成. 再复杂的编译器.再简单的编译器,功能上是差不多的,只是复杂的编译器实现上会更困难. 这个系列的文章是为了帮助你入门,在这个基础上再去看编译原理相关书籍,不至于打瞌睡. 如果你对编译原理很有兴趣,并且想更深一步的学习,在这里强烈推荐你看一本书--我心目中的神书--<计算机系统要素-从零开始构建现代计算机>. 这本书神在哪? 神在它通俗易懂,对小白足够友好,但又不过分肤浅

一个简单的web服务器例子

一个简单的web容器小例子,功能十分简单,只能访问静态资源,对于新手来说还是有一定的意义.主要分三个类 1.server类:主要功能开启socketServer,阻塞server,接收socket访问,解析request,创建request,作出响应 public class TestServer1 { private boolean shutdown = false; // web目录webroot public static final String WEB_ROOT = System.ge

Symfony2之创建一个简单的web应用

Symfony2——创建bundle     bundle就像插件或者一个功能齐全的应用,我们在应用层上开发的应用的所有代码,包括:PHP文件.配置文件.图片.css文件.js文件等都会包含在bunde系统中. 可以通过两种方法创建bundle,一种是通过命令行创建,一种是通过手动创建相应的文件和文件夹. 一:通过命令行创建,如下: 图1 执行以上命令 src/Acme/HelloBundle 被创建,指定使用的配置文件格式yml(还可以使用xml和php),同时自动在 app/AppKerne

Symfony2之创建一个简单的web应用 Symfony2——创建bundle

bundle就像插件或者一个功能齐全的应用,我们在应用层上开发的应用的所有代码,包括:PHP文件.配置文件.图片.css文件.js文件等都会包含在bunde系统中. 可以通过两种方法创建bundle,一种是通过命令行创建,一种是通过手动创建相应的文件和文件夹. 一:通过命令行创建,如下: 图1 执行以上命令 src/Acme/HelloBundle 被创建,指定使用的配置文件格式yml(还可以使用xml和php),同时自动在 app/AppKernel.php 添加一行代码,使得bundle注册

【Java学习笔记】如何写一个简单的Web Service

本Guide利用Eclipse以及Ant建立一个简单的Web Service,以演示Web Service的基本开发过程: 1.系统条件: Eclipse Java EE IDE for Web Developers Java SE 6 Windows XP 2.基本环境搭建: 1)Java SE6 JDK的安装:下载Java SE6 JDK,双击,安装默认选项进行安装即可. 2)Eclipse的安装与配置: 安装时直接解压.     配置处有两点,Window>Preferences>Jav