|
1 | 1 | # Вопросы по Solidity |
2 | 2 |
|
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 | | -
|
170 | 3 | ## Evm opcodes |
171 | 4 |
|
172 | 5 | 1. Что такое opcodes? |
|
0 commit comments