Wie kann ich mit Nethereum öffentliche Werte erhalten, wie es die Brieftasche tut?

Ich beschäftige mich gerade mit diesem Tutorial.

Nachdem ich den Vertrag auf der Seite bereitgestellt und eingerichtet hatte, erstellte ich einen Vorschlag aus der Ethereum-Wallet, den ich nach ein paar Blöcken sehen konnte. Der Teil „Aus Verträgen lesen“ zeigt alle Angebote, verfügbar nach ihrer Nummer. Dies impliziert, dass die Vorschläge irgendwo leicht verfügbar sind, aber ich möchte wissen, wie ich sie über Nethereum bekomme.

Ich habe den Vertrag wie folgt fertig.

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

Geben Sie hier die Bildbeschreibung ein

Wie komme ich an die Daten?

Antworten (1)

Das Nethereum.Web.Sample zeigt Ihnen, wie Sie mit dem DAO interagieren.

Dao im Nethereum

Im Beispiel gibt es einen generischen DAO-Dienst- Quellcode in Github

Ein einfaches Muster zum Erstellen eines Vertragsdienstes besteht darin, ihn mit Ihrer Web3-Klasse und ABI zu instanziieren.

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);
    }

Das DAO speichert die Gesamtzahl der Vorschläge, indem es ein öffentliches Attribut deklariert, auf das wie folgt zugegriffen werden kann:

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

Wenn Sie alle Vorschläge abrufen möchten, können Sie von 0 bis zur Gesamtzahl der Vorschläge iterieren und sie wie folgt zu einer Sammlung hinzufügen:

    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;
    }

Was oben fehlt, ist, wie man diese spezifischen Vorschlagsdaten erhält, damit Sie die Funktion "Vorschläge" aufrufen können. Dies ist in der Solidität die "Zuordnung" der Vorschlagsnummer und des Strukturvorschlags, die Ausgabeparameter sind.

   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;
    }

Oben haben Sie vielleicht bemerkt, dass die Ausgabe in ein Proposal-Objekt deserialisiert wird, dies ist die FunctionOutput und benötigt Informationen (von der ABI), um die Deserialisierung durchzuführen.

[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; }
}