c#实战开发:用.net core开发一个简单的Web以太坊钱包 (六)
今天就来开发一个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(, , ));
;
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 = ,
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 = ,
//Set our own price
GasPrice = Web3.Web3.Convert.ToWei(, 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
至此 大致功能已经完成! 感谢观看! 下期比特币!
c#实战开发:用.net core开发一个简单的Web以太坊钱包 (六)的更多相关文章
- 自己动手模拟开发一个简单的Web服务器
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...
- 给 asp.net core 写一个简单的健康检查
给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...
- 一个简单的web服务器例子
一个简单的web容器小例子,功能十分简单,只能访问静态资源,对于新手来说还是有一定的意义.主要分三个类 1.server类:主要功能开启socketServer,阻塞server,接收socket访问 ...
- Symfony2之创建一个简单的web应用
Symfony2——创建bundle bundle就像插件或者一个功能齐全的应用,我们在应用层上开发的应用的所有代码,包括:PHP文件.配置文件.图片.css文件.js文件等都会包含在bu ...
- 自己模拟的一个简单的web服务器
首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...
- 一个简单的web.py论坛
一.概述 forum是一个简单的web.py论坛,后端采用Python+web.py+MySQL,前端采用HTML+CSS+JavaScript+jQuery+RequireJS. 该论坛的主要功能包 ...
- 【Java学习笔记】如何写一个简单的Web Service
本Guide利用Eclipse以及Ant建立一个简单的Web Service,以演示Web Service的基本开发过程: 1.系统条件: Eclipse Java EE IDE for Web De ...
- 2.1 一个简单的Web工程例子
一个简单的Web工程例子 开发环境: Eclipse: Neon Release (4.6.0) JDK:1.8.0_92 Tomcat:8.5.9 Maven:3.3.9 1. 在Eclipse中创 ...
- Symfony2之创建一个简单的web应用 Symfony2——创建bundle
bundle就像插件或者一个功能齐全的应用,我们在应用层上开发的应用的所有代码,包括:PHP文件.配置文件.图片.css文件.js文件等都会包含在bunde系统中. 可以通过两种方法 ...
随机推荐
- Linux 第十天
十三.权限管理 1.ACL权限开启 1)dumpe2fs -h /dev/sda3查看分区ACL权限是否开启 -h:仅显示超级块中信息,而不显示磁盘块组的详细信息 2)mount -o remount ...
- MFC树形控件的使用(右键点击)
在MFC中,会用到树形控件,这里做下记录. 右键点击 1.添加右键点击事件(NM_RCLICK) 2.获得鼠标在Client的坐标 CPoint point; GetCursorPos(&po ...
- C++ MFC棋牌类小游戏day3
今天开始设计小人棋子. 画法跟画虎一样,唯一不一样的是小人在刚开始会有重叠的情况,所以画起来可能比虎的棋子能够难一点. 我打算用Location结构体中的num来标记每个棋盘坐标存在棋子的个数,isH ...
- 学以致用二十七-----Centos7.5二进制安装mysql5.7.23
首先去官网查看mysql版本.才一个礼拜不到,我之前下载的是mysql5.7.23,现在在官网页面已然找不到了,只有5.7.24版本,不得不说更新真快.不过我下载的是mysql5.7.23,所以还是安 ...
- Reading | 《Linux就该这么学》
目录 一.前言 1.Linux概念 2.RPM(红帽软件包管理器) 3.Yum软件仓库 二.常用Linux命令 1.Shell 2.命令基本格式和man命令 3.常用系统工作命令 echo命令 dat ...
- poj 2505 A multiplication game
题目 题意:两个人轮流玩游戏,Stan先手,数字 p从1开始,Stan乘以一个2-9的数,然后Ollie再乘以一个2-9的数,直到谁先将p乘到p>=n时那个人就赢了,而且轮到某人时,某人必须乘以 ...
- JavaSE核心之一:Date类、Calendar类、Math类、枚举;
1.Date类 1) java.util.Date类用于封装日期及时间信息,一般仅用它显示某个日期,不对他作任何操作处理,作处理用Calendar类,计算方便. 2) Date 类本质上拥有一个lon ...
- LeetCode算法题(长期更新)
1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样 ...
- JavaScript中的constructor和继承
概述 这是我在看JavaScript面向对象编程指南的时候,对constructor和继承的总结. 关于它们的详细知识,可以上网查到,所以我只写那些网上没有的. 内容 constructor的理解 c ...
- 机器学习基石笔记:13 Hazard of Overfitting
泛化能力差和过拟合: 引起过拟合的原因: 1)过度VC维(模型复杂度高)------确定性噪声: 2)随机噪声: 3)有限的样本数量N. 具体实验来看模型复杂度Qf/确定性噪声.随机噪声sigma2. ...