トランザクションにストレージダンプが含まれているのはなぜですか?
1 回答
- 投票
-
- 2019-03-05
実際には、これは完全なストレージではなく、big_map以外の部分のみです.通常、その部分は、big_map部分と比較して、あまり大きくならないはずです.
しかし、実際、すべてのトランザクション結果、特に部分的な結果でそのストレージを繰り返すには、依然としてコストがかかる可能性があります.ノードでは、transaction_resultsはブロックに格納され、それ自体が
store
データベースに格納されます.ローリングノード、つまりすべてのブロックを保持していないノードでは、ブロックが忘れられたときにこのストレージが回復されます.ストレージをトランザクション結果に入れると、ブロックが大きくなり、送信時間が長くなるため、ノードの帯域幅も増加します.Dappsの開発者がスマートコントラクトのストレージを簡単に監視できるというメリットと比較して、支払うコストが少ないという考えだったと思います.
Actually, it is not the full storage, but only the non-big_map part. Normally, that part should not grow too much, compared to the big_map part.
But indeed, it can still be expensive to repeat that storage in all transaction results, especially partial ones. In the node, transaction_results are stored in the blocks, themselves stored in the
store
database. With a rolling node, i.e. a node that does not keep all the blocks, this storage will be recovered when the blocks will be forgotten. Putting the storage in the transaction results also increases the bandwidth of the nodes, since it makes the blocks bigger, so longer to transmit.I think the idea was that it was a small cost to pay compared to the benefit for the developers of Dapps to be able to easily monitor the storage of their smart contracts.
-
dapps開発者にとってのメリットは何ですか?これは、dappsのデバッグモードに似ており、(私が思うに)本番環境にはまったく存在しないはずです.各操作でストレージの一部を使用する必要がある場合の例をいくつか挙げてください.What are the benefits for dapps developers? This is more like a debug mode for dapps, which (as I think) should not be in production at all. Could you give some examples when is really needed to have a part of the storage in each operation?
- 0
- 2019-03-05
- Groxan
-
各操作の後にストレージを提供しない場合は、2つのブロック間でRPCによってのみクエリを実行できます.そのため、同じブロック内の複数のトランザクションが同じストレージを変更する場合、中間状態を監視することはできません.特定の使用例は考えていませんが、多くの人にとって役に立たない機能が、面白くて予想外の使用法であると感じることがあります.If you don’t provide the storage after each operation, you can only query it by RPC between two blocks. So, you won’t be able to observe intermediate states when several transactions in the same block alter the same storage. I don’t have a particular example of use in mind, but sometimes, a feature that is useless for many people find an interesting and unexpected usage.
- 0
- 2019-03-05
- lefessan
-
私には、ストレージのオフチェーンシミュレーションとストレージのRPCクエリは、ノードリソースを維持するために本番環境で行うべき正しいことのようです.契約の状態を追跡する便利さはツールによって解決できますが、フルノードの追加ストレージに支払う価格は永続的です.seems to me off-chain simulation of the storage and RPC query of the storage are the right thing to do in production in order to maintain node resources. The convenience of tracking the state of a contract can be solved by tooling whereas the price to pay for extra storage in the full node is permanent.
- 0
- 2019-03-06
- Ezy
-
とにかく、ご覧のとおり、呼び出し元に関するデータを格納するために `big_map`の代わりに`map`を使用する多くのコントラクトがあります.これは深刻な脆弱性です.ストレージが大きくなりすぎて、操作サイズの制限のために誰もコントラクトにトランザクションを送信できなくなるまで、多くのアドレスからこれらすべてのコントラクトをスパムする可能性があるためです.Anyway, as you can see, there are many contracts that use `map` instead of `big_map` to store some data about their callers. This is a serious vulnerability, because I can spam all these contracts from many addresses until the storage becomes so large that no one can send a transaction to the contract due to operation size limit.
- 0
- 2019-03-07
- Groxan
-
さらに、この脆弱性は初心者の開発者には明らかではありません.初心者がお金を失うことがないように、世界のすべてのものはできるだけシンプルで明白でなければならないと思います.Moreover, this vulnerability is not obvious to novice developers. I think that everything in the world should be as simple and obvious as possible so that newbies do not lose their money.
- 0
- 2019-03-07
- Groxan
-
@Groxan操作結果は、操作またはブロックサイズに影響しません.これらは、生のブロックデータからノードによって計算されます.この場合は、Michelsonインタープリターを実行します.ただし、成長が何らかの形で抑制されていないマップとの契約は、運用サイズの制限ではなくガスの制限のために、DoSに対して脆弱になる可能性が高いことは正しいです.@Groxan The operation results do not contribute to the operation or block size. They are computed by nodes from the raw block data, in this case by running the Michelson interpreter. However, you are correct that a contract with a map whose growth is not throttled somehow will likely be vulnerable to DoS -- due to the gas limit, not the op size limit.
- 0
- 2019-03-28
- Tom
いくつかのスマートコントラクトとのいくつかのトランザクションを調べたところ、それらがコントラクトのストレージのダンプを格納していることがわかりました.
例:
https://mainnet.tezrpc.me/chains/メイン/ブロック/246869/操作/3/0 https://mainnet.tezrpc.me/chains/main/blocks/328655/Operations/3/0
それを行う意味は何ですか?特に契約のストレージが大きい場合は、多くのメモリが必要になります.