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

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113

Gabamas

Новичок
Регистрация
12.04.2023
Сообщения
11
Благодарностей
2
Баллы
3
Как думаете какой кошелёк лучше - метамаск или трастваллет?
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113

Gabamas

Новичок
Регистрация
12.04.2023
Сообщения
11
Благодарностей
2
Баллы
3
Дело вкуса и удобства. Сами по себе они выполняют одинаковые функции.
В принципе да и у них всех есть нужные сети. Метамаск почему-то выглядит забагованным, но почему-то им чаще пользюутся именно когда дело идёт с сетью ETH
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
Подскажите а как цену газа рассчитывается тут? Оно автоматически берет самую актуальную как на сайтах типа https://etherscan.io/gastracker или откуда?

и еще вопрос, у сети эфира chain id = 0x1 , а в примере там int, как быть? Или с блокчейном эфира нельзя напрямую работать, только через инфуру?
 
Последнее редактирование:

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
Подскажите а как цену газа рассчитывается тут? Оно автоматически берет самую актуальную как на сайтах типа https://etherscan.io/gastracker или откуда?

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

evgenii2000

Client
Регистрация
08.06.2018
Сообщения
17
Благодарностей
2
Баллы
3
Здравствуйте! Спасибо за статью, пытаюсь разобраться со всем по порядку. Я запросил баланс с файла blockchain_transaction-example, но он выдаёт ошибки подобного рода:

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

Добавлял вручную файлы dll, но тоже самое. Как можно решить это?
1684510956429.png
 

evgenii2000

Client
Регистрация
08.06.2018
Сообщения
17
Благодарностей
2
Баллы
3
Здравствуйте! Спасибо за статью, пытаюсь разобраться со всем по порядку. Я запросил баланс с файла blockchain_transaction-example, но он выдаёт ошибки подобного рода:

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

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

evgenii2000

Client
Регистрация
08.06.2018
Сообщения
17
Благодарностей
2
Баллы
3
А вы пробовали делать энкод типа 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;
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
А вы пробовали делать энкод типа 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

kul0n

Client
Регистрация
10.03.2016
Сообщения
86
Благодарностей
14
Баллы
8
Рассмотрим передаваемые данные, разбив их на куски по 32 байта, причём первые 4 байта это селектор функции, к которой необходимо обратиться.
Спасибо, статъя огонь! А что удобнее использовать для разбивки данных по 32 байта и преобразования с hex в dec? пробовал онлайн сервисы преобразования, но почему-то получаю корректные данные только если на входе цыфры. если на входе кошелек - не корректно. Видимо что то упускаю, только начинаю разбиратся с этими блокчейнами)
 
Последнее редактирование:

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
А как-то можно слать ненативные токены блокчейна?
В теме пример, шлет bnb в сети bsc
В доках либы нашел другой код, для эфира, но там опять же eth в сети эфир
а если я хочу eth в сети bsc или как-то еще, как быть?


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

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
Спасибо, статъя огонь! А что удобнее использовать для разбивки данных по 32 байта и преобразования с hex в dec? пробовал онлайн сервисы преобразования, но почему-то получаю корректные данные только если на входе цыфры. если на входе кошелек - не корректно. Видимо что то упускаю, только начинаю разбиратся с этими блокчейнами)
Адреса преобразовывать не нужно, только uint. Удобно использовать декодер данных наподобие вот этого:
Вводим abi, данные Calldata и получаем декодированные данные
 
Последнее редактирование:
  • Спасибо
Реакции: kul0n

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
А как-то можно слать ненативные токены блокчейна?
В теме пример, шлет bnb в сети bsc
В доках либы нашел другой код, для эфира, но там опять же eth в сети эфир
а если я хочу eth в сети bsc или как-то еще, как быть?
Покопался у себя в шаблонах и нашёл, что пытался реализовать отправку ненативных токенов, но пришлось отложить из-за нехватки времени. Думаю, что всё-таки можно реализовать при желании.

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

Но тот же Metamask при добавлении новой сети спрашивает rpc, который есть в этом списке. Так что тут получается безопасность точно такая же, как при пользовании обычным криптокошельком.
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
Покопался у себя в шаблонах и нашёл, что пытался реализовать отправку ненативных токенов, но пришлось отложить из-за нехватки времени. Думаю, что всё-таки можно реализовать при желании.
У меня почти получилось, но не совсем. Вот такой код
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 для каждой сети:
ну каких-то данных о том что я там транзу сделал и тд может и не так страшно, главное чтобы приватный ключ не увели и вместе с ним все монеты
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
У меня почти получилось, но не совсем. Вот такой код
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
 
Последнее редактирование:

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
TokenAmount насколько я из доков понял тоже имеет тип BigInteger, завтра посмотрю
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
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; }
}
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
Ну тогда смысла нет, тот же BigInteger, я так же смогу отправить 1 токен, но не смогу отправить 0.1 токен. Разработчики конечно молодцы, не добавили возможности слать не целые числа. Или я что-то не так понимаю?
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
Ну тогда смысла нет, тот же BigInteger, я так же смогу отправить 1 токен, но не смогу отправить 0.1 токен. Разработчики конечно молодцы, не добавили возможности слать не целые числа. Или я что-то не так понимаю?
В данном случае одна единица - это значение в Wei, т.е 10 в минус 18й степени от целого токена. В транзакциях как раз такие единицы и используются. У меня в приложенном шаблоне для удобства конвертировалось из целых значений, и тут тоже можно предварительно конвертнуть:
C#:
Web3.Convert.ToWei(amount).ToHexBigInteger();
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
Так тут уже тип данных будет HexBigInteger а не просто BigInteger, соответственно функция его не примет, разве нет?
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
Так тут уже тип данных будет HexBigInteger а не просто BigInteger, соответственно функция его не примет, разве нет?
В переменную amount подаю 0.001:
converter.png


Есть только метод ToHexBigInteger()
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
Ну вот я в свой код это ToHexBigInteger сую, у меня ошибка при выполнении
C#:
var trans = await web3.Eth.ERC20.GetContractService("0x912CE59144191C1204E64559FE8253a0e49E6548").TransferFromRequestAndWaitForReceiptAsync("кошелек с которого отправляю", "кошелек на который отправляю", Web3.Convert.ToWei(0.09M).ToHexBigInteger());
 

Zedx

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


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

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
Возможно ошибка в чём-то другом?
И то и другое даёт одинаковый результат
Посмотреть вложение 107614

У меня в транзакциях используется конвертация как во втором варианте, хотя первый судя по всему то же самое
Ну результат один, но тип данных другой, поэтому код крашится. Если туда поставить BigInteger(0.09M) то все супер, функция отправится, правда сумма будет 0 потому что BigInteger это не дробное
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
Ну результат один, но тип данных другой
Вроде тот же самый тип данных
Если туда поставить BigInteger(0.09M) то все супер, функция отправится, правда сумма будет 0 потому что BigInteger это не дробное
Попробуй просто пропиши сумму в wei без конвертации в HexBigInteger
C#:
BigInteger amount = BigInteger.Parse("100000000000");
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
с ошибкой сыплется {"Smart contract error: ERC20: insufficient allowance"} если вот эту переменную amount делаю и вставляю ее в качестве суммы
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
с ошибкой сыплется {"Smart contract error: ERC20: insufficient allowance"} если вот эту переменную amount делаю и вставляю ее в качестве суммы
Эта ошибка появляется в 2х вариантах отправки? Что я скидывал чуть выше и твой? А то у меня нет возможности проверить.

Вот тут говорят по этой ошибке, что адрес отправителя должен быть сперва одобрен для совершения перевода токенов
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
Моим вариантом BigInteger(0.09M) без ошибки, я специально проверил еще раз, просто сумма транзы 0, потому что biginteger это целое число

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

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
Моим вариантом BigInteger(0.09M) без ошибки, я специально проверил еще раз, просто сумма транзы 0, потому что biginteger это целое число

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

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