Я возился с этим учебником.
После развертывания и настройки контракта на странице я создал предложение из кошелька ethereum, которое увидел через несколько блоков. В разделе чтения из договоров показаны все доступные предложения по их количеству. Это означает, что предложения легко доступны где-то, но я хочу знать, как получить их через нетереум.
У меня есть контракт, как показано ниже.
contract = web3.Eth.GetContract(abi, contractAddress);
Как я могу получить данные?
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; }
}