- Регистрация
- 12.06.2018
- Сообщения
- 1 366
- Благодарностей
- 920
- Баллы
- 113
В этой библиотеке пространство имён для подключения Nethereum.Web3.AccountsА почему в using не получается прописать Nethereum.Accounts, хотя в GAC добавлена эта либа
В этой библиотеке пространство имён для подключения Nethereum.Web3.AccountsА почему в using не получается прописать Nethereum.Accounts, хотя в GAC добавлена эта либа
Дело вкуса и удобства. Сами по себе они выполняют одинаковые функции.Как думаете какой кошелёк лучше - метамаск или трастваллет?
В принципе да и у них всех есть нужные сети. Метамаск почему-то выглядит забагованным, но почему-то им чаще пользюутся именно когда дело идёт с сетью ETHДело вкуса и удобства. Сами по себе они выполняют одинаковые функции.
Газ рассчитывается исходя из нагрузки сети, берётся прям напрямую из сети.Подскажите а как цену газа рассчитывается тут? Оно автоматически берет самую актуальную как на сайтах типа https://etherscan.io/gastracker или откуда?
и еще вопрос, у сети эфира chain id = 0x1 , а в примере там int, как быть? Или с блокчейном эфира нельзя напрямую работать, только через инфуру?
Разобрался, нужно было разрешить доступ в свойствах файловЗдравствуйте! Спасибо за статью, пытаюсь разобраться со всем по порядку. Я запросил баланс с файла blockchain_transaction-example, но он выдаёт ошибки подобного рода:
"Подключение сборки к проекту C:\Users\***\Desktop\Blockchain\dll\Nethereum.Accounts.dll не является .Net сборкой или не возможно получить доступ к сборке"
Добавлял вручную файлы dll, но тоже самое. Как можно решить это?Посмотреть вложение 107158
byte[] adapterParams = "0x".HexToByteArray();
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;
Спасибо, статъя огонь! А что удобнее использовать для разбивки данных по 32 байта и преобразования с hex в dec? пробовал онлайн сервисы преобразования, но почему-то получаю корректные данные только если на входе цыфры. если на входе кошелек - не корректно. Видимо что то упускаю, только начинаю разбиратся с этими блокчейнами)Рассмотрим передаваемые данные, разбив их на куски по 32 байта, причём первые 4 байта это селектор функции, к которой необходимо обратиться.
Адреса преобразовывать не нужно, только uint. Удобно использовать декодер данных наподобие вот этого:Спасибо, статъя огонь! А что удобнее использовать для разбивки данных по 32 байта и преобразования с hex в dec? пробовал онлайн сервисы преобразования, но почему-то получаю корректные данные только если на входе цыфры. если на входе кошелек - не корректно. Видимо что то упускаю, только начинаю разбиратся с этими блокчейнами)
Покопался у себя в шаблонах и нашёл, что пытался реализовать отправку ненативных токенов, но пришлось отложить из-за нехватки времени. Думаю, что всё-таки можно реализовать при желании.А как-то можно слать ненативные токены блокчейна?
В теме пример, шлет bnb в сети bsc
В доках либы нашел другой код, для эфира, но там опять же eth в сети эфир
а если я хочу eth в сети bsc или как-то еще, как быть?
По поводу безопасности паблик rpc - скорее всего есть опасность перехвата каких-то данных, т.к. в списках rpc для каждой сети есть указатель приватности и предупреждение о пользовании неприватными. Вот тут можно посмотреть rpc для каждой сети:и еще вопрос - в доках для сети эфира они infura используют, которая платная. Но можно найти и бесплатные rpc для сети эфира. Но насколько безопасно это? Не уведут ли приватный ключ если для транз пользоваться публичной бесплатной rpc? Или такой возможности впринципе нет?
У меня почти получилось, но не совсем. Вот такой кодПокопался у себя в шаблонах и нашёл, что пытался реализовать отправку ненативных токенов, но пришлось отложить из-за нехватки времени. Думаю, что всё-таки можно реализовать при желании.
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);
ну каких-то данных о том что я там транзу сделал и тд может и не так страшно, главное чтобы приватный ключ не увели и вместе с ним все монетыПо поводу безопасности паблик rpc - скорее всего есть опасность перехвата каких-то данных, т.к. в списках rpc для каждой сети есть указатель приватности и предупреждение о пользовании неприватными. Вот тут можно посмотреть rpc для каждой сети:
Попробуй вот так:У меня почти получилось, но не совсем. Вот такой код
Почти получилось потому что транзакция прошла, но там сумма 0.0000 вместо 0.09 arb. Наверное с числом какая-то путаница, хз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);
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;
Да, BigInterer.TokenAmount насколько я из доков понял тоже имеет тип BigInteger, завтра посмотрю
[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; }
}
В данном случае одна единица - это значение в Wei, т.е 10 в минус 18й степени от целого токена. В транзакциях как раз такие единицы и используются. У меня в приложенном шаблоне для удобства конвертировалось из целых значений, и тут тоже можно предварительно конвертнуть:Ну тогда смысла нет, тот же BigInteger, я так же смогу отправить 1 токен, но не смогу отправить 0.1 токен. Разработчики конечно молодцы, не добавили возможности слать не целые числа. Или я что-то не так понимаю?
Web3.Convert.ToWei(amount).ToHexBigInteger();
В переменную amount подаю 0.001:Так тут уже тип данных будет HexBigInteger а не просто BigInteger, соответственно функция его не примет, разве нет?
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());
Ну результат один, но тип данных другой, поэтому код крашится. Если туда поставить BigInteger(0.09M) то все супер, функция отправится, правда сумма будет 0 потому что BigInteger это не дробноеВозможно ошибка в чём-то другом?
И то и другое даёт одинаковый результат
Посмотреть вложение 107614
У меня в транзакциях используется конвертация как во втором варианте, хотя первый судя по всему то же самое
Вроде тот же самый тип данныхНу результат один, но тип данных другой
Попробуй просто пропиши сумму в wei без конвертации в HexBigIntegerЕсли туда поставить BigInteger(0.09M) то все супер, функция отправится, правда сумма будет 0 потому что BigInteger это не дробное
BigInteger amount = BigInteger.Parse("100000000000");
Эта ошибка появляется в 2х вариантах отправки? Что я скидывал чуть выше и твой? А то у меня нет возможности проверить.с ошибкой сыплется {"Smart contract error: ERC20: insufficient allowance"} если вот эту переменную amount делаю и вставляю ее в качестве суммы
Нативные токены то другое, с ними проблем нет. Вот выше на stackoverflow написано почему так, но в библиотеке nethereum я не нашёл методов для такого одобрения. Я писал перевод кастомных токенов для других блокчейнов и там такой проблемы не было. Нужно ещё посидеть разобраться...Моим вариантом BigInteger(0.09M) без ошибки, я специально проверил еще раз, просто сумма транзы 0, потому что biginteger это целое число
А кем одобрен? Когда нативные токены через либу гонял никаких одобрений не надо было.