首页 > 其他分享 >区块链入门基础课:《Nethereum教程》零基础玩转以太坊开发(三)合约状态

区块链入门基础课:《Nethereum教程》零基础玩转以太坊开发(三)合约状态

时间:2024-08-03 12:26:20浏览次数:18  
标签:状态 Nethereum 以太 ABI 示例 基础课 var 区块 合约

今天我们要讨论的是如何与智能合约进行交互,获取合约状态。下面的示例将会详细讲解如何与合约进行交互,及一些概念性的解释,有需要的朋友们可以收藏一下。

一:概念解释

在下面示例之前呢,我先解释下为什么需要调用合约状态,以及合约状态对开发而言有什么作用。

实时的了解合约状态可以监控合约中的关键变量信息,了解合约目前的运行数据及任何在合约上进行的交易或者其他业务。

举个很简单的例子,比如你的合约的功能是在链上做一个匿名投票业务。那么你调用合约状态就可以得知哪些地址投了哪些票,投票情况分布是怎样的。以此你可以基于这些数据进行下一步业务处理。

安全性:在特定的场景下,可以验证来源信息是否与链上信息一致,以此来防止篡改数据,或者某些欺诈行为。

那么对于dapp而言,前端也需要实时展示合约的最新数据。

合约状态也可以获取代币交易情况,价格变动,交易量等,以此作为数据分析和审计的基础。

概念就解释到这里,以下开始示例代码

二:关键步骤

我先梳理下关键步骤:

我直接示例可能不够直观,这里我模拟一份ABI的数据。

  1. 设置Web3实例

  2. 创建Account实例 (按实际业务)

  3. 获取合约状态

1.模拟数据

首先,你需要有ABI和合约地址,我在这里假设你已经有了,关于ABI和合约地址,你可以在我上期文章中查看具体操作。

区块链入门基础课:《Nethereum教程》零基础玩转以太坊开发(二)合约交互


// 假设的智能合约ABI
string abi = @"[
    {
        ""constant"": true,
        ""inputs"": [],
        ""name"": ""getState"",
        ""outputs"": [
            {
                ""name"": """",
                ""type"": ""uint256""
            }
        ],
        ""payable"": false,
        ""stateMutability"": ""view"",
        ""type"": ""function""
    }
]";

// 假设的智能合约地址
string contractAddress = "0x1234567890123456789012345678901234567890";

2.设置web3实例


// 创建Web3实例,需要提供RPC节点的URL
var web3 = new Web3("https://mainnet.infura.io/v3/YOUR_PROJECT_ID");

3.获取合约状态


public async Task<BigInteger> GetContractState()
{
    // 加载合约
    var contract = web3.Eth.GetContract(abi, contractAddress);

    // 创建函数调用
    var getStateFunction = contract.GetFunction("getState");

    // 调用函数并解析返回的数据
    var state = await getStateFunction.CallDeserializingToObjectAsync<BigInteger>();

    // 返回状态值
    return state;
}

4.使用模拟数据测试

在真实的环境中,GetContractState方法将直接从以太坊网络获取数据。在本示例中,我们将模拟返回值,这样方便提供一个直观的结果。


public async Task TestGetContractState()
{
    // 模拟返回的值
    var simulatedValue = new BigInteger(42); // 假设智能合约返回的状态值为42

    // 覆盖实际调用,用于测试
    var originalMethod = typeof(Contract).GetMethod(nameof(GetContractState));
    var proxy = ProxyGenerator.CreateInterfaceProxyWithoutTarget<ICallableContract>(null);
    var method = proxy.GetType().GetMethod(nameof(ICallableContract.CallDeserializingToObjectAsync));

    var mockMethod = method.MakeGenericMethod(typeof(BigInteger));
    mockMethod.Invoke(proxy, new object[] { simulatedValue });

    // 将模拟方法的结果返回给GetContractState
    var result = await ((Func<Task<BigInteger>>)originalMethod.CreateDelegate(typeof(Func<Task<BigInteger>>), proxy))();

    // 输出结果
    Console.WriteLine($"合约状态: {result}");
}

仅用于演示目的。在实际应用中,你应该使用真实的以太坊节点来调用智能合约。

上述代码中的模拟返回值42也没有任何的意义,只是单纯为了模拟合约返回,这里真实场景中可以返回例如:计数器,积分,状态码,等等,根据实际业务判定。

三:总结

本次示例步骤解析:

1.导入Nethereum包并添加引用

例如Nethereum.Web3Nethereum.ContractsSystem.Numerics,和System.Threading.Tasks

2.创建web3实例

使用以太坊节点的RPC URL创建一个Web3实例,这将作为与以太坊网络通信的接口

3.定义智能合约的ABI和地址

再次解释下ABI的含义。它描述了智能合约的接口,包括函数签名、输入和输出类型。合约地址是智能合约在以太坊区块链上的唯一标识符。

4.加载合约并调用函数

使用web3.Eth.GetContract方法加载合约,并通过GetFunction方法创建一个函数实例,然后调用CallDeserializingToObjectAsync来执行函数并解析返回值。

5.处理返回值及后续业务逻辑

返回值通常是Task<T>类型,其中T是你期望的数据类型,如Integer。你可以将返回的Task对象转换为具体的类型,并进一步处理。

那么截止到这里,就已经简单的完成了一个获取合约状态的示例。

后期内容我们会进阶讲解

如何监听事件

如何获取账户余额

如何账户管理,管理生成以太坊的账户,私钥,公钥和地址

如何构建,签署和广播交易到以太坊主网

如何在链中扫描块

如何扫描交易数据

如何转移代币,等等功能开发,敬请期待!

标签:状态,Nethereum,以太,ABI,示例,基础课,var,区块,合约
From: https://blog.csdn.net/qq_16712551/article/details/140852377

相关文章

  • 区块链基础知识
     区块链概述比特币诞生后不久,人们开始意识到区块链技术本身具有巨大的潜力,并逐渐发展出独立的应用领域。区块链通常被定义为一种去中心化的分布式账本技术,最初用于记录信息,以确保这些记录不可篡改,从而不需要依赖第三方机构来验证其真实性。随着以太坊的出现,区块链技术进一步......
  • 区块链的共识机制
    区块链的共识机制确保分布式网络中所有参与节点对区块链状态达成一致的算法说人话怎么证明你的东西是你的1.工作量证明(ProofofWork,PoW)概念:通过解决复杂的数学问题来竞争记账权,最先解出问题的节点获得区块奖励。应用:比特币、以太坊(计划从PoW转为PoS)。优点:高度去中......
  • 区块链技术简介
    引言区块链,一种分布式账本技术,不仅为数字货币提供了基础设施,更在金融、供应链、物联网等多个领域展现出广泛的应用前景。区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人们的生产力,电力解决了人们基本的生活需求,互联网彻底改变了......
  • 区块链共识协议算法
    一、常见共识协议算法1.ByzantineFaultTolerance(BFT)BFT是一种容错算法,旨在在系统中存在一部分恶意或故障节点的情况下,仍然能够达到一致性。特点:容忍拜占庭故障,即能够处理部分节点不可靠或恶意的情况。通常适用于许可链(私有链或联盟链)。应用:HyperledgerFabri......
  • 区块链存证
    区块链存证本教程由做字体网(www.zuoziti.com)友情提供!本教程是制作手写字体系列教程,建议从序言部分开始阅读学习!如需交流,请加QQ924268440本节视频教程什么是区块链存证区块链存证就是将作品信息加密生成独一无二的DNA数字指纹,并基于区块链和电子签章技术,将存证文件......
  • 【提交ACM出版 | EI&Scopus检索稳定 | 高录用】2024年数字经济,区块链与人工智能国际学
    2024年数字经济,区块链与人工智能国际学术会议(DEBAI2024)为第五届大数据与社会科学国际学术会议(ICBDSS2024)的分会,将于2024年8月23-25日在中国-广州隆重举行。为了让更多的学者有机会参与会议分享交流经验。本次会议主要围绕“数字经济,区块链与人工智能等研究领域展开讨论......
  • GitHub上一些值得关注的区块链项目
    FuelLabs/fuel-core-Rust全节点实现,支持Fuelv2协议https://github.com/topics/blockchain-projects。ethereum/go-ethereum-Ethereum协议的官方Go语言实现。bitcoinbook/bitcoinbook-《精通比特币》第三版,开源书籍,深入讲解比特币开发。heyxyz/hey-基于LensP......
  • 区块链面试问题
    1、区块链是什么?区块链是一个不断增长的分类账(文件),它以安全、按时间顺序和不可变的方式永久记录已发生的所有交易。它可用于资金、财产、合同等的安全转移,而无需银行或政府等第三方中介。区块链是最著名的加密货币比特币的支柱。它是一个点对点的电子现金系统和一个去中心......
  • 区块链的基石:工作量证明机制,如何驱动数字货币革命?
    1工作量证明(PoW,ProofofWork)为防止恶意攻击,节点需完成复杂计算任务(即“挖矿”)来证明他们的工作量。这是一种共识机制,确保只有合法的区块可被添入区块链。第一代共识机制,比特币的基础,即“按劳取酬”,你付出多少工作量,就获得多少报酬。网络世界里,劳动就是你为网络提供的计算服务......
  • 算法基础课第一章(中)高精度+前缀和+差分
    一、高精度(一)使用高精度的原因在计算机中处理非常大或非常小的数值时,确保计算结果的精确性和准确性。在特定情况下,可以自己实现高精度计算的数据结构和算法,例如使用字符串或数组来表示大数,并实现基本的加、减、乘、除操作。(二)高精度加法1、方法(1)描述:从最低位开始加法计算......