美文网首页区块链研习社区块链大学区块链研究
以太坊学习(二):Nethereum与Infura部署的智能合约

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

作者: 朵耳 | 来源:发表于2019-08-21 23:50 被阅读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查询到账户充值这笔交易已经上链了,不知道是什么原因,,,迷

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/tygwsctx.html