スマヌトコントラクトの自動監査のガむド。 パヌト3ミスリル

譊告


この蚘事は、自動分析装眮の有効性の評䟡ではありたせん。 それらを自分の契玄に適甚し、意図的に゚ラヌを合成し、反応を研究したす。 このような調査は、「より悪い」を刀断するための基瀎ずなるこずはできたせん。このため、この皮の゜フトりェアの気たぐれな性質を考えるず、実斜が非垞に難しい契玄の倧芏暡なサンプルで盲怜調査を実斜するこずは理にかなっおいたす。 契玄の小さな゚ラヌがアナラむザヌロゞックの倧郚分を無効にする可胜性が非垞に高く、単玔なヒュヌリスティックサむンが、競合他瀟が単に远加するこずができなかった広範なバグを芋぀けるこずによっお、アナラむザヌに膚倧な量のポむントを远加する可胜性がありたす。 契玄の準備ず線集の誀りも重芁な圹割を果たしたす。 問題の゜フトりェアはすべお非垞に新しく、絶えず開発されおいるため、修埩䞍可胜な問題ずしお批刀的なコメントを受け取らないでください。


この蚘事の目的は、さたざたなアナラむザヌでのコヌド分析の方法がどのように機胜するか、および「遞択する」のではなく、それらを正しく䜿甚する胜力を読者に理解させるこずです。 合理的な遞択は、分析された契玄に最も適したものに焊点を合わせお、䞀床に耇数のツヌルを䜿甚するこずです。


起動のセットアップず準備


ミスリルは䞀床にいく぀かのタむプの分析を䜿甚したすが、これに関するいく぀かの優れた蚘事がありたす。 最も重芁なのは 、 thisたたはthisです。 続行する前に、それらを読むこずは理にかなっおいたす。


たず、Mythrilの独自のDockerむメヌゞを䜜成したしょう䜕を倉曎したいかは関係ありたせんか


git clone https://github.com/ConsenSys/mythril-classic.git cd mythril-classic docker build -t myth . 

今、私たちのcontracts/flattened.sol はじめに説明したものず同じ契玄を䜿甚しおいたすで実行しおみおくださいOwnableずBooking 2぀の䞻芁な契玄がありたす。 コンパむラヌのバヌゞョンにはただ問題がありたす。以前の蚘事ず同じ方法で修正し、Dockerfileにコンパむラヌのバヌゞョンを眮き換える行を远加したした。


 COPY --from=ethereum/solc:0.4.20 /usr/bin/solc /usr/bin 

むメヌゞを再構築した埌、契玄分析を実行しおみるこずができたす。 すぐに-v4および--verbose-reportフラグを䜿甚しお、すべおの譊告を確認したしょう。 行こう


 docker run -v $(pwd):/tmp \ -w /tmp myth:latest \ -v4 \ --verbose-report \ -x contracts/flattened.sol 

ここでは、䟝存関係のないフラット化されたコントラクトを䜿甚したす。 別のBooking.solコントラクトを分析し、Mythrilがすべおの䟝存関係をキャッチするようにするには、次のようなものを䜿甚できたす。


 docker run -v $(pwd):/tmp \ -w /tmp myth:latest \ --solc-args="--allow-paths /tmp/node_modules/zeppelin-solidity/ zeppelin-solidity=/tmp/node_modules/zeppelin-solidity" \ -v4 \ --verbose-report \ -x contracts/Booking.sol 

私は、フラット化されたオプションを䜿甚するこずを奜みたす。 コヌドを倧幅に倉曎したす。 しかし、 --truffleは非垞に䟿利なモヌド--truffle 、これはtruffleすべおを単玔に--truffle truffle 、プロゞェクト党䜓の脆匱性をチェックしたす。 もう1぀の重芁な機胜は、コロンを介しお分析する契玄の名前を指定する機胜です。それ以倖の堎合、Mythrilは遭遇するすべおの契玄を分析したす。 OwnableのOwnableは安党な契玄であるず考えおおり、 Bookingのみを分析するため、実行する最終行は次のずおりです。


 docker run -v $(pwd):/tmp -w /tmp myth:latest -x contracts/flattened.sol:Booking -v4 --verbose-report 

契玄の開始ず展開


䞊蚘の行でアナラむザヌを起動し、出力を確認するず、ずりわけ次の行が衚瀺されたす。


 mythril.laser.ethereum.svm [WARNING]: No contract was created during the execution of contract creation Increase the resources for creation execution (--max-depth or --create-timeout) The analysis was completed successfully. No issues were detected. 

コントラクトは䜜成されおおらず、゚ミュレヌタで「修正」されおいないこずがわかりたした。 そのため、すべおのタむプの分析に-v4フラグを䜿甚しお、すべおのメッセヌゞを衚瀺し、1぀の重芁なメッセヌゞを芋逃さないようにするこずをお勧めしたす。 䜕が悪いのかを考えおみたしょう。 この実甚的な問題の解決策は、Mythrilを正しく䜿甚する方法を理解するために非垞に重芁です。


だから、 It uses concolic analysis, taint analysis and control flow checking to detect a variety of security vulnerabilitiesに぀いお読んでいる It uses concolic analysis, taint analysis and control flow checking to detect a variety of security vulnerabilities 。 これらの甚語にあたり粟通しおいない堎合は、 ここでコンコリックテストに関するwikiをお勧めしたすが、 ここでは x86の汚染チェックに関する優れたプレれンテヌションを玹介したす。 芁するに、Mythrilはコントラクトの実行を゚ミュレヌトし、実行が進むブランチを修正し、コントラクトの「壊れた」状態を達成しようずし、パラメヌタヌのさたざたな組み合わせを゜ヌトし、すべおの可胜なパスを回避しようずしたす。 䞊蚘の蚘事のサンプルアクション図を次に瀺したす。


 1.      .   symbolic-,        . 2.      ,     ,   trace .    ,      ,    . 3.     . 4.       trace-. 5.  symbolic execution   trace,   symbolic ,    ,     ,     . 6.     ,          .    , . 7.   :   ,   ,   input-,     ,      .   input-   ,   .6    . 8.   .4 

これを倧幅に簡玠化するために、コヌド内のブランチに遭遇したMythrilは、どの倉数セットの䞋で1぀のブランチず他のブランチに入るこずができるかを理解できたす。 各ブランチでは、 selfdestruct assert 、 transfer 、 selfdestructおよびその他のセキュリティ関連のオペコヌドに぀ながるかどうかを知っおいたす。 したがっお、Mythrilは、どのパラメヌタずトランザクションのセットがセキュリティ䟵害に぀ながる可胜性があるかを分析したす。 そしお、Mythrilが制埡を埗られないブランチを切断し、制埡フロヌを分析する方法が䞻なトリックです。 ミスリルの内臓ずブランチりォヌキングの詳现に぀いおは、 こちらをご芧ください 。


スマヌトコントラクトの実行の決定性により、同じ呜什シヌケンスは、プラットフォヌム、アヌキテクチャ、たたは環境に関係なく、垞に厳密に1セットの状態倉化に぀ながりたす。 たた、スマヌトコントラクトの機胜は非垞に短く、リ゜ヌスは非垞に限られおいるため、シンボリック実行ずネむティブ実行を組み合わせたMythrilのようなアナラむザヌは、スマヌトコントラクトに察しお非垞に効率的に動䜜できたす。


その過皋で、Mythrilは「状態」の抂念で動䜜したす。これは、契玄のコヌド、その環境、珟圚のコマンドぞのポむンタ、契玄の保存、スタックの状態です。 ドキュメントは次のずおりです。


 The machine state ÎŒ is defined as the tuple (g, pc, m, i, s) which are the gas available, the program counter pc ∈ P256, the memory contents, the active number of words in memory (counting continuously from position 0), and the stack contents. The memory contents ÎŒm are a series of zeroes of size 256. 

状態間の遷移グラフは、研究の䞻な目的です。 分析を正垞に起動した堎合、このグラフに関する情報が分析ログに衚瀺されたす。 たた、 --graphは、 --graphオプションを䜿甚しお、人間が読める圢匏でこのグラフを--graphできたす。


これで、Mythrilが䜕をするのかを倚かれ少なかれ理解し、契玄が解析されない理由ず[WARNING]: No contract was created during the execution of contract creation由来を理解し続けたす。 [WARNING]: No contract was created during the execution of contract creation 。 始めるために、 --create-timeoutおよび--max-depth 掚奚をひねり、結果が埗られないので、コンストラクタヌのせいだず思いたした-その䞭の䜕かが機胜したせんでした。 圌のコヌドは次のずおりです。


 function Booking( string _description, string _fileUrl, bytes32 _fileHash, uint256 _price, uint256 _cancellationFee, uint256 _rentDateStart, uint256 _rentDateEnd, uint256 _noCancelPeriod, uint256 _acceptObjectPeriod ) public payable { require(_price > 0); require(_price > _cancellationFee); require(_rentDateStart > getCurrentTime()); require(_rentDateEnd > _rentDateStart); require(_rentDateStart+_acceptObjectPeriod < _rentDateEnd); require(_rentDateStart > _noCancelPeriod); m_description = _description; m_fileUrl = _fileUrl; m_fileHash = _fileHash; m_price = _price; m_cancellationFee = _cancellationFee; m_rentDateStart = _rentDateStart; m_rentDateEnd = _rentDateEnd; m_noCancelPeriod = _noCancelPeriod; m_acceptObjectPeriod = _acceptObjectPeriod; } 

ミスリルの行動のアルゎリズムを思い出しおください。 トレヌスを実行するには、コントラクトのコンストラクタヌを呌び出す必芁がありたす。これは、以降の実行はすべお、コンストラクタヌが呌び出されたパラメヌタヌに䟝存するためです。 たずえば、 _price == 0でコンストラクタヌを呌び出すず、コンストラクタヌはrequire(_price > 0)䟋倖をスロヌしたす。 _priceが倚くの_price倀を反埩凊理しおも、たずえば_price <= _cancellationFee堎合、コンストラクタヌは匕き続き砎損したす。 この契玄では、厳しい制限に関連付けられた倚数のパラメヌタヌがあり、もちろん、Mythrilはパラメヌタヌの有効な組み合わせを掚枬できたせん。 圌は、コンストラクタヌのパラメヌタヌを゜ヌトしお、実行の次のブランチに移動しようずしたすが、実際には掚枬する機䌚がありたせん-パラメヌタヌの組み合わせが倚すぎたす。 したがっお、契玄の蚈算はうたくいきたせん-すべおの方法は䜕らかの皮類のrequire(...)に基づいおおり、䞊蚘の問題が発生したす。


2぀の方法がありたす。1぀目は、コンストラクタヌですべおのrequireをコメント化しお無効にするこずです。 その埌、Mythrilは任意のパラメヌタセットでコンストラクタヌを呌び出すこずができ、すべおが機胜したす。 しかし、これは、そのようなパラメヌタヌを䜿甚しおコントラクトを怜査するこずにより、Mythrilは、コンストラクタヌに枡される誀った倀で発生する可胜性のある゚ラヌを芋぀けるこずを意味したす。 簡単に蚀えば、契玄䜜成者が_cancellationFeeのレンタル䟡栌の10億倍に指定した堎合に発生するバグを_cancellationFeeが発芋した堎合、そのようなバグでは䜿甚できたせん-そのような契玄はブロック_mprice 、゚ラヌを芋぀けるためのリ゜ヌスが消費されたす。 私たちは、契玄がただ倚かれ少なかれ䞀貫したパラメヌタヌでスタックしおいるこずを暗瀺しおいるので、さらなる分析のために、より珟実的なコンストラクタヌパラメヌタヌを指定しお、Mythrilが契玄が適切に閉じられた堎合に決しお発生しない゚ラヌを探しないようにしたす。


コンストラクタヌのさたざたな郚分を含めお、無効にするこずで、展開がどこで䞭断するかを正確に理解しようず、䜕時間も費やしたした。 トラブルに加えお、コンストラクタヌはgetCurrentTime()䜿甚しお珟圚の時刻を返したすが、この呌び出しがMythrilをどのように凊理するかは䞍明です。 ここではこれらの冒険に぀いおは説明したせん。 ほずんどの堎合、定期的に䜿甚するず、これらの埮劙な点が監査人に知られるようになりたす。 したがっお、2番目の方法を遞択したした入力デヌタを制限し、コンストラクタヌからすべおのパラメヌタヌを削陀し、 getCurrentTime()でさえ、必芁なパラメヌタヌをコンストラクタヌに盎接ハヌドコヌディングしたした理想的には、これらのパラメヌタヌは顧客から取埗する必芁がありたす


  function Booking( ) public payable { m_description = "My very long booking text about hotel and beautiful sea view!"; m_fileUrl = "https://ether-airbnb.bam/some-url/"; m_fileHash = 0x1628f3170cc16d40aad2e8fa1ab084f542fcb12e75ce1add62891dd75ba1ffd7; m_price = 1000000000000000000; // 1 ETH m_cancellationFee = 100000000000000000; // 0.1 ETH m_rentDateStart = 1550664800 + 3600 * 24; // current time + 1 day m_rentDateEnd = 1550664800 + 3600 * 24 * 4; // current time + 4 days m_acceptObjectPeriod = 3600 * 8; // 8 hours m_noCancelPeriod = 3600 * 24; // 1 day require(m_price > 0); require(m_price > m_cancellationFee); require(m_rentDateStart > 1550664800); require(m_rentDateEnd > m_rentDateStart); require((m_rentDateStart + m_acceptObjectPeriod) < m_rentDateEnd); require(m_rentDateStart > m_noCancelPeriod); } 

さらに、すべおを開始するには、 max-depthパラメヌタヌも蚭定する必芁がありたす。 AWSむンスタンスt2.mediumで--max-depth=34を--max-depth=34しお、このコンストラクタヌで--max-depth=34たした。 同時に、より匷力なラップトップでは、 max-depthなしですべおが始たりたす。 このパラメヌタヌの䜿甚から刀断するず、分析のためにブランチを構築する必芁があり、そのデフォルト倀は無限 code です。 したがっお、このパラメヌタヌをツむスト回転させたすが、目的の契玄が分析されるようにしたす。 次のようなメッセヌゞでこれを理解できたす。


 mythril.laser.ethereum.svm [INFO]: 248 nodes, 247 edges, 2510 total states mythril.laser.ethereum.svm [INFO]: Achieved 59.86% coverage for code: ............. 

最初の行は分析されるグラフを説明するだけで、残りの行を自分で読んでください。 実行可胜なさたざたなブランチを分析するには、深刻な蚈算リ゜ヌスが必芁です。そのため、倧芏暡な契玄を分析する堎合は、高速のコンピュヌタヌでも埅たなければなりたせん。


゚ラヌを怜玢する


ここで゚ラヌを探し、独自の゚ラヌを远加したす。 ミスリルは、攟送、自己砎壊、䞻匵、およびセキュリティの芳点から重芁なその他のアクションが行われるブランチを探したす。 䞊蚘の指瀺のいずれかが契玄コヌドのどこかにある堎合、Mythrilはこのブランチに到達する方法を調べ、さらにこのブランチに぀ながるトランザクションのシヌケンスを衚瀺したす


最初に、Mythrilが長幎のBooking契玄のために発行したものを芋おみたしょう。 最初の譊告


 ==== Dependence on predictable environment variable ==== SWC ID: 116 Severity: Low Contract: Booking Function name: fallback PC address: 566 Estimated Gas Usage: 17908 - 61696 Sending of Ether depends on a predictable variable. The contract sends Ether depending on the values of the following variables: - block.timestamp Note that the values of variables like coinbase, gaslimit, block number and timestamp are predictable and/or can be manipulated by a malicious miner. Don't use them for random number generation or to make critical decisions. -------------------- In file: contracts/flattened.sol:142 msg.sender.transfer(msg.value-m_price) 

そしおそれは起こる


 require(m_rentDateStart > getCurrentTime()); 

フォヌルバック関数で。


getCurrentTime()隠れおいるこずに気づいたこずに泚意しおください。 契玄の意味は間違いではないずいう事実にもかかわらず、 block.timestampをブロヌドキャストに関連付けるずいう事実は玠晎らしいです この堎合、プログラマヌは、マむナヌが制埡できる倀に基づいお決定が䞋されるこずを理解する必芁がありたす。 たた、将来、サヌビスのオヌクションたたは別のオヌクションが契玄のこの堎所で発生した堎合、フロントランニング攻撃の可胜性を考慮する必芁がありたす。


次のようにネストされた呌び出しで倉数を非衚瀺にした堎合、 block.timestampぞの䟝存関係をblock.timestampかどうかを芋おみたしょう。


 function getCurrentTime() public view returns (uint256) { - return now; + return getCurrentTimeInner(); } + function getCurrentTimeInner() internal returns (uint256) { + return now; + } 

そしおはい ミスリルは匕き続きblock.timestampずブロヌドキャストの転送ずの関係を確認しおいたす。これは監査人にずっお非垞に重芁です。 攻撃者によっお制埡される倉数ず、契玄の状態のいく぀かの倉曎埌に行われた決定ずの関係は、ロゞックによっお非垞に隠されおいる可胜性があり、Mythrilではそれを远跡できたす。 すべおの可胜な倉数間のすべおの可胜な接続がgetCurrentTime()されるずいう事実に䟝存する䟡倀はありたせんが、 getCurrentTime()関数でgetCurrentTime()を続け、䞉重のネストの深さを䜜り続けるず、譊告は消えたす。 Mythrilの各関数呌び出しには、新しい状態ブランチを䜜成する必芁があるため、非垞に深いレベルのネストを分析するには、膚倧なリ゜ヌスが必芁になりたす。


もちろん、分析パラメヌタヌを誀っお䜿甚したり、アナラむザヌの深さのどこかでカットオフが発生したりするかなり深刻な可胜性がありたす。 私が蚀ったように、この補品は執筆時点で積極的に開発䞭であり、リポゞトリにmax-depth蚀及があるコミットがあるので、珟圚の問題を真剣に受け取らないでください.Mythrilが暗黙的な接続を非垞に効果的に探すこずができるずいう十分な蚌拠をすでに発芋しおいたす倉数。


最初に、クラむアントにブロヌドキャストをコントラクトに送信した埌にのみ、誰にでもブロヌドキャストを提䟛する関数をコントラクトに远加したす。 契玄がState.PAID状態にある堎合のみ぀たり、クラむアントがレンタル番号を航空で支払った埌にのみ、誰でも航空の1/5を受け取るこずを蚱可したした。 関数は次のずおりです。


 function collectTaxes() external onlyState(State.PAID) { msg.sender.transfer(address(this).balance / 5); } 

ミスリルは問題を発芋したした


 ==== Unprotected Ether Withdrawal ==== SWC ID: 105 Severity: High Contract: Booking Function name: collectTaxes() PC address: 2492 Estimated Gas Usage: 2135 - 2746 Anyone can withdraw ETH from the contract account. Arbitrary senders other than the contract creator can withdraw ETH from the contract account without previously having sent a equivalent amount of ETH to it. This is likely to be a vulnerability. -------------------- In file: contracts/flattened.sol:149 msg.sender.transfer(address(this).balance / 5) -------------------- -------------------- Transaction Sequence: { "2": { "calldata": "0x", "call_value": "0xde0b6b3a7640000", "caller": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" }, "3": { "calldata": "0x01b613a5", "call_value": "0x0", "caller": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" } } 

玠晎らしい、぀たり ミスリルは2぀のトランザクションを公開したした。これにより、契玄から゚ヌテルを取埗するこずができたす。 次のように、 State.PAID芁件をState.RENT倉曎したす。


 - function collectTaxes() external onlyState(State.PAID){ + function collectTaxes() external onlyState(State.RENT) { 

これで、 collectTaxes()は、契玄がState.RENT状態にある堎合にのみ呌び出すこずができ、珟時点では残高に䜕もありたせん。 契玄はすでにブロヌドキャスト党䜓を所有者に送信しおいたす。 ここで重芁なこずは、Mythrilは今回ぱラヌ==== Unprotected Ether Withdrawal ====出力しないこずです onlyState(State.RENT)条件䞋では、アナラむザヌは、残高がれロでない契玄から゚ヌテルを送信するコヌドブランチに到達したせんでした。 State.RENTはパラメヌタのさたざたなオプションを怜蚎したしたが、すべおのブロヌドキャストを貞し手に送信するこずでのみState.RENTできたす。 したがっお、バランスがれロでないコヌドのこの分岐に到達するこずは䞍可胜であり、Mythrilは絶察に監査人を悩たせたせん


同様に、 selfdestructを芋぀けおassert 、どのアクションが契玄の砎壊たたは重芁な機胜の故障に぀ながる可胜性があるかを監査人に瀺したす。 これらの䟋は提䟛せず、䞊の䟋のような関数を䜜成しお、 selfdestruct呌び出すselfdestructで、そのロゞックをひねりたしょう。


たた、Mythrilの䞀郚がシンボリック実行であり、このアプロヌチ自䜓が実行を゚ミュレヌトせずに倚くの脆匱性を刀断できるこずを忘れないでください。 たずえば、オペランドの1぀が攻撃者によっお䜕らかの圢で制埡されおいる堎合、「+」、「-」、およびその他の算術挔算子を䜿甚するず、「敎数オヌバヌフロヌ」の脆匱性ず芋なされたす。 しかし、繰り返したすが、Mythrilの最も匷力な機胜は、シンボリック実行ずネむティブ実行の組み合わせず、論理分岐に぀ながるパラメヌタ倀の定矩です。


おわりに


もちろん、Mythrilが怜出できる朜圚的な問題の党範囲を瀺すには、耇数の蚘事が必芁ですが、いく぀かの蚘事が必芁です。 他のすべおに、圌は実際のブロックチェヌンですべおを行う方法を知っおおり、眲名によっお必芁な契玄ず脆匱性を芋぀け、矎しいコヌルグラフを構築し、レポヌトをフォヌマットしたす。 たた、Mythrilでは、独自のテストスクリプトを蚘述しお、Pythonベヌスのむンタヌフェむスをコントラクトに提䟛し、個々の機胜をテストしたり、パラメヌタ倀を修正したり、任意の柔軟性で逆アセンブルされたコヌドを操䜜する独自の戊略を実装するこずもできたす。


Mythrilはただかなり若い゜フトりェアであり、これはIDA Proではなく、いく぀かの蚘事を陀いおほずんどドキュメントがありたせん。 倚くのパラメヌタヌの倀は、 cli.pyで始たるMythrilコヌドでのみ読み取るこずができたす。 各パラメヌタヌの操䜜に関する完党か぀詳现な説明がドキュメントに蚘茉されるこずを願っおいたす。


さらに、コントラクトが倚かれ少なかれ、倧量の゚ラヌの出力は倚くのスペヌスを占有したすが、芋぀かった゚ラヌに関する圧瞮された情報を受信できるようにしたいず思いたす。 Mythrilを䜿甚する堎合は、分析トレヌスを必ず確認し、可胜な限りテストされた契玄を確認し、監査人が停陜性ず芋なす特定の゚ラヌを匷制的に無効にするこずができたす。


しかし、䞀般的に、Mythrilはスマヌトコントラクトを分析するための優れた非垞に匷力なツヌルであり、珟時点では監査人の歊噚になるはずです。 これにより、少なくずもコヌドの重芁な郚分に泚意を払い、倉数間の隠れた関係を怜出できたす。


芁玄するず、Mythrilの䜿甚に関する掚奚事項は次のずおりです。


  1. 調査䞭の契玄の開始条件をできるだけ絞りたす。 分析䞭に、Mythrilが実際には実装されないブランチに倚くのリ゜ヌスを費やすず、本圓に重芁なバグを芋぀けるこずができなくなるため、朜圚的なブランチの領域を垞に絞り蟌んでください。
  2. mythril.laser.ethereum.svm [WARNING]: No contract was created during the execution of contract creation Increase the resources for creation execution (--max-depth or --create-timeout)などのメッセヌゞを芋逃さないように、契玄分析が開始されおいるこずを確認しおくださいmythril.laser.ethereum.svm [WARNING]: No contract was created during the execution of contract creation Increase the resources for creation execution (--max-depth or --create-timeout) 、それ以倖の堎合は、バグがないず誀っお考慮する可胜性がありたす。
  3. 契玄コヌドでブランチを任意に無効化しお、Mythrilがブランチを遞択しおリ゜ヌスを節玄する際の倉動を少なくするこずができたす。 分析を「切り萜ずさない」ようにmax-depth制限を蚭けないでくださいが、゚ラヌを隠さないように泚意しおください。
  4. 各譊告に泚意しおください。軜いコメントであっおも、少なくずも契玄コヌドにコメントを远加しお、他の開発者が簡単にできるようにする䟡倀がある堎合がありたす。

次の蚘事では、Manticoreアナラむザヌを取り䞊げたすが、ここに、執筆の準備ができおいる、たたは執筆予定の蚘事の目次を瀺したす。


パヌト1. はじめに。 Solidityのコンパむル、フラット化、バヌゞョン
パヌト2. スリザヌ
パヌト3.ミスリルこの蚘事
パヌト4. Manticore執筆䞭
パヌト5.゚キドナ執筆䞭



Source: https://habr.com/ru/post/J442114/


All Articles