Как я могу получить публичные ценности контракта с nethereum, как это делает кошелек?

Я возился с этим учебником.

После развертывания и настройки контракта на странице я создал предложение из кошелька ethereum, которое увидел через несколько блоков. В разделе чтения из договоров показаны все доступные предложения по их количеству. Это означает, что предложения легко доступны где-то, но я хочу знать, как получить их через нетереум.

У меня есть контракт, как показано ниже.

contract = web3.Eth.GetContract(abi, contractAddress);

введите описание изображения здесь

Как я могу получить данные?

Ответы (1)

Nethereum.Web.Sample показывает, как взаимодействовать с DAO.

Дао в Нетериуме

В примере есть общий исходный код службы DAO в Github.

Простой шаблон для создания контрактной службы — создать ее экземпляр с помощью класса Web3 и ABI.

public class DaoService
{
    private readonly Web3.Web3 web3;
    private string abi = @"abi...";
    private Contract contract;
    public DaoService(Web3.Web3 web3, string address)
    {
        this.web3 = web3;
        this.contract = web3.Eth.GetContract(abi, address);
    }

DAO хранит общее количество предложений, объявляя общедоступный атрибут, доступ к которому можно получить следующим образом:

    public Task<long> GetNumberOfProposals()
    {
        return contract.GetFunction("numberOfProposals").CallAsync<long>();
    }

Если вы хотите получить все предложения, вы можете выполнить итерацию от 0 до общего количества предложений и добавить их в коллекцию как:

    public async Task<List<Proposal>> GetAllProposals()
    {

        var numberOfProposals = await GetNumberOfProposals().ConfigureAwait(false);
        var proposals = new List<Proposal>();

        for (var i = 0; i < numberOfProposals; i++)
        {
            proposals.Add(await GetProposal(i).ConfigureAwait(false));
        }
        return proposals;
    }

Чего не хватает выше, так это того, как получить эти конкретные данные о предложении, чтобы вы могли вызывать функцию «предложения», это твердое «сопоставление» номера предложения и предложения структуры, которые являются выходными параметрами.

   public async Task<Proposal> GetProposal(long index)
    {
        var proposalsFunction = contract.GetFunction("proposals");
        var proposal = await proposalsFunction.CallDeserializingToObjectAsync<Proposal>(index).ConfigureAwait(false);
        proposal.Index = index;
        return proposal;
    }

Вы могли заметить, что выходные данные десериализуются в объект предложения, это FunctionOuput, и для выполнения десериализации требуется информация (из ABI).

[FunctionOutput]
public class Proposal
{
    public long Index { get; set; }

    [Parameter("address", 1)]
    public string Recipient { get; set; }

    [Parameter("uint256", 2)]
    public BigInteger Amount { get; set; }

    [Parameter("string", 3)]
    public string Description { get; set; }

    [Parameter("uint256", 4)]
    public BigInteger VotingDeadline { get; set; }

    [Parameter("bool", 5)]
    public bool Open { get; set; }

    [Parameter("bool", 6)]
    public bool ProposalPassed { get; set; }

    [Parameter("bytes32", 7)]
    public byte[] ProposalHash { get; set; }

    public string GetProposalHashToHex()
    {
        return ProposalHash.ToHex();
    }

    [Parameter("uint256", 8)]
    public BigInteger ProposalDeposit { get; set; }

    [Parameter("bool", 9)]
    public bool NewCurator { get; set; }

    [Parameter("uint256", 10)]
    public BigInteger Yea { get; set; }

    [Parameter("uint256", 11)]
    public BigInteger Nay { get; set; }

    [Parameter("address", 12)]
    public string Creator { get; set; }
}