2 место Работаем с блокчейном напрямую

Как думаете какой кошелёк лучше - метамаск или трастваллет?
 
Дело вкуса и удобства. Сами по себе они выполняют одинаковые функции.
В принципе да и у них всех есть нужные сети. Метамаск почему-то выглядит забагованным, но почему-то им чаще пользюутся именно когда дело идёт с сетью ETH
 
Подскажите а как цену газа рассчитывается тут? Оно автоматически берет самую актуальную как на сайтах типа https://etherscan.io/gastracker или откуда?

и еще вопрос, у сети эфира chain id = 0x1 , а в примере там int, как быть? Или с блокчейном эфира нельзя напрямую работать, только через инфуру?
 
Последнее редактирование:
Подскажите а как цену газа рассчитывается тут? Оно автоматически берет самую актуальную как на сайтах типа https://etherscan.io/gastracker или откуда?

и еще вопрос, у сети эфира chain id = 0x1 , а в примере там int, как быть? Или с блокчейном эфира нельзя напрямую работать, только через инфуру?
Газ рассчитывается исходя из нагрузки сети, берётся прям напрямую из сети.
ID сети необходимо преобразовать из шестнадцатеричного формата в десятичный. В данном случае всё просто - id будет равен 1.
Тут всё сделано именно для работы напрямую, никакие инфуры не нужны.
 
Здравствуйте! Спасибо за статью, пытаюсь разобраться со всем по порядку. Я запросил баланс с файла blockchain_transaction-example, но он выдаёт ошибки подобного рода:

"Подключение сборки к проекту C:\Users\***\Desktop\Blockchain\dll\Nethereum.Accounts.dll не является .Net сборкой или не возможно получить доступ к сборке"

Добавлял вручную файлы dll, но тоже самое. Как можно решить это?
1684510956429.png
 
Здравствуйте! Спасибо за статью, пытаюсь разобраться со всем по порядку. Я запросил баланс с файла blockchain_transaction-example, но он выдаёт ошибки подобного рода:

"Подключение сборки к проекту C:\Users\***\Desktop\Blockchain\dll\Nethereum.Accounts.dll не является .Net сборкой или не возможно получить доступ к сборке"

Добавлял вручную файлы dll, но тоже самое. Как можно решить это?Посмотреть вложение 107158
Разобрался, нужно было разрешить доступ в свойствах файлов
 
А вы пробовали делать энкод типа bytes?

Нашёл такое решение и подобные, но выдаёт ошибку:
byte[] adapterParams = "0x".HexToByteArray();

Ошибка:
Компиляция кода Ошибка в действии "CS1061" "'string' does not contain a definition for 'HexToByteArray' and no accessible extension method 'HexToByteArray' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)". [Строка: 9; Cтолбец: 29]

Сам код:
C#:
Развернуть Свернуть Копировать
string abi = project.Variables["abi"].Value;
string functionName = project.Variables["functionName"].Value;
string token = project.Variables["token"].Value;
BigInteger amountLD = BigInteger.Parse("12923000000000000");
string to = project.Variables["to"].Value;
string callParamsrefundAddress = project.Variables["callParamsrefundAddress"].Value;
string callParamszroPaymentAddress = project.Variables["callParamszroPaymentAddress"].Value;
byte[] adapterParams = "0x".HexToByteArray();

string[] types = { "address", "uint256", "address", "address", "address", "bytes" };
object[] values = Converter.ValuesToArray(token, amountLD, to, callParamsrefundAddress, callParamszroPaymentAddress, adapterParams);
string dataEncoded = Encoder.EncodeTransactionData(abi, functionName, types, values);

project.Variables["dataEncoded"].Value = dataEncoded;
 
А вы пробовали делать энкод типа bytes?

Нашёл такое решение и подобные, но выдаёт ошибку:
byte[] adapterParams = "0x".HexToByteArray();

Ошибка:
Компиляция кода Ошибка в действии "CS1061" "'string' does not contain a definition for 'HexToByteArray' and no accessible extension method 'HexToByteArray' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)". [Строка: 9; Cтолбец: 29]

Сам код:
C#:
Развернуть Свернуть Копировать
string abi = project.Variables["abi"].Value;
string functionName = project.Variables["functionName"].Value;
string token = project.Variables["token"].Value;
BigInteger amountLD = BigInteger.Parse("12923000000000000");
string to = project.Variables["to"].Value;
string callParamsrefundAddress = project.Variables["callParamsrefundAddress"].Value;
string callParamszroPaymentAddress = project.Variables["callParamszroPaymentAddress"].Value;
byte[] adapterParams = "0x".HexToByteArray();

string[] types = { "address", "uint256", "address", "address", "address", "bytes" };
object[] values = Converter.ValuesToArray(token, amountLD, to, callParamsrefundAddress, callParamszroPaymentAddress, adapterParams);
string dataEncoded = Encoder.EncodeTransactionData(abi, functionName, types, values);

project.Variables["dataEncoded"].Value = dataEncoded;
Вот тут есть решение
 
  • Спасибо
Реакции: evgenii2000
Рассмотрим передаваемые данные, разбив их на куски по 32 байта, причём первые 4 байта это селектор функции, к которой необходимо обратиться.
Спасибо, статъя огонь! А что удобнее использовать для разбивки данных по 32 байта и преобразования с hex в dec? пробовал онлайн сервисы преобразования, но почему-то получаю корректные данные только если на входе цыфры. если на входе кошелек - не корректно. Видимо что то упускаю, только начинаю разбиратся с этими блокчейнами)
 
Последнее редактирование:
А как-то можно слать ненативные токены блокчейна?
В теме пример, шлет bnb в сети bsc
В доках либы нашел другой код, для эфира, но там опять же eth в сети эфир
а если я хочу eth в сети bsc или как-то еще, как быть?


и еще вопрос - в доках для сети эфира они infura используют, которая платная. Но можно найти и бесплатные rpc для сети эфира. Но насколько безопасно это? Не уведут ли приватный ключ если для транз пользоваться публичной бесплатной rpc? Или такой возможности впринципе нет?
 
Последнее редактирование:
Спасибо, статъя огонь! А что удобнее использовать для разбивки данных по 32 байта и преобразования с hex в dec? пробовал онлайн сервисы преобразования, но почему-то получаю корректные данные только если на входе цыфры. если на входе кошелек - не корректно. Видимо что то упускаю, только начинаю разбиратся с этими блокчейнами)
Адреса преобразовывать не нужно, только uint. Удобно использовать декодер данных наподобие вот этого:
Вводим abi, данные Calldata и получаем декодированные данные
 
Последнее редактирование:
  • Спасибо
Реакции: kul0n
А как-то можно слать ненативные токены блокчейна?
В теме пример, шлет bnb в сети bsc
В доках либы нашел другой код, для эфира, но там опять же eth в сети эфир
а если я хочу eth в сети bsc или как-то еще, как быть?
Покопался у себя в шаблонах и нашёл, что пытался реализовать отправку ненативных токенов, но пришлось отложить из-за нехватки времени. Думаю, что всё-таки можно реализовать при желании.

и еще вопрос - в доках для сети эфира они infura используют, которая платная. Но можно найти и бесплатные rpc для сети эфира. Но насколько безопасно это? Не уведут ли приватный ключ если для транз пользоваться публичной бесплатной rpc? Или такой возможности впринципе нет?
По поводу безопасности паблик rpc - скорее всего есть опасность перехвата каких-то данных, т.к. в списках rpc для каждой сети есть указатель приватности и предупреждение о пользовании неприватными. Вот тут можно посмотреть rpc для каждой сети:
rpc.png

Но тот же Metamask при добавлении новой сети спрашивает rpc, который есть в этом списке. Так что тут получается безопасность точно такая же, как при пользовании обычным криптокошельком.
 
Покопался у себя в шаблонах и нашёл, что пытался реализовать отправку ненативных токенов, но пришлось отложить из-за нехватки времени. Думаю, что всё-таки можно реализовать при желании.
У меня почти получилось, но не совсем. Вот такой код
C#:
Развернуть Свернуть Копировать
var privateKey = "мой ключ";
var account = new Account(privateKey);
var web3 = new Web3(account, "https://arbitrum.blockpi.network/v1/rpc/public");


var trans = await web3.Eth.ERC20.GetContractService("0x912CE59144191C1204E64559FE8253a0e49E6548").TransferFromRequestAndWaitForReceiptAsync("кошелек с которого отправляю", "кошелек на который отправляю", (BigInteger)0.09m);

Почти получилось потому что транзакция прошла, но там сумма 0.0000 вместо 0.09 arb. Наверное с числом какая-то путаница, хз



По поводу безопасности паблик rpc - скорее всего есть опасность перехвата каких-то данных, т.к. в списках rpc для каждой сети есть указатель приватности и предупреждение о пользовании неприватными. Вот тут можно посмотреть rpc для каждой сети:
ну каких-то данных о том что я там транзу сделал и тд может и не так страшно, главное чтобы приватный ключ не увели и вместе с ним все монеты
 
У меня почти получилось, но не совсем. Вот такой код
C#:
Развернуть Свернуть Копировать
var privateKey = "мой ключ";
var account = new Account(privateKey);
var web3 = new Web3(account, "https://arbitrum.blockpi.network/v1/rpc/public");


var trans = await web3.Eth.ERC20.GetContractService("0x912CE59144191C1204E64559FE8253a0e49E6548").TransferFromRequestAndWaitForReceiptAsync("кошелек с которого отправляю", "кошелек на который отправляю", (BigInteger)0.09m);

Почти получилось потому что транзакция прошла, но там сумма 0.0000 вместо 0.09 arb. Наверное с числом какая-то путаница, хз
Попробуй вот так:
C#:
Развернуть Свернуть Копировать
var account = new Account(WalletKey, ChainId);
var web3 = new Web3(account, JsonRpc);
web3.TransactionManager.UseLegacyAsDefault = true;

var transactionMessage = new TransferFunction
{
    FromAddress = account.Address,
    To ="адрес получателя",
    TokenAmount = amount      // количество
};

var transferHandler = web3.Eth.GetContractTransactionHandler<TransferFunction>();
var transferReceipt = transferHandler.SendRequestAndWaitForReceiptAsync("адрес контракта токена", transactionMessage).Result;

var transaction = web3.Eth.Transactions.GetTransactionByHash.SendRequestAsync(transferReceipt.TransactionHash).Result;

Ещё есть костыльный способ - у каждого токена в контракте есть функция transfer, в которую передаётся адрес получателя и количество. Кодируешь эти данные, как я описывал в этой статье и отправляешь через эту функцию.
transfer.png
 
Последнее редактирование:
TokenAmount насколько я из доков понял тоже имеет тип BigInteger, завтра посмотрю
 
TokenAmount насколько я из доков понял тоже имеет тип BigInteger, завтра посмотрю
Да, BigInterer.

Ещё кстати необходимо добавить вот этот класс

C#:
Развернуть Свернуть Копировать
[Function("transfer", "bool")]
public class TransferFunction : FunctionMessage
{
    [Parameter("address", "_to", 1)]
    public string To { get; set; }

    [Parameter("uint256", "_value", 2)]
    public BigInteger TokenAmount { get; set; }
}
 
Ну тогда смысла нет, тот же BigInteger, я так же смогу отправить 1 токен, но не смогу отправить 0.1 токен. Разработчики конечно молодцы, не добавили возможности слать не целые числа. Или я что-то не так понимаю?
 
Ну тогда смысла нет, тот же BigInteger, я так же смогу отправить 1 токен, но не смогу отправить 0.1 токен. Разработчики конечно молодцы, не добавили возможности слать не целые числа. Или я что-то не так понимаю?
В данном случае одна единица - это значение в Wei, т.е 10 в минус 18й степени от целого токена. В транзакциях как раз такие единицы и используются. У меня в приложенном шаблоне для удобства конвертировалось из целых значений, и тут тоже можно предварительно конвертнуть:
C#:
Развернуть Свернуть Копировать
Web3.Convert.ToWei(amount).ToHexBigInteger();
 
Так тут уже тип данных будет HexBigInteger а не просто BigInteger, соответственно функция его не примет, разве нет?
 
Так тут уже тип данных будет HexBigInteger а не просто BigInteger, соответственно функция его не примет, разве нет?
В переменную amount подаю 0.001:
converter.png


Есть только метод ToHexBigInteger()
 
Ну вот я в свой код это ToHexBigInteger сую, у меня ошибка при выполнении
C#:
Развернуть Свернуть Копировать
var trans = await web3.Eth.ERC20.GetContractService("0x912CE59144191C1204E64559FE8253a0e49E6548").TransferFromRequestAndWaitForReceiptAsync("кошелек с которого отправляю", "кошелек на который отправляю", Web3.Convert.ToWei(0.09M).ToHexBigInteger());
 
Ну вот я в свой код это ToHexBigInteger сую, у меня ошибка при выполнении
C#:
Развернуть Свернуть Копировать
var trans = await web3.Eth.ERC20.GetContractService("0x912CE59144191C1204E64559FE8253a0e49E6548").TransferFromRequestAndWaitForReceiptAsync("кошелек с которого отправляю", "кошелек на который отправляю", Web3.Convert.ToWei(0.09M).ToHexBigInteger());
Возможно ошибка в чём-то другом?
И то и другое даёт одинаковый результат
bigint.png


У меня в транзакциях используется конвертация как во втором варианте, хотя первый судя по всему то же самое
 
Возможно ошибка в чём-то другом?
И то и другое даёт одинаковый результат
Посмотреть вложение 107614

У меня в транзакциях используется конвертация как во втором варианте, хотя первый судя по всему то же самое

Ну результат один, но тип данных другой, поэтому код крашится. Если туда поставить BigInteger(0.09M) то все супер, функция отправится, правда сумма будет 0 потому что BigInteger это не дробное
 
Ну результат один, но тип данных другой
Вроде тот же самый тип данных
Если туда поставить BigInteger(0.09M) то все супер, функция отправится, правда сумма будет 0 потому что BigInteger это не дробное
Попробуй просто пропиши сумму в wei без конвертации в HexBigInteger
C#:
Развернуть Свернуть Копировать
BigInteger amount = BigInteger.Parse("100000000000");
 
с ошибкой сыплется {"Smart contract error: ERC20: insufficient allowance"} если вот эту переменную amount делаю и вставляю ее в качестве суммы
 
с ошибкой сыплется {"Smart contract error: ERC20: insufficient allowance"} если вот эту переменную amount делаю и вставляю ее в качестве суммы
Эта ошибка появляется в 2х вариантах отправки? Что я скидывал чуть выше и твой? А то у меня нет возможности проверить.

Вот тут говорят по этой ошибке, что адрес отправителя должен быть сперва одобрен для совершения перевода токенов
 
Моим вариантом BigInteger(0.09M) без ошибки, я специально проверил еще раз, просто сумма транзы 0, потому что biginteger это целое число

А кем одобрен? Когда нативные токены через либу гонял никаких одобрений не надо было.
 
Моим вариантом BigInteger(0.09M) без ошибки, я специально проверил еще раз, просто сумма транзы 0, потому что biginteger это целое число

А кем одобрен? Когда нативные токены через либу гонял никаких одобрений не надо было.

Нативные токены то другое, с ними проблем нет. Вот выше на stackoverflow написано почему так, но в библиотеке nethereum я не нашёл методов для такого одобрения. Я писал перевод кастомных токенов для других блокчейнов и там такой проблемы не было. Нужно ещё посидеть разобраться...
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)