bomb diggity tired pinned «Solidity 1) Документация по разработке Ethereum 2) Репозиторий [Russian] руководство по Solidity 3) Открытый курс от Ilya Krukowski 4) Введение в Solidity с простыми примерами 5) Crypto Zombies 6) Solidity Hub 7) Кураторский список»
Web3 Инструменты
(Будут пополняться)
Remix — онлайн-компилятор и среда разработки в реальном времени.
Visual Studio Code — редактор исходного кода от Microsoft.
Hardhat — среда разработки Ethereum.
Node.js — кроссплатформенная среда выполнения JavaScript.
Solodit — веб-приложение, для аудиторов.
Callthis — создайте транзакцию, отправьте ссылку, чтобы кто-то другой мог ее выполнить.
Онлайн-конвертер Bytes32 - конвертируйте байты Solidity 32 в строку utf8 или целые числа и наоборот.
Конвертер единиц Ethereum — онлайн-инструмент для конвертации различных номиналов Ethereum (wei, gwei, ether).
Кодировщик ABI — онлайн-кодировщик ABI Solidity для кодирования аргументов смарт-контракта, а также выполнения операций чтения и записи в блокчейне.
Ethereum DevTools by Miguel Mota
Метка времени Unix
Token security detection
Remix — онлайн-компилятор и среда разработки в реальном времени.
Visual Studio Code — редактор исходного кода от Microsoft.
Hardhat — среда разработки Ethereum.
Node.js — кроссплатформенная среда выполнения JavaScript.
Solodit — веб-приложение, для аудиторов.
Callthis — создайте транзакцию, отправьте ссылку, чтобы кто-то другой мог ее выполнить.
Онлайн-конвертер Bytes32 - конвертируйте байты Solidity 32 в строку utf8 или целые числа и наоборот.
Конвертер единиц Ethereum — онлайн-инструмент для конвертации различных номиналов Ethereum (wei, gwei, ether).
Кодировщик ABI — онлайн-кодировщик ABI Solidity для кодирования аргументов смарт-контракта, а также выполнения операций чтения и записи в блокчейне.
Ethereum DevTools by Miguel Mota
Метка времени Unix
Token security detection
👍3
Как стать аудитором смарт-контрактов?
link
CMICHEL - Независимый исследователь безопасности, ранее работавший в традиционных аудиторских фирмах. На момент написания статьи занимает первое место в рейтинге аудиторов Code4rena за все время.
Поделился своим процессом аудита, рассказал что нужно сделать, чтобы вас наняли, особенно если вы неизвестны и ответил на часто задаваемые вопросы.
link
Путь по которому я бы пошел, если бы мне пришлось делать это снова. Это будет специфично для ETH (или, в более общем смысле, для EVM), поскольку большая часть аудиторской работы в настоящее время все еще находится в этой экосистеме. (с) Christoph Michel
CMICHEL - Независимый исследователь безопасности, ранее работавший в традиционных аудиторских фирмах. На момент написания статьи занимает первое место в рейтинге аудиторов Code4rena за все время.
Поделился своим процессом аудита, рассказал что нужно сделать, чтобы вас наняли, особенно если вы неизвестны и ответил на часто задаваемые вопросы.
How to become a smart contract auditor | cmichel
From time to time, I receive messages asking me for advice on how to get started as a smart contract security auditor.
While there are…
While there are…
🔥4
Подборка статей / книг
(Будет пополняться)
Книга «Освоение Ethereum»
Как стать аудитором смарт-контрактов? by Christoph Michel
Ускоренный курс Solidity
Ускоренный курс Solidity 2
SOLIDITY HACKER: level 0 by Matapac
Изучение ошибок и особенностей версий компилятора Solidity
Деконструкция контракта Solidity by OpenZeppelin
Сборник интересных деталей Solidity
Руководство по стилю Solidity
Погружение в виртуальную машину Ethereum
Виртуальная машина Ethereum — серия статей by Zaryab
Как устроен Ethereum и смарт-контракты by Vas3k
Памятка по Solidity
Контрольный список аудита уязвимостей смарт-контрактов
Cтандарт безопасности и качества кода by transmissions11
Книга «Освоение Ethereum»
Как стать аудитором смарт-контрактов? by Christoph Michel
Ускоренный курс Solidity
Ускоренный курс Solidity 2
SOLIDITY HACKER: level 0 by Matapac
Изучение ошибок и особенностей версий компилятора Solidity
Деконструкция контракта Solidity by OpenZeppelin
Сборник интересных деталей Solidity
Руководство по стилю Solidity
Погружение в виртуальную машину Ethereum
Виртуальная машина Ethereum — серия статей by Zaryab
Как устроен Ethereum и смарт-контракты by Vas3k
Памятка по Solidity
Контрольный список аудита уязвимостей смарт-контрактов
Cтандарт безопасности и качества кода by transmissions11
🔥6
❤3
bomb diggity tired pinned «In Progress [1] С начала [2] Инструменты [3] Статьи / книги [4] Смарт-контракты»
Прошел месяц как начал погружение в Solidity.
Основная часть времени затрачена на сбор и структурирование информации, сейчас важно не погрязнуть в начитанность руководств и документаций, необходимо больше практики.
Также выполнил 11 уровней CryptoZombies, прошелся по функционалу в Remixe и Visual Studio Code, установил Hardhat, Node.js
Некоторые выводы и план действий на следующие три месяца:
1) Сфокусироваться только на Solidity.(не отвлекаться на другие языки)
2) 80% на практику / 20% теории.
2.1) практика нацеленная на разбор кода и поиск ошибок.
3) Найти для себя pet-проект.
Основная часть времени затрачена на сбор и структурирование информации, сейчас важно не погрязнуть в начитанность руководств и документаций, необходимо больше практики.
Также выполнил 11 уровней CryptoZombies, прошелся по функционалу в Remixe и Visual Studio Code, установил Hardhat, Node.js
Некоторые выводы и план действий на следующие три месяца:
1) Сфокусироваться только на Solidity.
2) 80% на практику / 20% теории.
3) Найти для себя pet-проект.
❤5
Boom! Начинаю серию написания и разборов смарт-контрактов от простых к сложным.
Напишем простой смарт-контракт и разберем как он работает.
[1] Создадим фаил в Remixe например: Hodler (наименование контрактов, библиотек, событий и структур принято называть с заглавной буквы)
c разрешением
[2] Смарт-контракт - начинается с описания лицензии.
// (два слэша) - это однострочный комментарий. Комментарии предназначены для чтения человеком и не включаются в исполняемый байткод EVM. Лицензия обычно используется MIT (свободного доступа) например:
[3] Указываем версию компилятора: переходим во вкладку Solidity Compiler выбираю последнию: 0.8.23 в контракте прописываю:
[4] Пишем сам смарт-контракт.
Создаемтело контракта включает в себя все строки между фигурными скобками { }
назовем например:
(объявление функции
[5] Создаем функцию снятия эфира с контракта с ограничением по максимальной сумме.
Функция(т.е. целое число без знака). Ключевое слово
Далее, строкаEth в Wei конвертирую в Convert Ethereum.
[6] Компиляция и Deploy смарт-контракта.
Используем компилятор Solidity для преобразования кода Solidity в байткод EVM, чтобы он мог быть выполнен на блокчейне. Переходим в Solidity Compiler - компилируем и переходим во вкладку Deploy. В Enviromente выбираем WalletConnect, подключаем свой MetaMask в сети Goerli (на счету необходимы GoerliETH) и разворачиваем контракт.
https://goerli.etherscan.io/address/0xF80941FD1Eb4aE9e303C27180Dd020095Cd9a952
Теперь пополним контракт и запросим вывод равный 0,2 ETH и бо́льшую сумму(транзакция как и должна прервалась) https://goerli.etherscan.io/tx/0x96c29f430819744765cc73feb38d40c98015dd3fe857354afb37f3ff9760d5b4
В remixe на балансе также отображается эфир. Максимальная сумма вывода за одну транзакцию по контракту: 200000000000000000 Wei или 0,2 ETH
[7] Вывод: написали смарт-контракт, после деплоя появился адрес, отправили на него 0,5 ETH, создали транзакцию для вызова функции withdraw и успешно запросили 0,4 эфира (2 раза по 0,2) Контракт проверил запросы и отправил нам эфир с помощью внутренних транзакций.
Напишем простой смарт-контракт и разберем как он работает.
[1] Создадим фаил в Remixe например: Hodler
c разрешением
.sol [2] Смарт-контракт - начинается с описания лицензии.
// SPDX-License-Identifier: MIT
[3] Указываем версию компилятора: переходим во вкладку Solidity Compiler выбираю последнию: 0.8.23 в контракте прописываю:
pragma solidity ^0.8.23;[4] Пишем сам смарт-контракт.
Создаем
contract Balance создаем функцию receive() указываем модификатор external payable {}(объявление функции
receive(), которая является внешней (external) и принимает эфир (payable). Это означает, что функция может быть вызвана извне контракта для принятия эфира)contract Balance {
receive() external payable {}[5] Создаем функцию снятия эфира с контракта с ограничением по максимальной сумме.
function withdraw(uint withdraw_amount) public {
require(withdraw_amount <= 200000000000000000);Функция
withdraw которая принимает один аргумент withdrawamount типа uint public указывает на то, что функция является доступной для вызова извне контракта.Далее, строка
require(withdrawamount <= 200000000000000000); представляет собой проверку, которая гарантирует, что значение withdrawamount не превышает 200000000000000000 Wei (или 0,2 Eth) Если значение withdrawamount больше этого числа, то выполнение функции будет прервано, и эфир не будет выведен. Прописываем вывод денежных средств payable(msg.sender).transfer(withdraw_amount);msg представляет собой объект, который содержит информацию о текущей транзакции, атрибут sender — это адрес отправителя транзакции.transfer(withdraw_amount) — это встроенная функция Solidity, которая позволяет контракту отправить эфир указанному адресу. Таким образом, отправляем указанное количество эфира обратно тому адресу, который инициировал вызов данной функции контракта.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
contract Balance {
receive() external payable {}
function withdraw(uint withdraw_amount) public {
require(withdraw_amount <= 200000000000000000);
payable(msg.sender).transfer(withdraw_amount);
}
}
Основная логика нашего смарт-контракта - принятие эфира, управление выводом средств и установка лимита на снятие за одну транзакцию.
[6] Компиляция и Deploy смарт-контракта.
Используем компилятор Solidity для преобразования кода Solidity в байткод EVM, чтобы он мог быть выполнен на блокчейне. Переходим в Solidity Compiler - компилируем и переходим во вкладку Deploy. В Enviromente выбираем WalletConnect, подключаем свой MetaMask в сети Goerli (на счету необходимы GoerliETH) и разворачиваем контракт.
Появился адрес контракта: 0xF80941FD1Eb4aE9e303C27180Dd020095Cd9a952 https://goerli.etherscan.io/address/0xF80941FD1Eb4aE9e303C27180Dd020095Cd9a952
Теперь пополним контракт и запросим вывод равный 0,2 ETH и бо́льшую сумму
В remixe на балансе также отображается эфир. Максимальная сумма вывода за одну транзакцию по контракту: 200000000000000000 Wei или 0,2 ETH
[7] Вывод: написали смарт-контракт, после деплоя появился адрес, отправили на него 0,5 ETH, создали транзакцию для вызова функции withdraw и успешно запросили 0,4 эфира (2 раза по 0,2) Контракт проверил запросы и отправил нам эфир с помощью внутренних транзакций.
👍7
«Raffle» смарт-контракт. Часть 1
Логика контракта: мемберы рафла депонируют Eth на смарт-контракт. Владелец запускает розыгрыш, дальше рандомным способом выбирается победитель и все эфиры переводятся на его кошелек.
Описание лицензии и версии пропускаю это было в предыдущем смарт-контракте.
[1] Объявляем контракт, ключевое слово:
[2] Создаем конструктор – функция которая вызывается автоматически и однократно в момент развертывания смарт-контракта
[3] Компилируем и деплоим смарт-контракт, появляется адрес и интерфейс с активными кнопками
В разделе Account поочередно выбираем 4 кошелька и с каждого принимаем участие в размере 0,005 Eth. C адреса – владелец контракта нажимаем
[4] Вывод: Написали «Raffle» смарт-контракт и провели розыгрыш, но можно ли считать данный метод с переменными блока действительно случайным и устойчивым к атакам? И какие еще есть подходы в генерации случайных чисел, разберем во 2 части.
Логика контракта: мемберы рафла депонируют Eth на смарт-контракт. Владелец запускает розыгрыш, дальше рандомным способом выбирается победитель и все эфиры переводятся на его кошелек.
Описание лицензии и версии пропускаю это было в предыдущем смарт-контракте.
[1] Объявляем контракт, ключевое слово:
contract его название Raffle и через синтаксис фигурные скобки указываем переменные контракта. Первая переменная WillyWonka – владелец контракта. Тип данных address адрес будет публичный public, доступен извне контракта. Дальше задаем переменную members (динамический массив адресов участников, которые могут вносить свои ставки) тип данных: address public но есть модификатор payble – дуступно принятие денежных средств. Задаем переменную winner – победитель, тип данных address public с модификатором payblecontract Raffle {
address public WillyWonka;
address payable[] public members;
address payable public winner;
}
[2] Создаем конструктор – функция которая вызывается автоматически и однократно в момент развертывания смарт-контракта
constructor() { в нем указываем глобальную переменную msg.sender (кто отправитель разворачиваемого контракта или другими словами адрес нашего кошелька, разворачиваемого контракта) тот и владелец WillyWonka= msg.sender; (эти данные сохраняются в блокчейне) Дальше пропишем функцию чтобы участники могли присоединиться к событию, function join() public payable { Функция join позволяет участникам присоединиться к розыгрышу, при условии что они отправляют 0,005 эфира. Функция goBalance возвращает текущий баланс контракта, доступная только для WillyWonka. Функция random возвращает случайное число на основе временной метки блока, предыдущего случайного числа и длины массива участников. Функция goWinner позволяет выбрать победителя, при условии, что она вызвана WillyWonka и количество участников больше или равно 4. Выигравший участник получает баланс контракта, затем массив участников обнуляется.// SPDX-License-Identifier: MIT
pragma solidity >=0.8.23;
contract Raffle {
address public WillyWonka;
address payable[] public members;
address payable public winner;
constructor(){
WillyWonka=msg.sender;
}
function join() public payable{
require(msg.value==5000000000000000 wei, "only pay 0.005 ether");
members.push(payable(msg.sender));
}
function goBalance() public view returns(uint){
require(WillyWonka==msg.sender, "Never doubt what no one knows");
return address(this).balance;
}
function random() internal view returns(uint){
return uint(keccak256(abi.encodePacked(block.timestamp, block.prevrandao, members.length)));
}
function goWinner() public{
require(WillyWonka==msg.sender, "Never doubt what no one knows");
require(members.length>=4, "Members are less than 4");
uint r=random();
uint index = r%members.length;
winner=members[index];
winner.transfer(goBalance());
members= new address payable[](0);
}
}
[3] Компилируем и деплоим смарт-контракт, появляется адрес и интерфейс с активными кнопками
(goWinner, join, goBalance, members, WillyWonka, winner) Кнопки синего цвета – это считывание информации из вне, (это не транзакция, а вызов [call] для чтения данных, и они бесплатные. Красная кнопка – принятия средств (payable) на контракт. Оранжевая - переводит деньги куда-то, но сама деньги принимать не может. Вызывается через транзакцию и за ее вызов необходимо платить. В нашем случае отправка выигрыша победителю.В разделе Account поочередно выбираем 4 кошелька и с каждого принимаем участие в размере 0,005 Eth. C адреса – владелец контракта нажимаем
goWinner -> функция рандом с помощью переменных блока определяет победителя и отправляет средства на счет. [4] Вывод: Написали «Raffle» смарт-контракт и провели розыгрыш, но можно ли считать данный метод с переменными блока действительно случайным и устойчивым к атакам? И какие еще есть подходы в генерации случайных чисел, разберем во 2 части.
👍6