Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ukrainian translation #679

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion client/src/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -216,4 +216,4 @@ export const ALIAS_PATH = "https://raw.githubusercontent.com/OpenZeppelin/ethern

export const getLeaderboardPath = (network) => {
return `https://raw.githubusercontent.com/OpenZeppelin/ethernaut-leaderboard/update/boards/networkleaderboards/${network}LeaderBoard.json`
}
}
7 changes: 4 additions & 3 deletions client/src/containers/Header.js
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ class Header extends React.Component {
en: strings.english,
es: strings.spanish,
pt_br: strings.portuguese,
ua: strings.ukrainian,
ja: strings.japanese,
zh_cn: strings.chinese_simplified,
zh_tw: strings.chinese_traditional,
Expand All @@ -240,7 +241,7 @@ class Header extends React.Component {
ar: strings.arabic,
tr: strings.turkish,
};

const ddOpen = Boolean(this.state.multiDDOpen);
return (
<div onClick={() => this.closeDropdown()}>
Expand Down Expand Up @@ -319,11 +320,11 @@ class Header extends React.Component {
<Link onClick={() => this.toggleDropdownState()}
to={constants.PATH_LEADERBOARD}>
<div
className="element-in-row filled-icon">
className="element-in-row filled-icon">
<LeaderIcon />
</div>
</Link>

)}
<input
onClick={() => {
Expand Down
1 change: 1 addition & 0 deletions client/src/gamedata/ar/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"english": "English",
"arabic": "عربي",
"spanish": "Español",
"ukrainian": "Українська",
"portuguese": "Português",
"japanese": "日本語",
"turkish": "Türkçe",
Expand Down
1 change: 1 addition & 0 deletions client/src/gamedata/en/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"english": "English",
"arabic": "عربي",
"spanish": "Español",
"ukrainian": "Українська",
"portuguese": "Português",
"japanese": "日本語",
"turkish": "Türkçe",
Expand Down
1 change: 1 addition & 0 deletions client/src/gamedata/es/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"english": "English",
"arabic": "عربي",
"spanish": "Español",
"ukrainian": "Українська",
"portuguese": "Português",
"japanese": "日本語",
"turkish": "Türkçe",
Expand Down
1 change: 1 addition & 0 deletions client/src/gamedata/fr/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"english": "English",
"arabic": "عربي",
"spanish": "Español",
"ukrainian": "Українська",
"portuguese": "Português",
"japanese": "日本語",
"turkish": "Türkçe",
Expand Down
1 change: 1 addition & 0 deletions client/src/gamedata/ja/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"english": "English",
"arabic": "عربي",
"spanish": "Español",
"ukrainian": "Українська",
"portuguese": "Português",
"japanese": "日本語",
"turkish": "Türkçe",
Expand Down
1 change: 1 addition & 0 deletions client/src/gamedata/pt_br/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"english": "English",
"arabic": "عربي",
"spanish": "Español",
"ukrainian": "Українська",
"portuguese": "Português",
"japanese": "日本語",
"turkish": "Türkçe",
Expand Down
1 change: 1 addition & 0 deletions client/src/gamedata/ru/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"english": "English",
"arabic": "عربي",
"spanish": "Español",
"ukrainian": "Українська",
"portuguese": "Português",
"japanese": "日本語",
"turkish": "Türkçe",
Expand Down
1 change: 1 addition & 0 deletions client/src/gamedata/tr/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"english": "English",
"arabic": "عربي",
"spanish": "Español",
"ukrainian": "Українська",
"portuguese": "Português",
"japanese": "日本語",
"turkish": "Türkçe",
Expand Down
7 changes: 7 additions & 0 deletions client/src/gamedata/ua/descriptions/levels/aliencodex.md
boivlad marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Захопіть власність (ownership), щоб завершити рівень.

&nbsp;
Речі, які можуть допомогти
* Розуміння, як працює зберігання масивів
* Розуміння [специфікацій ABI](https://solidity.readthedocs.io/en/v0.4.21/abi-spec.html)
* Використання дуже `підступного` підходу
boivlad marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Цей рівень використовує той факт, що EVM не перевіряє довжину масиву, кодовану ABI, відносно його реального вмісту.

Додатково, він використовує антипереповнення довжини масиву, шляхом збільшення розміру масиву до всього storage `2^256`, що дозволяє користувачу змінювати весь storage контракту.

Обидві вразливості надихнуті [конкурсом підступного кодування 2017 року](https://medium.com/@weka/announcing-the-winners-of-the-first-underhanded-solidity-coding-contest-282563a87079)
5 changes: 5 additions & 0 deletions client/src/gamedata/ua/descriptions/levels/coinflip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Це гра в підкидання монети, де вам потрібно збільшувати вашу переможну серію, вгадуючи результат підкидання монети. Щоб завершити цей рівень, вам потрібно використовувати свої екстрасенсорні здібності, щоб вгадати правильний результат 10 разів поспіль.

&nbsp;
Речі, які можуть допомогти
* Перегляньте сторінку ["?"](https://ethernaut.openzeppelin.com/help) в меню в правому верхньому куті, розділ "По ту сторону консолі"
boivlad marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Генерація випадкових чисел у Solidity є складною. Наразі не існує нативного способу їх генерації, і все, що ви використовуєте в смартконтрактах, є публічно видимим, включаючи локальні змінні та змінні стану, позначені як приватні. Також майнери мають контроль над такими речами, як блокхеши, часові мітки, та включення певних транзакцій - що дозволяє їм змінювати ці значення на свою користь.

Щоб отримати криптографічно стійкі випадкові числа, ви можете використовувати [Chainlink VRF](https://docs.chain.link/docs/get-a-random-number), який використовує оракул, токен LINK, та контракт на блокчейні для перевірки того, що число дійсно випадкове.

Деякі інші варіанти включають використання заголовків блоків Bitcoin (перевірених через [BTC Relay](http://btcrelay.org)), [RANDAO](https://github.com/randao/randao), або [Oraclize](http://www.oraclize.it/)).
7 changes: 7 additions & 0 deletions client/src/gamedata/ua/descriptions/levels/delegate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Метою цього рівня є те, щоб вам заявити про власність над екземпляром, який вам дано.

&nbsp;
Речі, які можуть допомогти
* Загляньте в документацію Solidity про функцію низького рівня `delegatecall`, як вона працює, як вона може використовуватися для делегування операцій до бібліотек на блокчейні, і які вона має наслідки для області виконання.
* Запасні методи
* Ідентифікатори методів
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Використання `delegatecall` є особливо ризикованим і було використано як вектор атаки в декількох історичних хаках. З його допомогою ваш контракт фактично говорить: "ось, -інший контракт- або -інша бібліотека-, робіть з моїм станом все, що вам заманеться". Делегати мають повний доступ до стану вашого контракту. Функція `delegatecall` - це потужна особливість, але небезпечна, і її треба використовувати з крайньою обережністю.

Будь ласка, зверніться до статті [The Parity Wallet Hack Explained](https://blog.openzeppelin.com/on-the-parity-wallet-multisig-hack-405a8c12e8f7) для точного пояснення, як ця ідея була використана для крадіжки 30 млн доларів США.
3 changes: 3 additions & 0 deletions client/src/gamedata/ua/descriptions/levels/denial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Це простий гаманець, який випускає кошти з часом. Ви можете повільно знімати кошти, ставши партнером по зняттю.

Якщо ви зможете заборонити власнику знімати кошти, коли він викликає `withdraw()` (поки у контракті ще є кошти, і транзакція становить 1М газу або менше), ви виграєте цей рівень.
7 changes: 7 additions & 0 deletions client/src/gamedata/ua/descriptions/levels/denial_complete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Цей рівень демонструє, що зовнішні виклики до невідомих контрактів все ще можуть створювати вектори атаки на відмову у обслуговуванні, якщо не вказано фіксовану кількість газу.

Якщо ви використовуєте низькорівневий `call` для продовження виконання у разі відкату зовнішнього виклику, переконайтеся, що ви вказали фіксовану кількість газу. Наприклад, `call.gas(100000).value()`.

Зазвичай слід дотримуватися шаблону [checks-effects-interactions](http://solidity.readthedocs.io/en/latest/security-considerations.html#use-the-checks-effects-interactions-pattern), щоб уникнути атак на повторний вхід, але можуть виникнути інші обставини (наприклад, кілька зовнішніх викликів в кінці функції), де можуть виникнути такі проблеми.

*Примітка*: Зовнішній `CALL` може використовувати не більше 63/64 від поточно доступного газу на момент `CALL`. Таким чином, залежно від того, скільки газу потрібно для завершення транзакції, можна використовувати транзакцію з достатньо високим газом (тобто таку, що 1/64 газу здатна завершити залишкові опкоди в батьківському виклику), щоб зменшити цю конкретну атаку.
18 changes: 18 additions & 0 deletions client/src/gamedata/ua/descriptions/levels/dex.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
Мета цього рівня полягає в тому, щоб ви зламали базовий контракт [DEX](https://en.wikipedia.org/wiki/Decentralized_exchange), що наведений нижче, та вкрали кошти, маніпулюючи ціною.

Ви починаєте з 10 токенами `token1` та 10 токенами `token2`. У контракті DEX початково є 100 кожного токена.

Цей рівень буде успішно пройдено, якщо вам вдасться вичерпати всі токени одного з двох видів від контракту та змусити контракт повідомити "некоректну" ціну активів.

&nbsp;
### Коротке зауваження
Зазвичай, коли ви робите обмін з токеном ERC20, вам потрібно `approve` контракту витратити ваші токени за вас. Щоб зберегти синтаксис гри, ми просто додали метод `approve` до самого контракту. Тому не соромтеся використовувати `contract.approve(contract.address, <uint amount>)` замість безпосереднього виклику токенів, і він автоматично схвалить витрату обох токенів на бажану суму. Будь ласка, ігноруйте контракт `SwappableToken`.

&nbsp;
Речі, які можуть допомогти:
* Як розраховується ціна токена?
* Як працює метод `swap`?
* Як ви `approve` транзакцію з ERC20?
* Існує більше ніж один спосіб взаємодії з контрактом!
* Remix може допомогти
* Що робить "At Address"?
9 changes: 9 additions & 0 deletions client/src/gamedata/ua/descriptions/levels/dex2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Цей рівень попросить вас зламати `DexTwo`, контракт `Dex`, що був дещо змінений відносно попереднього рівня, іншим способом.

Вам потрібно вичерпати всі баланси token1 та token2 з контракту `DexTwo`, щоб пройти цей рівень.

Ви все ще починаєте з 10 токенами `token1` та 10 токенами `token2`. У контракті DEX досі є 100 кожного токена.

&nbsp;
Речі, які можуть допомогти:
* Як було змінено метод `swap`?
9 changes: 9 additions & 0 deletions client/src/gamedata/ua/descriptions/levels/dex2_complete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Як ми неодноразово бачили, взаємодія між контрактами може бути джерелом несподіваної поведінки.

Те, що контракт претендує на реалізацію [специфікації ERC20](https://eips.ethereum.org/EIPS/eip-20), не означає, що йому можна довіряти.

Деякі токени відхиляються від специфікації ERC20, не повертаючи булеве значення зі своїх методів `transfer`. Дивіться [Missing return value bug - At least 130 tokens affected](https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca).

Інші токени ERC20, особливо ті, що були розроблені ворогами, можуть поводитися більш зловмисно.

Якщо ви створюєте DEX, де будь-хто може вивести свої токени без дозволу центральної влади, то правильність DEX може залежати від взаємодії контракту DEX і контрактів токенів, що обмінюються.
59 changes: 59 additions & 0 deletions client/src/gamedata/ua/descriptions/levels/dex_complete.md
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would suggest "від будь-якого єдиного джерела є значним вектором атаки"

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

щоб побачити, що ціна на Bitcoin запитується з 31 різного джерела.

Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
За виключенням частини, що стосується цілочисельної математики, отримання цін або будь-яких даних від будь-якого єдиного джерела є великим вектором атаки в розумних контрактах.

Ви ясно бачите з цього прикладу, що людина з великим капіталом може маніпулювати ціною одним рухом, що призведе до того, що всі застосунки, що використовують ціну, будуть використовувати неправильну ціну.

Обмін сам по собі є децентралізованим, але ціна активу є централізованою, оскільки вона походить з одного dex. Однак, якщо ми розглядатимемо токени, що представляють справжні активи, а не вигадані, більшість з них матимуть пари обміну на декількох dexes і мережах. Це зменшить вплив на ціну активу у разі специфічного dex, який став мішенню для такої атаки.

[Оракули](https://betterprogramming.pub/what-is-a-blockchain-oracle-f5ccab8dbd72?source=friends_link&sk=d921a38466df8a9176ed8dd767d8c77d) використовуються для отримання даних в розумні контракти і з них.

[Chainlink Data Feeds](https://docs.chain.link/docs/get-the-latest-price) - це безпечний, надійний спосіб отримати децентралізовані дані в ваших розумних контрактах. Вони мають велику бібліотеку з багатьма різними джерелами, а також пропонують [безпечний випадковий](https://docs.chain.link/docs/chainlink-vrf), можливість робити [будь-який API виклик](https://docs.chain.link/docs/make-a-http-get-request), [створення модульної мережі оракулів](https://docs.chain.link/docs/architecture-decentralized-model), [технічне обслуговування, дії та обслуговування](https://docs.chain.link/docs/kovan-keeper-network-beta), та необмежене налаштування.

[Uniswap TWAP Oracles](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) покладаються на модель вагової ціни в часі, відому як [TWAP](https://en.wikipedia.org/wiki/Time-weighted_average_price#). Хоча дизайн може бути привабливим, цей протокол сильно залежить від ліквідності протоколу DEX, і якщо вона дуже низька, ціни можна легко маніпулювати.


Ось приклад отримання ціни на Bitcoin в USD з каналу даних Chainlink (на тестовій мережі Sepolia):

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract PriceConsumerV3 {
AggregatorV3Interface internal priceFeed;

/**
* Network: Sepolia
* Aggregator: BTC/USD
* Address: 0

x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
*/
constructor() {
priceFeed = AggregatorV3Interface(
0x1b44F3514812d835EB1BDB0acB33d3fA3351Ee43
);
}

/**
* Returns the latest price.
*/
function getLatestPrice() public view returns (int) {
// prettier-ignore
(
/* uint80 roundID */,
int price,
/*uint startedAt*/,
/*uint timeStamp*/,
/*uint80 answeredInRound*/
) = priceFeed.latestRoundData();
return price;
}
}

```
[Спробуйте на Remix](https://remix.ethereum.org/#url=https://docs.chain.link/samples/PriceFeeds/PriceConsumerV3.sol)

Перевірте сторінку з каналом даних Chainlink [тут](https://data.chain.link/ethereum/mainnet/crypto-usd/btc-usd), щоб побачити, що ціна на Bitcoin запитується з до 31 різного джерела.

Ви також можете перевірити [список](https://docs.chain.link/data-feeds/price-feeds/addresses/) всіх адрес каналів даних Chainlink.
Loading