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

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
А почему в using не получается прописать Nethereum.Accounts, хотя в GAC добавлена эта либа
В этой библиотеке пространство имён для подключения Nethereum.Web3.Accounts
 

Gabamas

Новичок
Joined
Apr 12, 2023
Messages
11
Reaction score
2
Points
3
Как думаете какой кошелёк лучше - метамаск или трастваллет?
 

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
Как думаете какой кошелёк лучше - метамаск или трастваллет?
Дело вкуса и удобства. Сами по себе они выполняют одинаковые функции.
 

Gabamas

Новичок
Joined
Apr 12, 2023
Messages
11
Reaction score
2
Points
3
Дело вкуса и удобства. Сами по себе они выполняют одинаковые функции.
В принципе да и у них всех есть нужные сети. Метамаск почему-то выглядит забагованным, но почему-то им чаще пользюутся именно когда дело идёт с сетью ETH
 

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
Подскажите а как цену газа рассчитывается тут? Оно автоматически берет самую актуальную как на сайтах типа https://etherscan.io/gastracker или откуда?

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

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
Подскажите а как цену газа рассчитывается тут? Оно автоматически берет самую актуальную как на сайтах типа https://etherscan.io/gastracker или откуда?

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

evgenii2000

Client
Joined
Jun 8, 2018
Messages
20
Reaction score
4
Points
3
Здравствуйте! Спасибо за статью, пытаюсь разобраться со всем по порядку. Я запросил баланс с файла blockchain_transaction-example, но он выдаёт ошибки подобного рода:

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

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

evgenii2000

Client
Joined
Jun 8, 2018
Messages
20
Reaction score
4
Points
3
Здравствуйте! Спасибо за статью, пытаюсь разобраться со всем по порядку. Я запросил баланс с файла blockchain_transaction-example, но он выдаёт ошибки подобного рода:

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

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

evgenii2000

Client
Joined
Jun 8, 2018
Messages
20
Reaction score
4
Points
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
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
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;
Вот тут есть решение
 
  • Thank you
Reactions: evgenii2000

kul0n

Client
Joined
Mar 10, 2016
Messages
97
Reaction score
35
Points
18
Рассмотрим передаваемые данные, разбив их на куски по 32 байта, причём первые 4 байта это селектор функции, к которой необходимо обратиться.
Спасибо, статъя огонь! А что удобнее использовать для разбивки данных по 32 байта и преобразования с hex в dec? пробовал онлайн сервисы преобразования, но почему-то получаю корректные данные только если на входе цыфры. если на входе кошелек - не корректно. Видимо что то упускаю, только начинаю разбиратся с этими блокчейнами)
 
Last edited:

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
А как-то можно слать ненативные токены блокчейна?
В теме пример, шлет bnb в сети bsc
В доках либы нашел другой код, для эфира, но там опять же eth в сети эфир
а если я хочу eth в сети bsc или как-то еще, как быть?


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

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
Спасибо, статъя огонь! А что удобнее использовать для разбивки данных по 32 байта и преобразования с hex в dec? пробовал онлайн сервисы преобразования, но почему-то получаю корректные данные только если на входе цыфры. если на входе кошелек - не корректно. Видимо что то упускаю, только начинаю разбиратся с этими блокчейнами)
Адреса преобразовывать не нужно, только uint. Удобно использовать декодер данных наподобие вот этого:
Вводим abi, данные Calldata и получаем декодированные данные
 
Last edited:
  • Thank you
Reactions: kul0n

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
А как-то можно слать ненативные токены блокчейна?
В теме пример, шлет bnb в сети bsc
В доках либы нашел другой код, для эфира, но там опять же eth в сети эфир
а если я хочу eth в сети bsc или как-то еще, как быть?
Покопался у себя в шаблонах и нашёл, что пытался реализовать отправку ненативных токенов, но пришлось отложить из-за нехватки времени. Думаю, что всё-таки можно реализовать при желании.

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

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

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
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
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
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
 
Last edited:

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
TokenAmount насколько я из доков понял тоже имеет тип BigInteger, завтра посмотрю
 

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
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
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
Ну тогда смысла нет, тот же BigInteger, я так же смогу отправить 1 токен, но не смогу отправить 0.1 токен. Разработчики конечно молодцы, не добавили возможности слать не целые числа. Или я что-то не так понимаю?
 

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
Ну тогда смысла нет, тот же BigInteger, я так же смогу отправить 1 токен, но не смогу отправить 0.1 токен. Разработчики конечно молодцы, не добавили возможности слать не целые числа. Или я что-то не так понимаю?
В данном случае одна единица - это значение в Wei, т.е 10 в минус 18й степени от целого токена. В транзакциях как раз такие единицы и используются. У меня в приложенном шаблоне для удобства конвертировалось из целых значений, и тут тоже можно предварительно конвертнуть:
C#:
Web3.Convert.ToWei(amount).ToHexBigInteger();
 

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
Так тут уже тип данных будет HexBigInteger а не просто BigInteger, соответственно функция его не примет, разве нет?
 

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
Так тут уже тип данных будет HexBigInteger а не просто BigInteger, соответственно функция его не примет, разве нет?
В переменную amount подаю 0.001:
converter.png


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

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
Ну вот я в свой код это ToHexBigInteger сую, у меня ошибка при выполнении
C#:
var trans = await web3.Eth.ERC20.GetContractService("0x912CE59144191C1204E64559FE8253a0e49E6548").TransferFromRequestAndWaitForReceiptAsync("кошелек с которого отправляю", "кошелек на который отправляю", Web3.Convert.ToWei(0.09M).ToHexBigInteger());
 

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
Ну вот я в свой код это ToHexBigInteger сую, у меня ошибка при выполнении
C#:
var trans = await web3.Eth.ERC20.GetContractService("0x912CE59144191C1204E64559FE8253a0e49E6548").TransferFromRequestAndWaitForReceiptAsync("кошелек с которого отправляю", "кошелек на который отправляю", Web3.Convert.ToWei(0.09M).ToHexBigInteger());
Возможно ошибка в чём-то другом?
И то и другое даёт одинаковый результат
bigint.png


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

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
Возможно ошибка в чём-то другом?
И то и другое даёт одинаковый результат
View attachment 107614

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

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
Ну результат один, но тип данных другой
Вроде тот же самый тип данных
Если туда поставить BigInteger(0.09M) то все супер, функция отправится, правда сумма будет 0 потому что BigInteger это не дробное
Попробуй просто пропиши сумму в wei без конвертации в HexBigInteger
C#:
BigInteger amount = BigInteger.Parse("100000000000");
 

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
с ошибкой сыплется {"Smart contract error: ERC20: insufficient allowance"} если вот эту переменную amount делаю и вставляю ее в качестве суммы
 

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
с ошибкой сыплется {"Smart contract error: ERC20: insufficient allowance"} если вот эту переменную amount делаю и вставляю ее в качестве суммы
Эта ошибка появляется в 2х вариантах отправки? Что я скидывал чуть выше и твой? А то у меня нет возможности проверить.

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

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
Моим вариантом BigInteger(0.09M) без ошибки, я специально проверил еще раз, просто сумма транзы 0, потому что biginteger это целое число

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

Zedx

Client
Joined
Jun 12, 2018
Messages
1,400
Reaction score
955
Points
113
Моим вариантом BigInteger(0.09M) без ошибки, я специально проверил еще раз, просто сумма транзы 0, потому что biginteger это целое число

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

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)