bomb diggity tired – Telegram
bomb diggity tired
2.07K subscribers
55 photos
1 video
10 files
138 links
research web3
Download Telegram
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
👍3
Как стать аудитором смарт-контрактов?
link

Путь по которому я бы пошел, если бы мне пришлось делать это снова. Это будет специфично для ETH (или, в более общем смысле, для EVM), поскольку большая часть аудиторской работы в настоящее время все еще находится в этой экосистеме. (с) Christoph Michel


CMICHEL - Независимый исследователь безопасности, ранее работавший в традиционных аудиторских фирмах. На момент написания статьи занимает первое место в рейтинге аудиторов Code4rena за все время.

Поделился своим процессом аудита, рассказал что нужно сделать, чтобы вас наняли, особенно если вы неизвестны и ответил на часто задаваемые вопросы.
🔥4
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-проект.
5
Boom! Начинаю серию написания и разборов смарт-контрактов от простых к сложным.

Напишем простой смарт-контракт и разберем как он работает.

[1] Создадим фаил в Remixe например: Hodler (наименование контрактов, библиотек, событий и структур принято называть с заглавной буквы)
c разрешением .sol

[2] Смарт-контракт - начинается с описания лицензии.
// (два слэша) - это однострочный комментарий. Комментарии предназначены для чтения человеком и не включаются в исполняемый байткод EVM. Лицензия обычно используется MIT (свободного доступа) например:
// 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) Eth в Wei конвертирую в Convert Ethereum. Если значение 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 и бо́льшую сумму (транзакция как и должна прервалась) https://goerli.etherscan.io/tx/0x96c29f430819744765cc73feb38d40c98015dd3fe857354afb37f3ff9760d5b4

В remixe на балансе также отображается эфир. Максимальная сумма вывода за одну транзакцию по контракту: 200000000000000000 Wei или 0,2 ETH

[7] Вывод: написали смарт-контракт, после деплоя появился адрес, отправили на него 0,5 ETH, создали транзакцию для вызова функции withdraw и успешно запросили 0,4 эфира (2 раза по 0,2) Контракт проверил запросы и отправил нам эфир с помощью внутренних транзакций.
👍7
«Raffle» смарт-контракт. Часть 1

Логика контракта: мемберы рафла депонируют Eth на смарт-контракт. Владелец запускает розыгрыш, дальше рандомным способом выбирается победитель и все эфиры переводятся на его кошелек.

Описание лицензии и версии пропускаю это было в предыдущем смарт-контракте.

[1] Объявляем контракт, ключевое слово: contract его название Raffle и через синтаксис фигурные скобки указываем переменные контракта. Первая переменная WillyWonka – владелец контракта. Тип данных address адрес будет публичный public, доступен извне контракта. Дальше задаем переменную members (динамический массив адресов участников, которые могут вносить свои ставки) тип данных: address public но есть модификатор payble – дуступно принятие денежных средств. Задаем переменную winner – победитель, тип данных address public с модификатором payble

contract 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