Skip to content

Commit 9927308

Browse files
committed
refactor: jun-3 restructuring
1 parent efdc891 commit 9927308

File tree

5 files changed

+173
-173
lines changed

5 files changed

+173
-173
lines changed

solidity/junior-3/README.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
## Theory
44

55
- [Solidity](./solidity/README.md)
6+
- [Meta transactions](./meta-transactions/README.md)
7+
- [Oracles](./oracles/README.md)
68
- [Lending protocols](./lending/README.md)
7-
- [DAO](./dao/README.md)
8-
9-
## Practice
10-
11-
## Recommendations
9+
- [DAO](./dao/README.md)

solidity/junior-3/dao/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
## DAO и DAO governance
2+
# Вопросы по DAO и DAO governance
33

44
1. Что такое DAO (Decentralized autonomous organization)?
55
- Чем DAO отличается от DO (Decentralized organization)? От DA (Decentralized application)?
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# Вопросы по meta transactions
2+
3+
1. Что такое метатранзакции?
4+
2. Для чего можно применять метатранзакции? Назвать не менее трех вариантов использования.
5+
3. Какая основная идея стандарта ERC-2771?
6+
- Какая задача отводится контракту **Forwarder**?
7+
- Для чего необходимо использовать ```_msgSender()``` вместо ```msg.sender```?
8+
4. Gas Station Network - это пример проекта с открытым исходным кодом, который помогает реализовать метатранзакции. Можешь рассказать, как он устроен, как работает, его верхнеуровневую архитектуру?
9+
- Для чего необходимо реализовать контракт ```Paymaster```?
10+
- Можно ли использовать [контракты из библиотеки OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/metatx) для организации метатранзакций?
11+
- Какие еще есть сервисы, которые можно использовать для организации метатранзакций?
12+
5. Можно ли реализовать метатранзакции нативно?
13+
- Как работает следующий пример кода?
14+
```solidity
15+
// SPDX-License-Identifier: UNLICENSED
16+
pragma solidity ^0.8.19;
17+
18+
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
19+
20+
contract Token is ERC20 {
21+
bytes32 public constant META_TRANSACTION_TYPEHASH =
22+
keccak256("MetaTransaction(uint256 nonce,address signer,bytes functionSignature)");
23+
24+
mapping(address signer => uint256 nonce) private _nonces;
25+
26+
struct MetaTransaction {
27+
uint256 nonce;
28+
address signer;
29+
bytes functionSignature;
30+
}
31+
32+
event MetaTransactionExecuted(
33+
address signer,
34+
address relayer,
35+
bytes functionSignature
36+
);
37+
38+
error ZeroAddress();
39+
error InvalidSignature();
40+
error InvalidCall();
41+
42+
constructor() ERC20("Token", "MTT") {}
43+
44+
function DOMAIN_SEPARATOR() public view returns (bytes32) {
45+
return keccak256(
46+
abi.encode(
47+
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
48+
keccak256("EIP712"),
49+
keccak256("1"),
50+
block.chainid,
51+
address(this)
52+
)
53+
);
54+
}
55+
56+
function executeMetaTransaction(
57+
address signer,
58+
bytes memory functionSignature,
59+
uint8 v,
60+
bytes32 r,
61+
bytes32 s
62+
) external payable returns (bytes memory result) {
63+
MetaTransaction memory _tx = MetaTransaction({
64+
nonce: _nonces[signer],
65+
signer: signer,
66+
functionSignature: functionSignature
67+
});
68+
69+
bool isVerify = _verify(signer, _tx, v, r, s);
70+
if (!isVerify) {
71+
revert InvalidSignature();
72+
}
73+
74+
_nonces[signer] += 1;
75+
76+
(bool success, bytes memory data) = address(this).call(
77+
abi.encodePacked(functionSignature, signer)
78+
);
79+
80+
if (!success) {
81+
revert InvalidCall();
82+
}
83+
84+
emit MetaTransactionExecuted(signer, msg.sender, functionSignature);
85+
86+
return data;
87+
}
88+
89+
function getNonce(address account) external view returns (uint256) {
90+
return _nonces[account];
91+
}
92+
93+
function _msgSender() internal view override returns (address sender) {
94+
if (msg.sender == address(this)) {
95+
assembly {
96+
sender := shr(96, calldataload(sub(calldatasize(), 20)))
97+
}
98+
}
99+
else {
100+
return super._msgSender();
101+
}
102+
}
103+
104+
function _verify(
105+
address signer,
106+
MetaTransaction memory _tx,
107+
uint8 v,
108+
bytes32 r,
109+
bytes32 s
110+
) private view returns (bool) {
111+
if (signer == address(0)) {
112+
revert ZeroAddress();
113+
}
114+
115+
return signer == ecrecover(_getDigest(_tx), v, r, s);
116+
}
117+
118+
function _getDigest(MetaTransaction memory _tx) private view returns (bytes32) {
119+
return keccak256(
120+
abi.encodePacked(
121+
"\x19\x01",
122+
DOMAIN_SEPARATOR(),
123+
keccak256(
124+
abi.encode(
125+
META_TRANSACTION_TYPEHASH,
126+
_tx.nonce,
127+
_tx.signer,
128+
keccak256(_tx.functionSignature)
129+
)
130+
)
131+
)
132+
);
133+
}
134+
}
135+
```
136+
6. Творческий вопрос. Как ты считаешь, на сколько важны метатранзакции? Есть ли у них будущее? Нарушают ли они какие-нибудь законы децентрализации?
137+
138+
## Links
139+
140+
- [Gas-free transactions: Meta Transactions explained](https://medium.com/coinmonks/gas-free-transactions-meta-transactions-explained-f829509a462d)
141+
- [ERC-2771](https://eips.ethereum.org/EIPS/eip-2771)
142+
- [Gas Station Network](https://docs.opengsn.org/)
143+
- [Native Meta Transactions](https://medium.com/gitcoin/native-meta-transactions-e509d91a8482)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Вопросы по oracles
2+
3+
1. Что такое оракул?
4+
- Для чего нужны оракулы?
5+
2. Как технически можно организовать работу оракула? (Желательно подготовить схему работы для объяснения)
6+
- Сколько смарт-контрактов необходимо?
7+
- Какие предъявляются требования к off-chain части оракула?
8+
- Есть ли затраты на использование оракула и кто оплачивает эти расходы?
9+
3. Мы подготовили несколько вариантов классификации оракулов. Расскажи, как ты понимаешь такое разбиение? Согласен ли ты с ним?
10+
- Централизованные vs децентрализованные?
11+
- Immediate read oracles vs publish-subscribe oracles vs request-response oracles?
12+
4. Одним из самых популярных сервисов среди оракулов является chainlink. Что можешь рассказать про него?
13+
- Какую роль в экосистеме играет токен Link?
14+
- Что такое "Basic request model"?
15+
- Что такое "Off-Chain Reporting"?
16+
- Как работают price feeds?
17+
- Что такое VRF?
18+
- Для чего используются Keepers?
19+
5. Творческий вопрос. Как ты считаешь оракулы это больше про "возможности" или "опасности"? Это безопасный способ взаимодействия смарт-контрактов с внешним миром или это потенциально узкое место, которое вредит децентрализации и к тому же подобное решение легко взломать? Здесь нужно рассказать собственное отношение к оракулам.
20+
21+
## Links
22+
23+
- [WHY DO SMART CONTRACTS NEED ORACLES?](https://ethereum.org/en/developers/docs/oracles/#why-do-smart-contracts-need-oracles)
24+
- [Oracles](https://ethereum.org/en/developers/docs/oracles/)
25+
- [Implementing a Blockchain Oracle on Ethereum](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e)
26+
- [Chainlink](https://chain.link/)

solidity/junior-3/solidity/README.md

Lines changed: 0 additions & 167 deletions
Original file line numberDiff line numberDiff line change
@@ -1,172 +1,5 @@
11
# Вопросы по Solidity
22

3-
## Meta transactions
4-
5-
1. Что такое метатранзакции?
6-
2. Для чего можно применять метатранзакции? Назвать не менее трех вариантов использования.
7-
3. Какая основная идея стандарта ERC-2771?
8-
- Какая задача отводится контракту **Forwarder**?
9-
- Для чего необходимо использовать ```_msgSender()``` вместо ```msg.sender```?
10-
4. Gas Station Network - это пример проекта с открытым исходным кодом, который помогает реализовать метатранзакции. Можешь рассказать, как он устроен, как работает, его верхнеуровневую архитектуру?
11-
- Для чего необходимо реализовать контракт ```Paymaster```?
12-
- Можно ли использовать [контракты из библиотеки OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/metatx) для организации метатранзакций?
13-
- Какие еще есть сервисы, которые можно использовать для организации метатранзакций?
14-
5. Можно ли реализовать метатранзакции нативно?
15-
- Как работает следующий пример кода?
16-
```solidity
17-
// SPDX-License-Identifier: UNLICENSED
18-
pragma solidity ^0.8.19;
19-
20-
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
21-
22-
contract Token is ERC20 {
23-
bytes32 public constant META_TRANSACTION_TYPEHASH =
24-
keccak256("MetaTransaction(uint256 nonce,address signer,bytes functionSignature)");
25-
26-
mapping(address signer => uint256 nonce) private _nonces;
27-
28-
struct MetaTransaction {
29-
uint256 nonce;
30-
address signer;
31-
bytes functionSignature;
32-
}
33-
34-
event MetaTransactionExecuted(
35-
address signer,
36-
address relayer,
37-
bytes functionSignature
38-
);
39-
40-
error ZeroAddress();
41-
error InvalidSignature();
42-
error InvalidCall();
43-
44-
constructor() ERC20("Token", "MTT") {}
45-
46-
function DOMAIN_SEPARATOR() public view returns (bytes32) {
47-
return keccak256(
48-
abi.encode(
49-
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
50-
keccak256("EIP712"),
51-
keccak256("1"),
52-
block.chainid,
53-
address(this)
54-
)
55-
);
56-
}
57-
58-
function executeMetaTransaction(
59-
address signer,
60-
bytes memory functionSignature,
61-
uint8 v,
62-
bytes32 r,
63-
bytes32 s
64-
) external payable returns (bytes memory result) {
65-
MetaTransaction memory _tx = MetaTransaction({
66-
nonce: _nonces[signer],
67-
signer: signer,
68-
functionSignature: functionSignature
69-
});
70-
71-
bool isVerify = _verify(signer, _tx, v, r, s);
72-
if (!isVerify) {
73-
revert InvalidSignature();
74-
}
75-
76-
_nonces[signer] += 1;
77-
78-
(bool success, bytes memory data) = address(this).call(
79-
abi.encodePacked(functionSignature, signer)
80-
);
81-
82-
if (!success) {
83-
revert InvalidCall();
84-
}
85-
86-
emit MetaTransactionExecuted(signer, msg.sender, functionSignature);
87-
88-
return data;
89-
}
90-
91-
function getNonce(address account) external view returns (uint256) {
92-
return _nonces[account];
93-
}
94-
95-
function _msgSender() internal view override returns (address sender) {
96-
if (msg.sender == address(this)) {
97-
assembly {
98-
sender := shr(96, calldataload(sub(calldatasize(), 20)))
99-
}
100-
}
101-
else {
102-
return super._msgSender();
103-
}
104-
}
105-
106-
function _verify(
107-
address signer,
108-
MetaTransaction memory _tx,
109-
uint8 v,
110-
bytes32 r,
111-
bytes32 s
112-
) private view returns (bool) {
113-
if (signer == address(0)) {
114-
revert ZeroAddress();
115-
}
116-
117-
return signer == ecrecover(_getDigest(_tx), v, r, s);
118-
}
119-
120-
function _getDigest(MetaTransaction memory _tx) private view returns (bytes32) {
121-
return keccak256(
122-
abi.encodePacked(
123-
"\x19\x01",
124-
DOMAIN_SEPARATOR(),
125-
keccak256(
126-
abi.encode(
127-
META_TRANSACTION_TYPEHASH,
128-
_tx.nonce,
129-
_tx.signer,
130-
keccak256(_tx.functionSignature)
131-
)
132-
)
133-
)
134-
);
135-
}
136-
}
137-
```
138-
6. Творческий вопрос. Как ты считаешь, на сколько важны метатранзакции? Есть ли у них будущее? Нарушают ли они какие-нибудь законы децентрализации?
139-
140-
- [Gas-free transactions: Meta Transactions explained](https://medium.com/coinmonks/gas-free-transactions-meta-transactions-explained-f829509a462d)
141-
- [ERC-2771](https://eips.ethereum.org/EIPS/eip-2771)
142-
- [Gas Station Network](https://docs.opengsn.org/)
143-
- [Native Meta Transactions](https://medium.com/gitcoin/native-meta-transactions-e509d91a8482)
144-
145-
## Oracles
146-
147-
1. Что такое оракул?
148-
- Для чего нужны оракулы?
149-
2. Как технически можно организовать работу оракула? (Желательно подготовить схему работы для объяснения)
150-
- Сколько смарт-контрактов необходимо?
151-
- Какие предъявляются требования к off-chain части оракула?
152-
- Есть ли затраты на использование оракула и кто оплачивает эти расходы?
153-
3. Мы подготовили несколько вариантов классификации оракулов. Расскажи, как ты понимаешь такое разбиение? Согласен ли ты с ним?
154-
- Централизованные vs децентрализованные?
155-
- Immediate read oracles vs publish-subscribe oracles vs request-response oracles?
156-
4. Одним из самых популярных сервисов среди оракулов является chainlink. Что можешь рассказать про него?
157-
- Какую роль в экосистеме играет токен Link?
158-
- Что такое "Basic request model"?
159-
- Что такое "Off-Chain Reporting"?
160-
- Как работают price feeds?
161-
- Что такое VRF?
162-
- Для чего используются Keepers?
163-
5. Творческий вопрос. Как ты считаешь оракулы это больше про "возможности" или "опасности"? Это безопасный способ взаимодействия смарт-контрактов с внешним миром или это потенциально узкое место, которое вредит децентрализации и к тому же подобное решение легко взломать? Здесь нужно рассказать собственное отношение к оракулам.
164-
165-
- [WHY DO SMART CONTRACTS NEED ORACLES?](https://ethereum.org/en/developers/docs/oracles/#why-do-smart-contracts-need-oracles)
166-
- [Oracles](https://ethereum.org/en/developers/docs/oracles/)
167-
- [Implementing a Blockchain Oracle on Ethereum](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e)
168-
- [Chainlink](https://chain.link/)
169-
1703
## Evm opcodes
1714

1725
1. Что такое opcodes?

0 commit comments

Comments
 (0)