Skip to content

NPavl/ERC20Bridge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Description bridge task:

Техническое задание(мост)

Написать контракт кроссчейн моста для отправки токенов стандарта ERC-20 между сетями Ethereum и Binance Smart chain.

  • Написать контракт Bridge
  • Написать полноценные тесты к контракту
  • Написать скрипт деплоя
  • Задеплоить в тестовую сеть
  • Написать таск на swap, redeem
  • Верифицировать контракт

Требования:

Token contract address (Rinkiby):

  • Bridge contract = ''

All packages:

yarn init 
yarn add --dev hardhat 
yarn add --dev @nomiclabs/hardhat-ethers ethers 
yarn add --dev @nomiclabs/hardhat-waffle ethereum-waffle chai
yarn add --save-dev @nomiclabs/hardhat-etherscan
yarn add install dotenv 
yarn add --dev solidity-coverage 
yarn add --dev hardhat-gas-reporter 
yarn add --dev hardhat-gas-reporter
yarn add --dev hardhat-contract-sizer

Main command:

npx hardhat 
npx hardhat run scripts/file-name.js
npx hardhat test 
npx hardhat coverage
npx hardhat run --network localhost scripts/deploy.js
npx hardhat run scripts/deploy.js --network rinkiby
npx hardhat verify <contract_address> --network rinkiby
npx hardhat verify --constructor-args scripts/arguments.js <contract_address> --network rinkiby
npx hardhat verify --constructor-args scripts/arguments.js <conract_address> --network rinkiby
yarn run hardhat size-contracts 
yarn run hardhat size-contracts --no-compile

EIP's, ECDSA, Verifying Signature, Signing trаnsactions ... :

EIP's:

- EIP-191: Signed Data Standard: https://eips.ethereum.org/EIPS/eip-191
- EIP-712: Cтандарт для хэширования и подписи типизированных структурированных данных: https://eips.ethereum.org/EIPS/eip-712
- eip-1271:  Стандартный метод проверки подписи для контрактов https://eips.ethereum.org/EIPS/eip-1271
- EIP-155: Простая защита от повторных атак https://eips.ethereum.org/EIPS/eip-155

Доп примеры openzeppelin-contracts/contracts/utils/cryptography/ https://github.com/OpenZeppelin/openzeppelin-contracts/tree/afb20119b33072da041c97ea717d3ce4417b5e01/contracts/utils/cryptography\

примеры для DAO governance with ECDSA: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/afb20119b33072da041c97ea717d3ce4417b5e01/contracts/token/ERC20/extensions/ERC20Votes.sol https://github.com/OpenZeppelin/openzeppelin-contracts/blob/76eee35971c2541585e05cbf258510dda7b2fbc6/contracts/governance/Governor.sol https://github.com/OpenZeppelin/openzeppelin-contracts/blob/f2a311dc4a5757ee8064769a603a715b05d359b3/contracts/governance/utils/Votes.sol

Вы можете чередовать операторы Solidity со встроенным кодом ассемблера, близком к языку виртуальной машины Ethereum. 
Это дает вам более детальный контроль, что особенно полезно, когда вы улучшаете язык, создавая библиотеки.
Встроенная сборка — это способ доступа к виртуальной машине Ethereum на низком уровне. 
Это обходит несколько важных функций безопасности и проверок Solidity. Вы должны использовать его только для задач, 
которые в нем нуждаются, и только если вы уверены в его использовании.
Блок встроенного ассемблера помечен значком, где код внутри фигурных скобок — это код на языке Yul .assembly { ... }
:= присвоение и типизация перменной.
mload: 
 // Divide the signature in r, s and v variables with inline assembly
assembly { 
      r := mload(add(signature, 0x20)) 
      s := mload(add(signature, 0x40))
      v := byte(0, mload(add(signature, 0x60)))
    } 	
https://ethereum.stackexchange.com/questions/9603/understanding-mload-assembly-function

https://solidity-by-example.org/signature/

- Подписи ECDSA в Ethereum состоят из трех параметров: v, r и s. Длина подписи всегда составляет 65 байт.
r= первые 32 байта подписи
s= вторые 32 байта подписи
v= последний 1 байт подписи
assembly {
            /*
            First 32 bytes stores the length of the signature

            add(sig, 32) = pointer of sig + 32
            effectively, skips first 32 bytes of signature

            mload(p) loads next 32 bytes starting at the memory address p into memory
            */

            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }

        // implicitly return (r, s, v)
  • Contract ABI Specification — Solidity 0.8.11 documentation https://docs.soliditylang.org/en/v0.8.11/abi-spec.html Через abi.encodePacked(), Solidity поддерживает нестандартный упакованный режим, в котором: типы короче 32 байт объединяются напрямую, без заполнения или расширения знака. динамические типы кодируются на месте и без длины. элементы массива дополняются, но все еще кодируются на месте.

Основы HASH, SEED, Merkle tree

Разные утилиты: 
- encoding and encryption online: https://cryptii.com/ 
- конвертр binary-to-decimal: https://www.rapidtables.com/convert/number/binary-to-decimal.html 
- 2048 mnemonik words: https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
- Понимание BIP32, BIP44, BIP39, участвующих в разработке HD-кошельков https://russianblogs.com/article/2264311352/
- BIP32 Deterministic Key Generator http://bip32.org/ 
- Mnemonic Code Converter https://iancoleman.io/bip39/ 
- https://emn178.github.io/online-tools/keccak_256.html Keccak-256 online hash function
- Online Solidity Decompiler https://ethervm.io/decompile

https://abi.hashex.org/  Online ABI Encoding Service (1 в ремикс скомпилируй контракт, внизу жмакай ABI, 2 далее содержимое вставляй форму по ссылке
выбирай поля и копируй код в 16ричном формате для аргуменов конструктора)


- signatures in the database https://www.4byte.directory/ 
Вызовы функций в виртуальной машине Ethereum определяются первыми четырьмя байтами данных, отправленных с транзакцией. 
Эти 4-байтовые подписи определяются как первые четыре байта хэша Keccak (SHA3) канонического представления подписи функции.
Эта база данных предназначена для того, чтобы позволить отображать эти байтовые подписи обратно в их удобочитаемые версии.

 преобразовании байтов в шестнадцатеричный формат. Очень просто: 1 байт данных = 2 шестнадцатеричных символа. 
 Всякий раз, когда вы видите строку шестнадцатеричных символов, вы можете разделить количество символов на 2, 
 чтобы получить размер в байтах. Любой «0x» в начале игнорируется при расчете. 32 байта (64 шестнадцатеричных символа).
 Потому что Эфириум использует блоки размером 32 байта, а почти все примитивные типы имеют размер 32 байта. 
 Однако есть несколько исключений, таких как тип «bytes»
 пример: параметр "to" 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7 имеет тип address
 Адреса Ethereum представляют собой 20-байтовые значения, поэтому они были дополнены нулями, чтобы соответствовать 
 32-байтовому значению. Чтобы получить фактический адрес, нужно извлечь последние 20 байт и префикс 0x.
 Префикс «0x» означает шестнадцатеричный код, и это способ сообщить программам, контрактам, API-интерфейсам, 
 что входные данные следует интерпретировать как шестнадцатеричное число (сокращаем до шестнадцатеричного)
 
 https://www.trustology.io/insights-events/decoding-an-ethereum-transaction-its-no-secret-its-just-smart

Merkle Tree

Solidity Bytecode - Как работает сборка и коды операций в Solidity

Примеры:

Inline Assembly https://docs.soliditylang.org/en/develop/assembly.html

ERC20 контракт для моста:

Быстрая верификация контракта через плагин Etherscan в remix:

1 ставим в ремикс плагин ETHERSCAN - CONTRACT VERIFICATION 2 передаем в плагин api ключ etherscan 3 если необходимо передавать аргументы в конструктор в 16ричном формате тогда: https://abi.hashex.org/ Online ABI Encoding Service (1 в ремикс скомпилируй контракт, внизу жмакай ABI, 2 далее содержимое вставляй форму по ссылке заполняй поля и копируй код в 16-ричном формате для аргуменов в конструктор)

Testing report

function getChainID() external view returns (uint256) {
    uint256 id;
    assembly {
        id := chainid()
    }
    return id;
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published