区块链研习社区块链大学区块链研究

以太坊学习(二):Nethereum与Infura部署的智能合约

2019-08-21  本文已影响0人  朵耳

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】便可以创建一个项目

image

2)点击【view project】便可以查看到该账户的详细信息,如下图所示,project id便是与infura交互的接口

image

3)在security处可以设置部署在以太坊测试网上的智能合约地址

image

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<string> 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<BigInteger> getBalancesFunction = AuditContract.GetFunction("GetBalances").CallAsync<BigInteger>();
            getBalancesFunction.Wait();
            balances = (int)getBalancesFunction.Result;
            Console.WriteLine("账户余额: {0}", balances);
            text_getbalance.Text = Convert.ToString(balances);
        }

PS:目前查询账户余额仍然为0,代表用户充值没有成功,但是在Etherscan查询到账户充值这笔交易已经上链了,不知道是什么原因,,,迷

上一篇下一篇

猜你喜欢

热点阅读