Нетереум // Infura/RPCclients

У меня чертовски много времени для публикации транзакций в основной сети. Проблема не в балансе моего кошелька или не в газе. Поиск баланса по тому же контракту работает правильно. Однако я не могу получить эту автономную подписанную транзакцию (эквивалент необработанной транзакции)

Я испробовал все способы передачи различных параметров, я установил defaultGas/Price через диспетчер транзакций и использовал метод SendTransactionAsync() с перегрузками, которые их не требуют. Я отправил метод с параметрами контракта индивидуально (не в массиве объектов, как показано ниже). Я дважды проверил одноразовый номер - он отображается как 0. Я пробовал и этот вариант, и вариант с ожиданием получения.

var contract = web3.Eth.GetContract(contractAbi,contractAddress);
var function = contract.GetFunction("transfer");
hash = await function.SendTransactionAsync(@from: accountAddress, gas: new HexBigInteger(60000),
       gasPrice: HexBigInteger(40), value: null, functionInput: new object[] {  recipient, Web3.Convert.ToWei(value) });

Контракт представляет собой стандартный токен ERC20. Любое понимание того, почему транзакция не возвращает ошибок, однако infura не транслирует? Я использовал один и тот же код много раз с обычным частным гет-узлом.

Изменить: я также пытался получить некоторые другие API RPC JSON. Если кто-то знаком, подтвердите ли вы, что это правильный способ сделать это, отправив способ полезной нагрузки данных? Я получаю «ошибку заниженной цены» от API etherscan

        var contract = web3.Eth.GetContract(contractAbi, contractAddress);
        var function = contract.GetFunction("transfer");
        string fdata = function.GetData(new object[] { recipient, Web3.Convert.ToWei(value) });
        var txCount = await web3.Eth.Transactions.GetTransactionCount.SendRequestAsync(accountAddress);

        var encoded = Web3.OfflineTransactionSigner.SignTransaction(privateKey: accountKey, to: contractAddress, amount: 0, nonce: txCount.Value, gasPrice: new BigInteger(70), gasLimit: new HexBigInteger(60000), data: fdata);
        encoded = "0x" + encoded;

Ответы (1)

Я вижу, что цена, которую вы используете, уже довольно низкая (ее необходимо преобразовать из Gwei в Wei), но вы также выиграете от оценки газа транзакции и использования других функций Nethereum.

Во-первых, у нас может быть просто TransferFunction. В основном это объект, описывающий функцию передачи из контракта ERC20 и различные параметры. Он наследуется от ContractMessage, который включает другие свойства, такие как AddressFrom, Gas, GasPrice, Value (Ether value), которые являются частью обычной транзакции.

[Function("transfer", "bool")]
public class TransferFunction : ContractMessage
{
    [Parameter("address", "_to", 1)]
    public string To { get; set; }

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

Теперь давайте определим наши пользовательские переменные:

var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c";
var receiverAddress = "0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe";
var privatekey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7";
var url = "https://rinkeby.infura.io/";

и создайте новый экземпляр Web3.

var web3 =  new Web3.Web3(new Account(privatekey), url);

Этот экземпляр Web3 был создан с использованием нового объекта Account с использованием закрытого ключа. В основном это позволяет Web3 подписывать любые транзакции «в автономном режиме» перед их отправкой, поэтому вам не нужно создавать все самостоятельно.

Следующим шагом является создание экземпляра сообщения, которое мы собираемся отправить.

var transactionMessage = new TransferFunction()
            {
                FromAddress = senderAddress,
                To = receiverAddress,
                TokenAmount = 100,
                //Set our own price
                GasPrice =  Web3.Web3.Convert.ToWei(25, UnitConversion.EthUnit.Gwei)

            };

Здесь был заполнен FromAddress (это не обязательно, так как он будет выбран из уже установленной учетной записи), получатель (To) из смарт-контракта, сумма и, наконец, GasPrice.

Эта цена GasPrice является пользовательской ценой (не используется значение по умолчанию для Nethereum, которое может быть слишком дорогим из-за колебаний цен, и сейчас это так).

Чтобы установить цену, мы преобразовали ее из Gwei, которая является единицей, обычно используемой для ценообразования, в Wei.

Теперь, когда у нас есть готовое «сообщение»/транзакция, мы можем создать обработчик транзакции, который будет отвечать за отправку транзакции.

var transferHandler = web3.Eth.GetContractTransactionHandler<TransferFunction>();

Еще один шаг (необязательный), поскольку он выполняется автоматически, — это оценка стоимости (в газе) транзакции.

var estimate = await transferHandler.EstimateGasAsync(transactionMessage, ContractAddress);
transactionMessage.Gas = estimate.Value;

И, наконец, отправьте транзакцию:

var transactionHash = await transferHandler.SendRequestAsync(transactionMessage, ContractAddress);

Полный образец можно найти здесь: https://github.com/Nethereum/Nethereum.CQS.SimpleTokenTransfer/blob/master/Nethereum.CQS.SimpleTokenTransfer/Program.cs#L111-L155 .