1.Infura简介
专业一点讲,Infura是一种IaaS(Infrastructure as a Service)产品,目的是为了降低访问以太坊数据的门槛。
通俗一点讲,Infura就是一个可以让你的dApp快速接入以太坊的平台,不需要本地运行以太坊节点。
从程序员的角度讲,Infura就是一个Web3 Provider,背后是负载均衡的API节点集群。使用它的好处就是,你永远不必担心连接的节点失效的问题,Infura会管理好这一切。
除此之外,Infura还可以很方便地接入IPFS。
最后,也是非常重要的一点:Infura目前是免费的。
原文链接:https://blog.csdn.net/TurkeyCock/article/details/85103434
2、Infura的使用
1、注册账户
进入官网:https://infura.io,根据提示输入邮箱密码,在收到的邮件中激活账户便可以使用了
2、新建项目
1)登录成功后点击【create new project】便可以创建一个项目
2)点击【view project】便可以查看到该账户的详细信息,如下图所示,project id便是与infura交互的接口
3)在security处可以设置部署在以太坊测试网上的智能合约地址
3、使用Nethereum库(以太坊提供的.NET库)与infura交互(下文代码还没有完全成功,只是做个记录,仅供参考)
1)关键变量
//账户地址,与智能合约交互时用到
static string senderAddress = "0xE00e17E4be50Cd2466AA1f8A9caeB9D183039fA6";
//智能合约编译过后的ABI和Bytecode可通过Remix编译器编译后查看,这两个太长了,此处就不付了,这两个在用代码部署智能合约时需要用到,下文没有用到contractByteCode
static string abi = @"*****";
static string contractByteCode = "*****";
2)实例化web3
//账户私钥,在申请账户时生成的PrivateKey
static string privateKey = "";
static Nethereum.Web3.Accounts.Account account = new Nethereum.Web3.Accounts.Account(privateKey);
//与rinkeby测试网连接,12834d34c3bf4516********是上文提到的infura创建project生成的project id
static Web3 web3 = new Web3(account,"https://rinkeby.infura.io/v3/12834d34c3bf4516***********");
3)实例化智能合约
部署智能合约的代码尚不成功,原因暂时不知道,很迷,此处贴上供参考,望大佬评论处留言告知。
通过以太坊学习(一):必备工具—Metamask 、 Etherscan 、 Remix、MyEtherWallet一文中提到的MyEthereumWallet即可将智能合约部署到指定的测试网上,所以下文直接使用部署成功的智能合约地址
//不成功代码
var web3 = new Web3("https://rinkeby.infura.io/v3/12834d34c3bf4516b2cf25fbd86caf52");
System.Numerics.BigInteger totalSupply = System.Numerics.BigInteger.Parse("1000000000000000000");
var receipt = await web3.Eth.DeployContract.SendRequestAndWaitForReceiptAsync(abi, contractByteCode, senderAddress, new Nethereum.Hex.HexTypes.HexBigInteger(900000), null, totalSupply);
var contract = web3.Eth.GetContract(abi, receipt.ContractAddress);
text_ContractAddress.Text = contract.ToString();
Console.WriteLine($"ContractAddress: {contract}");
//成功代码
static string contractAddress = "0xdd019A1e76c944848253E6f49e61fe71bF7a0bdf";
Nethereum.Contracts.Contract AuditContract = web3.Eth.GetContract(abi, contractAddress);
4)与合约交互
这是我的合约代码,现主要演示查询账户余额与用户充值两函数交互的代码
pragma solidity >=0.4.22 <0.6.0;
pragma experimental ABIEncoderV2;
contract Audit{
//查询账户余额
function GetBalances() public view returns(uint amount){
amount=balances[msg.sender];
}
//用户充值,返回用户账户余额
function AddBalances(uint amount) public returns(uint){
balances[msg.sender] += amount;
return balances[msg.sender];
}
}
用户充值:
PS:在一开始实例化web3的时候没有加account参数,此处一直通过不了,是因为这是一笔改变合约状态的交易,所以需要账户私钥签名交易,即解锁账户
//用户充值
private async void Btn_addbalance_Click(object sender, EventArgs e)
{
if (text_addbalance.Text == "")
{
MessageBox.Show("请输入充值余额");
}
else
{
HexBigInteger value = new HexBigInteger(new BigInteger(0));
var gas = await AuditContract.GetFunction("AddBalances").EstimateGasAsync(senderAddress, null, null, int.Parse(text_addbalance.Text));
// var AddBalancesFunction = AuditContract.GetFunction("AddBalances").SendTransactionAndWaitForReceiptAsync(senderAddress, gas,null, null, int.Parse(text_addbalance.Text));
Task AddBalancesFunction = AuditContract.GetFunction("AddBalances").SendTransactionAsync(senderAddress, gas, value, int.Parse(text_addbalance.Text));
AddBalancesFunction.Wait();
AddBalancesFunction.Result.ToString();
Console.WriteLine("充值成功!");
}
}
查询账户余额
//查询账户余额
private void Btn_getBalance_Click(object sender, EventArgs e)
{
int balances = 0;
Task getBalancesFunction = AuditContract.GetFunction("GetBalances").CallAsync();
getBalancesFunction.Wait();
balances = (int)getBalancesFunction.Result;
Console.WriteLine("账户余额: {0}", balances);
text_getbalance.Text = Convert.ToString(balances);
}
PS:目前查询账户余额仍然为0,代表用户充值没有成功,但是在Etherscan查询到账户充值这笔交易已经上链了,不知道是什么原因,,,迷