スマートコントラクトの理解:読む、書く、監査

上級11/26/2023, 12:41:25 PM
この記事では、スマートコントラクトのプログラミング技術について、読み書きおよび監査のためのガイドラインを含めて説明しています。スマートコントラクトの構造やコードブロックを理解することは、Solidityや他の言語でそれらを書くための第一歩です。スマートコントラクトは分散型ファイナンス(DeFi)や分散型アプリケーション(DApps)に中心的な役割を果たしているため、そのセキュリティと完璧さを確保することは重要であり、スマートコントラクトの監査が重要な役割を果たしています。

スマートコントラクトの読み取り

スマートコントラクトは、特定の条件が満たされたときにのみ実行されるプログラム可能なコードです。これらは法的に拘束力のある現実世界の契約と同義です。ただし、この場合、コードが法律です。スマートコントラクトはブロックチェーンに存在するため、変更できません。他の特性の中で、この変更不能性がスマートコントラクトを特別なものにしています。

スマートコントラクトの理解:基本と目的

スマートコントラクトブロックチェーン固有の取引を自動化するために意図されています。 条件に応じた契約であるため、中間業者は必要ありません。 スマートコントラクトを有用にする要因の1つは、金融サービス、サプライチェーン管理など、幅広いユースケースにわたる互換性です。 そして、1度にプログラムされる伝統的なコードとは異なり、スマートコントラクトには非常に安全で時間をかけた戦略が必要です。

スマートコントラクトがブロックチェーン技術とどのように整合しているか:BeInCrypto

「“web3”という言葉は、ウェブのゆるい、セキュリティの薄いプログラミング習慣を示唆しています。暗号通貨やスマートコントラクトがウェブページのようにプログラムされると、失敗する運命にあります。持続的に成功するブロックチェーンとそのアプリは、はるかに安全で注意深く、ゆっくりとしたプログラミング手法に基づいています。」

ニック・サザボ、暗号学者兼コンピュータ科学者:Twitter

スマートコントラクトは、ブロックチェーン固有のトークン、例えばイーサリアムブロックチェーン用のERC-20と連携して、取引を促進し移動させることができます。コード、条件、コストが関係しているため、それらを読み込み、書き込み、監査する際には注意が必要です。

スマートコントラクトとその重要性

スマートコントラクトの真の意義は、その性質と位置付けに関わります。あるシナリオにおいて、例えば、人Aがサービスを完了したときに、人Bに資金を移動させる場合、スマートコントラクトのコピーが保存され、ブロックチェーンノードによって実行されます。スマートコントラクトは、チェーン内の契約コードとして保存されます。この多経路検証は、ブロックチェーン中心の特性であり、セキュリティを確保します。

さらに、連続または同期スマートコントラクトが存在します。非同期スマートコントラクトタスクが並行して実行されるため、スマートコントラクトの種類や目的によって、その記述方法、読み方、さらには監査方法が決まります。

従来の契約、不動産権利証書、遺言などは私法であり、政治家や政府の官僚ではなく「私人によって起草される。」スマートコントラクトは、そのような分散型の立法の新しい形態です。https://t.co/EU2Y28FznK
— Nick Szabo (@NickSzabo4)2018年3月15日

標準的なスマートコントラクトで管理される流動性プールを考慮しましょう。

トークンのプールが取引に使用されると想像してください。そして、成功した取引が行われるたびに、総取引額の0.3%がその取引を可能にした流動性提供者に送られるか、その取引可能な資産の流動性を追加しました。取引シナリオ、取引手数料、および非遵守および取引失敗の条件すべてがコード化されています。スマートコントラクト、チェーン内に契約コードとして格納されています。

スマートコントラクトの特性

我々は、それらの特性を認識していない場合、契約の読解、執筆、監査に深く入り込むことはできません。ここには認識しておくべき標準的なスマートコントラクトの特性があります。

標準的なスマートコントラクトのいくつかの特徴:BeInCrypto

プログラマブル契約

スマートコントラクトは単なるコードです。スマートコントラクトを作成して、特定の条件に基づいてコマンドやシナリオを実行できます。これが、スマートコントラクトの開発者とプログラマーが現在需要がある理由です。DeFispace already relies on スマートコントラクト to process complex instances like handling trading fees across liquidity pools, maintaining APY比率、およびその他。

信頼なし

ブロックチェーン上に存在するスマートコントラクトは、人間の介入を排除します。これにより、完全に信頼できなくなります。たとえば、特定のDeFiスマートコントラクトによって管理されるプロトコルは、価値が閾値以下になったら資産を清算することに同意し、人間の介入はできず、またすべきではありません。コードは支払い、パフォーマンス、管理、およびルールの執行を処理し、全体の空間を完全に信頼できるものにします。

自律

前述したように、スマートコントラクトには自己実行型の命令セットがロードされています。コーディングの観点では、これはボイラープレート内に反復とループを構築することを意味します。これにより、支払い、引き出し、入金、スラッシングによるバリデーターへのペナルティ、その他のいくつかのタスクが自律的に処理されます。

セキュリティが確保されました

そして最後に、スマートコントラクトは暗号化を使用して保護されているため、それを破ることは非常に困難です。組み込まれた脆弱性がない場合、スマートコントラクトを迂回することは、そのブロックチェーン全体の前でオープンにそれを破ろうとすることを意味します。

検証可能

スマートコントラクトを介して処理される取引は自己検証可能です。これは、実行が証拠であるため、取引が最初に行われたことがわかります。人間の要素は関与されていないため、自己検証可能なメカニズムは、レガシーバンキングシステムを管理する従来の契約に比べてスマートコントラクトに優位性をもたらします。

次にスマートコントラクトを読む予定がある場合は、ボイラープレートまたは文書にすべての特性が含まれていることを確認してください。


スマートコントラクトの簡略化バージョン:Reddit

特性に基づいてスマートコントラクトを読む

ここには、エスクローアカウントを表すシンプルでスマートな契約があります。ユーザーはエスクローに資金を預け入れ、それを一定期間後に受取人に移します。

/ SPDX-License-Identifier: MITpragma solidity ^0.8.0;// 基本的なスマートコントラクトのボイラープレートcontract SimpleTrustlessEscrow {// ステート変数address public depositor; // イーサを預託するアカウントaddress payable public beneficiary; // イーサを受け取るアカウントuint256 public releaseTime; // イーサを解放するためのタイムスタンプ// コントラクトのアクティビティを検証するためのイベントevent Deposited(address indexed _from, uint256 _value);event Released(address indexed _to, uint256 _value);// コントラクトのコンストラクタはスマートコントラクトを初期化するconstructor(address payable _beneficiary, uint256 _releaseTime) {    require(_releaseTime > block.timestamp, “Release time must be in the future”);    // 安全かつ信頼できる: コントラクトは預金者と受益者を結びつける    depositor = msg.sender;    beneficiary = _beneficiary;    releaseTime = _releaseTime;}// 預金機能 – 自律実行(フォールバック関数)receive() external payable {    emit Deposited(msg.sender, msg.value);}// イーサを受益者に解放する機能function release() public {    // プログラム可能: releaseTimeを過ぎてから実行される    require(block.timestamp >= releaseTime, “Too early to release”);    // 自律的: 条件に基づいて自動的に実行される    uint256 amount = address(this).balance;    beneficiary.transfer(amount);    emit Released(beneficiary, amount);}}

このスマートコントラクトを詳細に解読し読み取ることに取り掛かる前に、まず同じものが言及されている契約特性に適合しているかどうかを確認しましょう。

「プログラム可能」部分

このコードの部分について、契約書を注意深く見てください。

require(block.timestamp >= releaseTime, “リリースが早すぎます”);

uint256 amount = address(this).balance;

beneficiary.transfer(amount);

資金は、特定のreleaseTime条件が満たされた場合にのみリリースされ、これらのプログラム可能な契約が作成されます。

「信頼できない」部分

上記から素早いコードスニペットをご覧ください:

depositor = msg.sender;

beneficiary = _beneficiary;

releaseTime = _releaseTime;

契約では、預金者から資金を受け取る人まで、すべての人がコードによって拘束されています。資金を送金する機能はすべてreleaseTimeというコードベースのパラメーターによって拘束されているため、誰もが他者とやり取りする必要はなく、信頼する必要もありません。

「自律的」の部分

ここはコードの「資金の解放」部分です:

function release() public {require(block.timestamp >= releaseTime, “リリースするのはまだ早すぎます”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}

全プロセスは自律的であり、資金は特定の基準を満たすときにのみ解放されます。コードは部分的にプログラム可能ではなく、完全に自律的であることに注意してください。

デポジット機能を含むスマートコントラクトコードの他の要素も、含めたい機能に応じて完全に自律的にすることができます。たとえば、ユーザーがウォレット$100を超え、余剰金額が受益者に移動します。

“secured”の部分

どの要素が貸与するかに関して懸念していますセキュリティ契約について知りたいですか?コードのこの部分をチェックしてください:

constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, “Release time must be in the future”);depositor = msg.sender;beneficiary = _beneficiary;releaseTime = _releaseTime;}

releaseTime関数のタイムスタンプに対する設定された先行順位があることに注意してください。 何もランダムではなく、条件を満たさなければなりません。

「検証可能」部分

スマートコントラクトに関連するすべての取引は、別々のログアクティビティ要素によってチェーン内に記録されます。

event Deposited(address indexed _from, uint256 _value);

event Released(address indexed _to, uint256 _value);

emit Deposited(msg.sender, msg.value);

emit Released(beneficiary, amount);

スマートコントラクトの他の部分を読む

スマートコントラクトの特性を定義する要素を特定したので、ここには他の契約要素があります。これにより、ドリルをよりよく理解できるでしょう。

Pragma solidity ^0.8.0; – このスマートコントラクトを書くために必要なSolidityプログラミング言語のバージョンです。

// SPDX-License-Identifier: MIT – この識別子は、コードのリリースのライセンスを示しています。これを含めることをお勧めします。これにより、オープンソースであるかどうか、回避可能かどうかがわかります。

Contract TimeLock { – スマートコントラクトに名前を割り当てます。ラベルのようなものです。

デポジターの公開アドレス; – 契約にはデポジターと受益者が関わっているため、ここでデポジターの公開アドレスが言及されています。この変数はイーサリアムウォレットアドレスと公開されています。

受取可能な公開受益者のアドレス。これは、エスクローが資金を転送する受益者の公開アドレスです。また、これは読み取り可能であり、ブロックチェーンを活用したスマートコントラクトに透明性をもたらします。

Uint256 public releaseTime; – 時間結びつき契約なので、uint256が契約に時間ベースの変数を割り当てます。これが基になる期間で、資金のリリースが行われます。

Solidityでは、uint(符号なし整数)は整数ベースの値を割り当てる方法です。接尾辞256は、大きな数値の格納を表します。

スマートコントラクトを5年間書いてきましたが、今日初めて、Solidityのロゴが展開されたEthereumのロゴであることに気づきました🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden)2023年7月8日

あなたは読むことを考えることができますSolidityドキュメント構文、表現、およびその他のコード要素に精通する

その他の要素

constructor(address payable _beneficiary, uint256 _releaseTime) { – スマートコントラクトがデプロイされるときに呼び出される一度限りの特別な関数である「コンストラクタ」です。 これにより、契約が開始されます。 この時点で、以前に宣言したすべてのアドレス変数が呼び出されて初期化されていることに注意してください。

Receive() external payable { – これは、外部から契約アドレスに資金が移動するときに呼び出される特別な機能です。Externalは外部からの提案を示し、「Payable」は受け取るERC-20トークンの性質を定義します。

function release() public { – これは、契約アドレスから受益者へのERC-20トークンの移動を示すパブリック関数です。 この機能はreleaseTimeに依存します。

これらの要素は、私たちが議論した仮想のエスクロー契約の一部です。言語についてよりよく理解するために、Solidityのドキュメント全体を熟読してください。

スマートコントラクトを書く前に要素を把握してください:BeInCrypto

DAppsとスマートコントラクト:関係

今までに、既に書かれたスマートコントラクトを読んで理解するための先行スタートを持っているはずです。そして、私たちが議論したような多くのスマートコントラクトは、分散型アプリケーションのバックエンドを構成しています — ブロックチェーン標準モバイルアプリケーションのバージョン。

スマートコントラクトの特性のすべて、契約のセキュリティ、自律およびプログラム可能な実行、トランザクションの信頼性などは、分散型アプリケーションの開発中に簡単に実装されます。ですので、次にDAppに出くわしたときは、それがブロックチェーン上でホストされたスマートコントラクト駆動のバックエンドであることに注意してください。これにより、人間の介入なしに複数のタスクを開始できます。スマートコントラクトはDAppsの論理を形成します。

スマートコントラクトのためのブロックチェーン

イーサリアムでは、スマートコントラクトを開発することができることを知っています。これは、巨大なソフトウェアソリューションのようなものです。しかし、これが唯一のブロックチェーンプロトコルではありません。スマートコントラクト開発の世界に深く入りたい場合、他のブロックチェーンを見てみることをお勧めします。異なるブロックチェーンには、契約を立案する際に異なる用語があります。

しかし、まずは、議論しましょうイーサリアム—ほとんどのスマートコントラクト開発者にとっての行き先プラットフォーム。

イーサリアム

イーサリアムのスマートコントラクトは、Solidityプログラミング言語で書かれています。そして、このスマートコントラクト開発プラットフォームのトークンインターフェースはERC-20です。

以前に議論したエスクロー型スマートコントラクトに戻って、標準的なイーサリアムベースのスマートコントラクトがどのように書かれているかを確認できます。

Ethereumブロックチェーン上でERC-20トークンを発行することさえも、スマートコントラクトに依存した機能であり、私たちがスマートコントラクトを作成する際に詳しく説明する内容です。

ここでは、新しい暗号通貨BICの立ち上げを計画している場合の基本的なコード構造がどのように見えるかを示します。

これは仮想のシナリオとして考えてください。BIC暗号通貨の立ち上げとはまったく異なります。

プラグマの堅実さ ^0.8.0;インポート "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") { _mint(msg.sender, initialSupply);   }}

このコードのすべての要素については、後でスマートコントラクトを書くときに説明します。

他のブロックチェーン

Ethereumのように、Gate.ioのようなプラットフォームでもスマートコントラクトを作成することができます。ソラナ、RustとCardanoを使用し、HaskellのサブセットであるPlutusを使用します — 関数型プログラミング言語。

「カルドアナにはスマートコントラクトがあるの?」
冗談はあなたに向けられています、仲間。#CardanoADApic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28)2023年7月9日

Rustでのコード構造は次のようになります(ソラナ)のように見えます:

注:カウンターが増分されるシンプルな契約です。

anchor_lang::p relude::*;declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");#[program] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account;   greeting_account.カウンター= 0;   Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account;   greeting_account.カウンター += 1;   わかりました(())}}

知ってましたか?Rustは、Solanaベースのスマートコントラクトを作成するためのプログラミング言語です。アンカーは、使用されるスマートコントラクト開発フレームワークです。Rust を使用してスマートコントラクトを作成するには、開発者は Anchor フレームワークからモジュールをプルする必要があります — サンプルコードの最初の行 (anchor_lang を使用します。:prelude::*;) stands for.

SolanaのドキュメントRust固有のスマートコントラクト言語を理解するのに役立ちます。

同様に、CardanoはPlutusに続いて、Ink!言語を選択します。Polkadot, AlgorandのTEAL、NEOのC#など。対応するスマートコントラクトの作成を進める前に、チェーンごとのドキュメントを詳しく学ぶことをお勧めします。

なぜスマートコントラクトを読むことを学ぶ必要がありますか?

スマートコントラクトを書く能力は非常に認識されていますが、読む能力さえも多くの利点をもたらします:

  1. DeFiアプリに関連する自動化の複雑さについて学ぶ能力。
  2. 資産に関連する所有基準を分析するトークン化.
  3. Understanding how 分散型自治組織(DAOs)機能。
  4. 保険、コンテンツの収益化に関連するユースケース駆動ロジックの理解と実装投票システム、ロイヤリティ、およびその他の垂直線。

スマートコントラクトの書き方

スマートコントラクトの読み取りが完了したので、スマートコントラクトの記述に焦点を当てましょう。さらに深く掘り下げる前に、異なるブロックチェーンにはスマートコントラクト開発に関連する異なる標準と言語がある可能性があることを繰り返す必要があります。任意のブロックチェーンによって定義された標準に焦点を当てることが必要です。記述と契約の展開を開始するにあたり。

私たちの議論の大部分では、チェーンとしてEthereum、言語としてSolidityに焦点を当てることにします。

プログラミングの役割

スマートコントラクトのプログラミングは、開発サイクルの中で最も重要な部分です。そして、Ethereumや他のブロックチェーンでスマートコントラクトの開発に取り組むためには、Javascriptなどのブロックチェーン以外のプログラミング言語の経験があると良いでしょう。

異なるブロックチェーンとスマートコントラクトを記述する言語:BeInCrypto

スマートコントラクトをプログラムする能力は、同じロジックを実装し、セキュリティ要素を処理し、コードを最適化することができます。ガス手数料, 同じようにカスタマイズし、必要に応じて相互運用可能にもできます。

EVMとスマートコントラクト:土地の概要

Ethereumでスマートコントラクトを書こうとしている人は、Ethereum Virtual Machine(EVM)が何であり、スマートコントラクトとどのように連動するのかを理解する必要があります。まず、EVMはプログラムに孤立した制御された環境を提供するEthereumのコンポーネントです。これは、Ethereum上のすべての契約コードをホストするグローバルコンピューターと考えることができます。ノードイーサリアムネットワーク上でEVMが実行されます。

スマートコントラクト開発者を目指している場合、スマートコントラクトとEVMに関する知識が必要です。

Solidityという高水準言語でプログラムを書いたら、それをバイトコードにコンパイルする必要があります。これは機械が理解できる低水準形式です。このバイトコードはEthereumブロックチェーンに入り、そこに存在します。スマートコントラクトとやり取りする人は、契約のアドレスにトランザクションを送らなければなりません。

EVMをインストールしたすべてのノードはこのトランザクションを見ることができ、検証者が同意すれば、スマートコントラクトコードが実行されます。すべてのノードがトランザクションの可視性を持っているため、何も改ざんされず、コードは書かれた通りに実行されます。コードが実行されると、ブロックチェーンの状態が変化し、プロセスがエンドツーエンドで完全に透明になります。

誰でもスマートコントラクトを書くことができますか?

スマートコントラクトの作成には技術的なノウハウが必要です。しかし、それだけではありません。ターゲットとするブロックチェーンに関連する言語固有のニーズを徹底的に理解する必要もあります。相互運用性, その他にも、コードを書く際に避けるべきスマートコントラクトの脆弱性についてもかなり知っておく必要があります。最後に、契約テストと契約展開の知識も必須です。

すべてが圧倒的になる可能性があります。だから、ここには始めるためのクイックチートシートがあります。

  1. プラットフォームまたはチェーンを選択して作業を開始します。
  2. チェーンに関連するプログラミング言語、例えばEthereumのSolidityを学びます。
  3. Remixなどの統合開発環境などの開発ツールの使用方法について学びます。
  4. 最初に最初の契約を書いて、その後、テストネットを使用してテストを行います。
  5. コードの要素に満足したら、それをオンチェーンに展開できます。コントラクトをオンチェーンに展開すると、ガス手数料の形でコストがかかりますので、ご注意ください。

より良いスマートコントラクトを書くためのいくつかのヒントを紹介します。

🥧 FREI-PI
‼️ スマートコントラクトの開発者がこれを知る必要がある理由!
機能:
– 要件
–効果
– インタラクション
プロトコル
– インバリアント
これは、スマートコントラクトを構築する際に考えるべきパターンです。
ここにその理由があります 👇
— Patrick Collins (@PatrickAlphaC2023年7月6日

プログラミングに飛び込む

スマートコントラクト開発の技術的側面に入る時が来ました。SolanaやCardanoのようなチェーンでもスマートコントラクトを開発できますが、Ethereumが最も人気のあるスマートコントラクト開発プラットフォームであることは変わりません。

2022年だけで、10万以上の分散型アプリケーションがイーサリアムネットワークに登場しました。

なぜEthereum?

イーサリアムには開発者コミュニティがたくさんいます。 開発したものはすぐに注目されます。 さらに、そのネイティブ言語であるSolidityは、PythonやJavaScriptを使いこなせる個人にとって比較的簡単です。 最後に、イーサリアムのグローバルソフトウェアであるEVMは、シームレスな契約の実行を支援します。

もし大多数派であり、EthereumとSolidityを使用することを好む場合、スマートコントラクト開発を始める前に追跡する必要がある事柄のクイックリストが以下にあります。

  1. プラグマまたはコンパイラバージョン
  2. ラベリングのための契約定義
  3. データを格納するための状態変数
  4. EVMログ記録用イベント
  5. 特定の権利を特定の機関に付与する修飾子
  6. プレイ中の機能またはスマートコントラクトのアクティビティ
  7. 相互運用性のための継承
  8. if、else、forループなどの制御構造や、string、integerなどのデータ型の理解。

最初のスマートコントラクトの作成とデプロイ

チェーン上でのことがどのように行われるかを知ったところで、最初のスマートコントラクトの作成と展開にダイブしましょう。 “Hello World” が最初のステップであるにもかかわらず、100%アンロックされた供給量100万の仮想のBICトークンを発行するためのスマートコントラクトの作成から始めます。

基本

最初のステップは、最新バージョンのNode.jsとNPMまたはNode Package Managerをインストールすることです。これにより、開発ツールと開発用のローカル環境が整います。また、Node.jsとNPMを使用すると、スマートコントラクトのためのウェブフロントエンドを設定できます。

今、契約コードを書くためにIDEを設定する必要があります。そのために、Visual Studio Codeをすばやくインストールすることができます。または、混乱を避けることもできます。ホップAlchemy — ブロックチェーン開発プラットフォームに移動します。 Alchemyを使用すると、テストネットのETHを入手できます。これにより、GoerliテストネットやSepoliaテストネットにスマートコントラクトを展開する際のガス手数料がカバーされます。

Sepoliaは若いテストネットなので、ノードの展開に必要なディスク容量が少なくなりますので、ご注意ください。

今のところ、Goerliテストネットを続けます。なぜなら、より多くの展開されたアプリケーションがあります。

テストネットと偽のETHが準備できたので、特にスマートコントラクトの作成に移りましょう。以下は、100万の固定供給量を持つBICトークンを作成するためのコードスニペットです。

Note: 私たちはスマートコントラクトをMacOS上でローカルに展開する予定です。テストネットではなく、テストネットおよびメインネットでのスマートコントラクトの展開については、この議論の範囲を超えた別の部分があります。

書く手順と展開する手順

こちらは架空のトークンに関する単純なコードスニペットです。

pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 {    constructor() ERC20("BIC Token", "BIC") {        _mint(msg.sender, 1000000 * 10 ** decimals());    }}

構文を理解していれば、各コードコンポーネントの意味を知っているはずです。Openzepplinpart、これはERC-20スマートコントラクトのインポートに最適なライブラリです。このライブラリは、ERC-20トークンの基本的な運用基準を提供しています。

mint関数は、初期供給について述べており、それはスマートコントラクトアドレスまたはmsg.senderにデプロイされます。

これをローカルで設定してテストするには、3つのコンポーネントが必要です。

  1. Node.jsとNPM(すでに議論されています):スマートコントラクトを動かすエンジンのように機能します
  2. トリュフ: ツールボックスのように機能し、コード、スクリプト、契約の他の部分を整理するのに役立ちます
  3. Ganache: 仮想の、デバイス上のプレイグラウンドのように機能します。個人用ブロックチェーンのようなものと考えてください。

契約の実行とは何ですか?

スマートコントラクトの詳細なプロセスを経験した場合、契約の実行についてかなり理解していることが重要です。これは、ノードによってチェーン上でスマートコントラクトコードが実行されるプロセスです。

スマートコントラクトを透明で変更不可能にするのは、契約執行に関連する均一性です。今度は、契約執行に関連する段階的なプロセスを理解しましょう。

ステップ1

私たちが書いてきたコードスニペットはどこかで実行する必要があります。スマートコントラクトの場合、この実行場所はブロックチェーンです。チェーンのノードまたは参加メンバーが契約を実行するのを助けます。

ステップ2

ノードは、チェーン関連のインセンティブの代わりに、契約コードブロックの実行の責任を受け入れます。チェーン内で起こるすべてのコマンドやアクションは、スマートコントラクトによって主導されます。

ステップ3

すべてのスマートコントラクトには特定のアドレスがあります。契約を実行するために、取引はその契約アドレスに送信されます。各ノードがEVMを実行し、その後取引の信頼性を確認しやすくするために、スマートコントラクトコードのコピーを持っています。

ステップ4

スマートコントラクトに向けられた取引は、その後ブロックに含めるために選ばれたバリデータによって選ばれます。

ステップ5

トランザクションがプッシュスルーされ、正常に検証されると、ブロックチェーンの一部になります。その後、トランザクションに関連付けられたスマートコントラクト関数が呼び出され、ブロックチェーンノード間で実行されます。

ステップ6

すべてのノードがスマートコントラクトを実行すると、同じ入力セットに対して同じ出力が得られる確定的な結論に達する必要があり、契約の性質は完全に信頼できず透明です。

注意: コードの実行に関するエラーやガス手数料に関連する問題がある場合、取引が元に戻されます。つまり、特定のスマートコントラクトコードに基づく取引が存在しなくなります。これが起こるのは、Gate.ioのプロダクト名に関するゲートと同じです。フラッシュローン特定の規範に従うことができないと、取引全体が逆転し、まるで資金が最初から動いていなかったかのような印象を与える。

スマートコントラクトに関連するすべての状態変更は、ブロックチェーン内に記録され、同じ不変の一部となります。

スマートコントラクトの開発とベストプラクティス

スマートコントラクトについてかなり理解していることを考えると、契約開発を始めるためのいくつかのポイントがここにあります。

  1. 契約を書く際には、OpenZeppelinのような信頼できるライブラリに頼ることが望ましい。これにより、望ましいコードの最適化とセキュリティ基準を遵守することができます。
  2. 契約をモジュール化し、よりシンプルに保つことで、テストやレビューをしやすくすることが目的です。
  3. 契約固有のアクセス制御を実装するのは良い考えです。これは、特定の個人やエンティティだけが契約の重要な特性を変更できるコードビットを宣言することを意味します。アクセス制御は、スマートコントラクトを安全に保つのに役立ちます。
  4. 契約を書く際は、常にエッジケースや例外の処理を考慮してください — 同時に複数のテストを書きながら。

コードの持続可能性に気を配る

上記の各プラクティスは、コードの最適化とセキュリティ固有の実装に役立ちます。ただし、コードの持続可能性に対処するために、従い、実装する必要がある契約固有のプラクティスがいくつかあります。これは、コントラクトコードを軽量で使いやすい状態に保ち、同じノードを実行および実行するすべてのノードが、同じノードに多くの計算能力を費やす必要がないようにすることを目的としています。

  1. データセットを小さくして効率的にストレージを処理します。たとえば、契約書を書く際に、uint256の代わりに操作値としてuint8を使用します。
  2. 契約を書く際には、複数の操作を1つに組み合わせることでコードを最適化することが望ましいとされています。私たちは「スマートコントラクトの作成」に関する詳細な記事でこれについて詳しく見ていきます。
  3. スマートコントラクトの実行に関して遅延評価を使用するのは良い考えです。これにより、必要な時にのみ関数を実行する必要があり、スマートコントラクトアドレスに何かがプッシュされるたびに実行する必要はありません。
  4. 最後に、オフチェーン計算に頼ることも、持続可能性に焦点を当てる良い方法です。これにより、必要なガス料金が削減され、契約の実行がスピードアップすることさえできます。

スマートコントラクトを書いたり開発する際に最善の手法に従っていても、それをメインネットにプッシュする際には契約のセキュリティの脆弱性に注意する必要があります。

スマートコントラクトの監査方法は?

メインネットに存在するすべてのスマートコントラクトは、コードのパフォーマンス、セキュリティ、およびその他の特性について評価する必要があります。これが監査の場面であり、厳格な契約テストプロセスであり、潜在的な契約の脆弱性や弱点を明らかにすることができます。

こちらはすぐに始めるための簡単な監査チェックリストです:
素晴らしいスマートコントラクト監査チェックリスト😈
次回の監査で必ずチェックしてください✅
リツイートしていただけると嬉しいです。知識を広めましょう🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv)2023年7月7日

読書、執筆、監査の関係:なぜスマートコントラクトを監査するのか?

スマートコントラクトの読み書きは、知的なコードを開発する際に絡み合っていますが、監査は特別な位置を占めており、まずロジックをチェックすることを含んでいます。ブロックチェーンベースのコード実行において、すべてが不変であり、何かが破滅的な結果をもたらす可能性があり、契約の実行には取り返しのつかない結果をもたらすことがあります。これが、契約コードやその他の側面を監査を通じて徹底的にチェックする必要がある理由です。

契約の脆弱性と修正

のホストが存在する可能性がありますコントラクトの脆弱性詳細なスマートコントラクト監査で特定できる問題があります。これには再入攻撃、オーバーフローやアンダーフローのチェック、アクセス制御に関連する問題などが含まれます。問題の正確な性質が判明したら、監査人は同じ問題を修正するためのベストプラクティスさえ提案することができます。

侵害はケーススタディや学びに影響を与えます

まだスマートコントラクト監査がどのように役立つかよくわからない?まあ、悪名高いことに戻ってみましょうDAO2016年のハッキングは、再入可能性の問題を悪用し、ほぼ360万ETHの損失を引き起こしました。同様に、2017年にはParityウォレット契約のハッキングがあり、ほぼ50万ETHの損失につながりました。これらの問題は適切な監査セットで回避することができました。


DAOハックフローチャート:BeInCrypto

スマートコントラクトの監査戦略

スマートコントラクトを監査するためのさまざまな戦略があります。よく知られているもののいくつかには、以下が含まれています:

監査ツール

これらのツールは最初の防衛手段として機能し、一般的な脆弱性を特定するのに最適です。より人気のあるツールには、Securify、Mythrilなどがあります。これらのツールは、コードの静的解析を実行し、侵害パターンを検出し、セキュリティに特化したスタートを切るのに役立ちます。

スマートコントラクトを監査するツール:BeInCrypto

コードレビュー

ここで、手動のコードレビュアが登場し、コードベースを精査し、必要に応じて複雑な脆弱性を特定します。手動レビューは、ビジネスロジック、コンテキスト、および使用パターンに対処するのに役立ちます。

マニュアルコードレビューが脅威を特定するのにどのように役立つかを説明します。

ジュニアオーディターのためのちょっとしたトリビア!
バグを見つけたら、リツイートしてください!pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)2023年7月8日

自動スキャン

SnykやGuardRailsなどのツールは、自動契約スキャンを支援し、コードが更新されるたびに呼び出されるセキュリティ実装をサポートします。この種の監査は、コードに加えられた新しい変更が安全で侵害的でないことを確認します。

形式検証

これは、コードのビジネス ロジックのチェックのみに依存する複雑なプロセスです。形式検証は、実際には構文を検証するためのものではなく、コードが意図したとおりに実行されるかどうかを確認するためのロジックのみを目的としていることに注意してください。

上記の戦略に加えて、スマートコントラクトの監査は、ピアレビュー、バグバウンティプログラム、Solidity Coverageなどのツールを介したテストカバレッジを使用して開始し、有効性を最大化することもできます。

スマートコントラクトを監査する簡単な方法:BeInCrypto

コードを正しくレビューする方法は?

スマートコントラクト監査に初めて取り組む場合、コードを広く分析し問題を特定する方法は大きく2つあります。これには、

静的解析

この種のコード解析は、与えられたコーディング基準と規則に従って、基本的なセキュリティ脆弱性、コーディングエラー、その他の問題を特定するのに役立ちます。外部ソースへの未検査の呼び出し、整数オーバーフローなどの脅威は、静的解析を使用して強調表示できます。静的解析の最も良い点は、コードを実行する必要がないことです。

動的解析

この監査アプローチは、コードがEVMと一致しているかどうかをテストします。コードのみをチェックするのではなく、動的分析はスマートコントラクトの応答を幅広い入力で相互チェックします。動的分析は、不整合なガス消費や誤った契約ロジックなどの問題を特定できます。Ganacheのような個人用ブロックチェーン環境は、開発者がトランザクションを行ったり、コマンドを実行したり、契約を活用したりできる動的分析プラットフォームとして機能します。

実際のコードのテスト

ここには、引き出し機能を持つ資金蓄積として機能するスマートコントラクトスニペットがあります。

pragma solidity ^0.6.1;contract VulnerableContract {    mapping(address => uint256) public balances;    function deposit() public payable {        balances[msg.sender] += msg.value;    }    function withdraw(uint256 _amount) public {        require(balances[msg.sender] >= _amount, "Insufficient balance.");        (bool success, ) = msg.sender.call{value: _amount}("");        require(success, "Transfer failed.");        balances[msg.sender] -= _amount;    }}

コードを注意深く見ると、重要な脆弱性があります:

前回のケースでは、「引き出し」機能は、資金を受け取るユーザーが悪意のあるスマートコントラクトであっても、再度呼び出すことができます。したがって、最後の関数または残高の更新が行われる前に、再入攻撃が開始され、追加の資金が転送される可能性があります。経験豊富な監査人は、この種の脆弱性を特定します。

同じコードの修正版はこちらです:

function withdraw(uint256 _amount) public {    require(balances[msg.sender] >= _amount, "残高が不足しています。");    balances[msg.sender] -= _amount;    (bool success, ) = msg.sender.call{value: _amount}("");
require(success, "転送に失敗しました。");}

まず、残高更新機能が呼び出され、その後にユーザーへの最初の移動が行われるかを確認します。この操作順序の変更が契約を修正する要因です。

イーサリアム以外のチェーンとコードレビュー

分散型アプリケーションとスマートコントラクトの世界は、イーサリアムを超えて進化しています。イーサリアムエコシステム内でのアクティビティの大部分は依然として行われていますが、Cardano、Solanaなどの他のチェーンもスマートコントラクトをサポートし、異なる監査基準が必要です。

なぜすべてのプラットフォームがユニークなのですか?

異なるブロックチェーンは異なるプログラミング言語を使用しています。コードの意味論、構文、およびプロパティは異なり、スマートコントラクトは異なる記述や監査の実践に対応しています。たとえば、イーサリアムはSolidityを使用しています。Polkadot特定の監査基準に反応するInkとRustを使用しています。

イーサリアム以外へ行くためのツール

今後、イーサリアムを超えたい場合、いくつかの専門の監査ツールを利用できます。たとえば、Cardanoでは、形式的検証と監査のためのMarloweスイートがあります。Solanaの場合、Rust固有のlibfuzzerとcargo-fuzzは、監査と契約テストに適しています。マルチチェーンの監査人は、これらの概念に精通している必要があり、契約の脆弱性を排除する必要があります。

スマートコントラクト監査の異なる種類は何ですか?

再度強調しますが、スマートコントラクトの監査を手動、自動、ハイブリッドの3つのタイプに分類することができます。複雑な契約や深いビジネスロジックを持つ契約に対しては、ハイブリッド監査戦略が最も包括的であるため、人々はそれを好む傾向があります。

監査を外部委託する

コーディング知識がほとんどない組織や個人は、しばしば執筆や監査の要件を評判のある企業に外部委託します。監査に関しては、適切な企業を選択することがさらに重要になります。AIツールlikeChatGPTスマートコントラクトのコードを書くのに役立ちますが、同じものをチェックするには手動で洞察が必要です。

また、監査業務を外部委託する際に注意すべき要因についても説明します:

適切な企業を選ぶ

適切な外部委託企業を絞り込む前に、過去の監査をチェックし、経験を評価し、さらに主要チームメンバーに焦点を当てることが重要です。

責任、コスト、および経費の理解

採用する前に、監査に関連するコストやサービスに注意してください。提供されるサービスの性質をまず理解することが不可欠です。たとえば、問題の特定、問題の解決などです。最初の修正ラインの実装後に再監査も提供されているかどうかも確認する必要があります。スマートコントラクト監査のコストはサービスによって異なる場合があり、そのため進行する前にすべての要件と提供を追跡する必要があります。

最高のスマートコントラクト監査の実践

自分で企業をやめてスマートコントラクトを監査したい場合は、心に留めておくべきベストな戦略と実践があります。

  1. 常に構文とロジックを含む徹底的なコードレビューに焦点を当てる
  2. 一般的な脆弱性をSlither、MythXなどのツールを使って見つけることから始めます
  3. 既知の脆弱性を見つけ、事前にチェックするために、スマートコントラクトの脆弱性分類登録またはSWCを通じてサーフィンしてください。
  4. 様々なシナリオでコードをストレステストするために、統合テスト、単体テストなどを含むスマートコントラクトを徹底的にテストします。
  5. 再入攻撃の可能性を特にチェックすることが重要です。同じものに対抗する最良の方法は、ハッカーが最初のスマートコントラクト関数の前に呼び出すことができる再帰呼び出しをチェックすることです。
  6. 外部呼び出しにつながる機能に焦点を当てます。この点でのエラーは状態と制御フローを変更する可能性があり、望ましくありません。
  7. 常にガス使用量を指すコードビットに注意を払ってください。契約が過大な費用がかかる対話を開始しないようにしてください。

スマートコントラクトの開発とAI:未来

人工知能は確かにスマートコントラクトの作成を容易にしています。しかし、AIの革新に関係なく、最良の方法でスマートコントラクトを監査する能力には依然として人間の介入が必要です。したがって、次のweb3製品を構築する予定でスマートコントラクトや分散型アプリケーションを重点的に取り上げる場合、スマートコントラクトのための最良の監査リソースに重点を置くことは非常に重要です。暗号通貨のハッキングや侵害が日々表面化し、ハッカーが新たな戦略を立てて侵入しようとしている中で、契約を完璧に監査することは確かにより重要な現代のスキルの1つです。

免責事項:

  1. この記事は[から転載されていますBeincrypto], そして著作権は元の著者[Ananda Banerjee]に帰属します。転載に異議がある場合は、Gate Learnチームに連絡し、チームは関連手続きに応じて迅速に処理します。
  2. 免責事項:この記事で表明された見解や意見は、著者の個人的な見解のみを表しており、投資アドバイスを構成するものではありません。
  3. Gate Learnチームによって他の言語バージョンの記事が翻訳されています。Gate.ioを言及せずに、翻訳された記事をコピー、拡散、または盗用することは許可されていません。

مشاركة

スマートコントラクトの理解:読む、書く、監査

上級11/26/2023, 12:41:25 PM
この記事では、スマートコントラクトのプログラミング技術について、読み書きおよび監査のためのガイドラインを含めて説明しています。スマートコントラクトの構造やコードブロックを理解することは、Solidityや他の言語でそれらを書くための第一歩です。スマートコントラクトは分散型ファイナンス(DeFi)や分散型アプリケーション(DApps)に中心的な役割を果たしているため、そのセキュリティと完璧さを確保することは重要であり、スマートコントラクトの監査が重要な役割を果たしています。

スマートコントラクトの読み取り

スマートコントラクトは、特定の条件が満たされたときにのみ実行されるプログラム可能なコードです。これらは法的に拘束力のある現実世界の契約と同義です。ただし、この場合、コードが法律です。スマートコントラクトはブロックチェーンに存在するため、変更できません。他の特性の中で、この変更不能性がスマートコントラクトを特別なものにしています。

スマートコントラクトの理解:基本と目的

スマートコントラクトブロックチェーン固有の取引を自動化するために意図されています。 条件に応じた契約であるため、中間業者は必要ありません。 スマートコントラクトを有用にする要因の1つは、金融サービス、サプライチェーン管理など、幅広いユースケースにわたる互換性です。 そして、1度にプログラムされる伝統的なコードとは異なり、スマートコントラクトには非常に安全で時間をかけた戦略が必要です。

スマートコントラクトがブロックチェーン技術とどのように整合しているか:BeInCrypto

「“web3”という言葉は、ウェブのゆるい、セキュリティの薄いプログラミング習慣を示唆しています。暗号通貨やスマートコントラクトがウェブページのようにプログラムされると、失敗する運命にあります。持続的に成功するブロックチェーンとそのアプリは、はるかに安全で注意深く、ゆっくりとしたプログラミング手法に基づいています。」

ニック・サザボ、暗号学者兼コンピュータ科学者:Twitter

スマートコントラクトは、ブロックチェーン固有のトークン、例えばイーサリアムブロックチェーン用のERC-20と連携して、取引を促進し移動させることができます。コード、条件、コストが関係しているため、それらを読み込み、書き込み、監査する際には注意が必要です。

スマートコントラクトとその重要性

スマートコントラクトの真の意義は、その性質と位置付けに関わります。あるシナリオにおいて、例えば、人Aがサービスを完了したときに、人Bに資金を移動させる場合、スマートコントラクトのコピーが保存され、ブロックチェーンノードによって実行されます。スマートコントラクトは、チェーン内の契約コードとして保存されます。この多経路検証は、ブロックチェーン中心の特性であり、セキュリティを確保します。

さらに、連続または同期スマートコントラクトが存在します。非同期スマートコントラクトタスクが並行して実行されるため、スマートコントラクトの種類や目的によって、その記述方法、読み方、さらには監査方法が決まります。

従来の契約、不動産権利証書、遺言などは私法であり、政治家や政府の官僚ではなく「私人によって起草される。」スマートコントラクトは、そのような分散型の立法の新しい形態です。https://t.co/EU2Y28FznK
— Nick Szabo (@NickSzabo4)2018年3月15日

標準的なスマートコントラクトで管理される流動性プールを考慮しましょう。

トークンのプールが取引に使用されると想像してください。そして、成功した取引が行われるたびに、総取引額の0.3%がその取引を可能にした流動性提供者に送られるか、その取引可能な資産の流動性を追加しました。取引シナリオ、取引手数料、および非遵守および取引失敗の条件すべてがコード化されています。スマートコントラクト、チェーン内に契約コードとして格納されています。

スマートコントラクトの特性

我々は、それらの特性を認識していない場合、契約の読解、執筆、監査に深く入り込むことはできません。ここには認識しておくべき標準的なスマートコントラクトの特性があります。

標準的なスマートコントラクトのいくつかの特徴:BeInCrypto

プログラマブル契約

スマートコントラクトは単なるコードです。スマートコントラクトを作成して、特定の条件に基づいてコマンドやシナリオを実行できます。これが、スマートコントラクトの開発者とプログラマーが現在需要がある理由です。DeFispace already relies on スマートコントラクト to process complex instances like handling trading fees across liquidity pools, maintaining APY比率、およびその他。

信頼なし

ブロックチェーン上に存在するスマートコントラクトは、人間の介入を排除します。これにより、完全に信頼できなくなります。たとえば、特定のDeFiスマートコントラクトによって管理されるプロトコルは、価値が閾値以下になったら資産を清算することに同意し、人間の介入はできず、またすべきではありません。コードは支払い、パフォーマンス、管理、およびルールの執行を処理し、全体の空間を完全に信頼できるものにします。

自律

前述したように、スマートコントラクトには自己実行型の命令セットがロードされています。コーディングの観点では、これはボイラープレート内に反復とループを構築することを意味します。これにより、支払い、引き出し、入金、スラッシングによるバリデーターへのペナルティ、その他のいくつかのタスクが自律的に処理されます。

セキュリティが確保されました

そして最後に、スマートコントラクトは暗号化を使用して保護されているため、それを破ることは非常に困難です。組み込まれた脆弱性がない場合、スマートコントラクトを迂回することは、そのブロックチェーン全体の前でオープンにそれを破ろうとすることを意味します。

検証可能

スマートコントラクトを介して処理される取引は自己検証可能です。これは、実行が証拠であるため、取引が最初に行われたことがわかります。人間の要素は関与されていないため、自己検証可能なメカニズムは、レガシーバンキングシステムを管理する従来の契約に比べてスマートコントラクトに優位性をもたらします。

次にスマートコントラクトを読む予定がある場合は、ボイラープレートまたは文書にすべての特性が含まれていることを確認してください。


スマートコントラクトの簡略化バージョン:Reddit

特性に基づいてスマートコントラクトを読む

ここには、エスクローアカウントを表すシンプルでスマートな契約があります。ユーザーはエスクローに資金を預け入れ、それを一定期間後に受取人に移します。

/ SPDX-License-Identifier: MITpragma solidity ^0.8.0;// 基本的なスマートコントラクトのボイラープレートcontract SimpleTrustlessEscrow {// ステート変数address public depositor; // イーサを預託するアカウントaddress payable public beneficiary; // イーサを受け取るアカウントuint256 public releaseTime; // イーサを解放するためのタイムスタンプ// コントラクトのアクティビティを検証するためのイベントevent Deposited(address indexed _from, uint256 _value);event Released(address indexed _to, uint256 _value);// コントラクトのコンストラクタはスマートコントラクトを初期化するconstructor(address payable _beneficiary, uint256 _releaseTime) {    require(_releaseTime > block.timestamp, “Release time must be in the future”);    // 安全かつ信頼できる: コントラクトは預金者と受益者を結びつける    depositor = msg.sender;    beneficiary = _beneficiary;    releaseTime = _releaseTime;}// 預金機能 – 自律実行(フォールバック関数)receive() external payable {    emit Deposited(msg.sender, msg.value);}// イーサを受益者に解放する機能function release() public {    // プログラム可能: releaseTimeを過ぎてから実行される    require(block.timestamp >= releaseTime, “Too early to release”);    // 自律的: 条件に基づいて自動的に実行される    uint256 amount = address(this).balance;    beneficiary.transfer(amount);    emit Released(beneficiary, amount);}}

このスマートコントラクトを詳細に解読し読み取ることに取り掛かる前に、まず同じものが言及されている契約特性に適合しているかどうかを確認しましょう。

「プログラム可能」部分

このコードの部分について、契約書を注意深く見てください。

require(block.timestamp >= releaseTime, “リリースが早すぎます”);

uint256 amount = address(this).balance;

beneficiary.transfer(amount);

資金は、特定のreleaseTime条件が満たされた場合にのみリリースされ、これらのプログラム可能な契約が作成されます。

「信頼できない」部分

上記から素早いコードスニペットをご覧ください:

depositor = msg.sender;

beneficiary = _beneficiary;

releaseTime = _releaseTime;

契約では、預金者から資金を受け取る人まで、すべての人がコードによって拘束されています。資金を送金する機能はすべてreleaseTimeというコードベースのパラメーターによって拘束されているため、誰もが他者とやり取りする必要はなく、信頼する必要もありません。

「自律的」の部分

ここはコードの「資金の解放」部分です:

function release() public {require(block.timestamp >= releaseTime, “リリースするのはまだ早すぎます”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}

全プロセスは自律的であり、資金は特定の基準を満たすときにのみ解放されます。コードは部分的にプログラム可能ではなく、完全に自律的であることに注意してください。

デポジット機能を含むスマートコントラクトコードの他の要素も、含めたい機能に応じて完全に自律的にすることができます。たとえば、ユーザーがウォレット$100を超え、余剰金額が受益者に移動します。

“secured”の部分

どの要素が貸与するかに関して懸念していますセキュリティ契約について知りたいですか?コードのこの部分をチェックしてください:

constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, “Release time must be in the future”);depositor = msg.sender;beneficiary = _beneficiary;releaseTime = _releaseTime;}

releaseTime関数のタイムスタンプに対する設定された先行順位があることに注意してください。 何もランダムではなく、条件を満たさなければなりません。

「検証可能」部分

スマートコントラクトに関連するすべての取引は、別々のログアクティビティ要素によってチェーン内に記録されます。

event Deposited(address indexed _from, uint256 _value);

event Released(address indexed _to, uint256 _value);

emit Deposited(msg.sender, msg.value);

emit Released(beneficiary, amount);

スマートコントラクトの他の部分を読む

スマートコントラクトの特性を定義する要素を特定したので、ここには他の契約要素があります。これにより、ドリルをよりよく理解できるでしょう。

Pragma solidity ^0.8.0; – このスマートコントラクトを書くために必要なSolidityプログラミング言語のバージョンです。

// SPDX-License-Identifier: MIT – この識別子は、コードのリリースのライセンスを示しています。これを含めることをお勧めします。これにより、オープンソースであるかどうか、回避可能かどうかがわかります。

Contract TimeLock { – スマートコントラクトに名前を割り当てます。ラベルのようなものです。

デポジターの公開アドレス; – 契約にはデポジターと受益者が関わっているため、ここでデポジターの公開アドレスが言及されています。この変数はイーサリアムウォレットアドレスと公開されています。

受取可能な公開受益者のアドレス。これは、エスクローが資金を転送する受益者の公開アドレスです。また、これは読み取り可能であり、ブロックチェーンを活用したスマートコントラクトに透明性をもたらします。

Uint256 public releaseTime; – 時間結びつき契約なので、uint256が契約に時間ベースの変数を割り当てます。これが基になる期間で、資金のリリースが行われます。

Solidityでは、uint(符号なし整数)は整数ベースの値を割り当てる方法です。接尾辞256は、大きな数値の格納を表します。

スマートコントラクトを5年間書いてきましたが、今日初めて、Solidityのロゴが展開されたEthereumのロゴであることに気づきました🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden)2023年7月8日

あなたは読むことを考えることができますSolidityドキュメント構文、表現、およびその他のコード要素に精通する

その他の要素

constructor(address payable _beneficiary, uint256 _releaseTime) { – スマートコントラクトがデプロイされるときに呼び出される一度限りの特別な関数である「コンストラクタ」です。 これにより、契約が開始されます。 この時点で、以前に宣言したすべてのアドレス変数が呼び出されて初期化されていることに注意してください。

Receive() external payable { – これは、外部から契約アドレスに資金が移動するときに呼び出される特別な機能です。Externalは外部からの提案を示し、「Payable」は受け取るERC-20トークンの性質を定義します。

function release() public { – これは、契約アドレスから受益者へのERC-20トークンの移動を示すパブリック関数です。 この機能はreleaseTimeに依存します。

これらの要素は、私たちが議論した仮想のエスクロー契約の一部です。言語についてよりよく理解するために、Solidityのドキュメント全体を熟読してください。

スマートコントラクトを書く前に要素を把握してください:BeInCrypto

DAppsとスマートコントラクト:関係

今までに、既に書かれたスマートコントラクトを読んで理解するための先行スタートを持っているはずです。そして、私たちが議論したような多くのスマートコントラクトは、分散型アプリケーションのバックエンドを構成しています — ブロックチェーン標準モバイルアプリケーションのバージョン。

スマートコントラクトの特性のすべて、契約のセキュリティ、自律およびプログラム可能な実行、トランザクションの信頼性などは、分散型アプリケーションの開発中に簡単に実装されます。ですので、次にDAppに出くわしたときは、それがブロックチェーン上でホストされたスマートコントラクト駆動のバックエンドであることに注意してください。これにより、人間の介入なしに複数のタスクを開始できます。スマートコントラクトはDAppsの論理を形成します。

スマートコントラクトのためのブロックチェーン

イーサリアムでは、スマートコントラクトを開発することができることを知っています。これは、巨大なソフトウェアソリューションのようなものです。しかし、これが唯一のブロックチェーンプロトコルではありません。スマートコントラクト開発の世界に深く入りたい場合、他のブロックチェーンを見てみることをお勧めします。異なるブロックチェーンには、契約を立案する際に異なる用語があります。

しかし、まずは、議論しましょうイーサリアム—ほとんどのスマートコントラクト開発者にとっての行き先プラットフォーム。

イーサリアム

イーサリアムのスマートコントラクトは、Solidityプログラミング言語で書かれています。そして、このスマートコントラクト開発プラットフォームのトークンインターフェースはERC-20です。

以前に議論したエスクロー型スマートコントラクトに戻って、標準的なイーサリアムベースのスマートコントラクトがどのように書かれているかを確認できます。

Ethereumブロックチェーン上でERC-20トークンを発行することさえも、スマートコントラクトに依存した機能であり、私たちがスマートコントラクトを作成する際に詳しく説明する内容です。

ここでは、新しい暗号通貨BICの立ち上げを計画している場合の基本的なコード構造がどのように見えるかを示します。

これは仮想のシナリオとして考えてください。BIC暗号通貨の立ち上げとはまったく異なります。

プラグマの堅実さ ^0.8.0;インポート "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") { _mint(msg.sender, initialSupply);   }}

このコードのすべての要素については、後でスマートコントラクトを書くときに説明します。

他のブロックチェーン

Ethereumのように、Gate.ioのようなプラットフォームでもスマートコントラクトを作成することができます。ソラナ、RustとCardanoを使用し、HaskellのサブセットであるPlutusを使用します — 関数型プログラミング言語。

「カルドアナにはスマートコントラクトがあるの?」
冗談はあなたに向けられています、仲間。#CardanoADApic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28)2023年7月9日

Rustでのコード構造は次のようになります(ソラナ)のように見えます:

注:カウンターが増分されるシンプルな契約です。

anchor_lang::p relude::*;declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");#[program] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account;   greeting_account.カウンター= 0;   Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account;   greeting_account.カウンター += 1;   わかりました(())}}

知ってましたか?Rustは、Solanaベースのスマートコントラクトを作成するためのプログラミング言語です。アンカーは、使用されるスマートコントラクト開発フレームワークです。Rust を使用してスマートコントラクトを作成するには、開発者は Anchor フレームワークからモジュールをプルする必要があります — サンプルコードの最初の行 (anchor_lang を使用します。:prelude::*;) stands for.

SolanaのドキュメントRust固有のスマートコントラクト言語を理解するのに役立ちます。

同様に、CardanoはPlutusに続いて、Ink!言語を選択します。Polkadot, AlgorandのTEAL、NEOのC#など。対応するスマートコントラクトの作成を進める前に、チェーンごとのドキュメントを詳しく学ぶことをお勧めします。

なぜスマートコントラクトを読むことを学ぶ必要がありますか?

スマートコントラクトを書く能力は非常に認識されていますが、読む能力さえも多くの利点をもたらします:

  1. DeFiアプリに関連する自動化の複雑さについて学ぶ能力。
  2. 資産に関連する所有基準を分析するトークン化.
  3. Understanding how 分散型自治組織(DAOs)機能。
  4. 保険、コンテンツの収益化に関連するユースケース駆動ロジックの理解と実装投票システム、ロイヤリティ、およびその他の垂直線。

スマートコントラクトの書き方

スマートコントラクトの読み取りが完了したので、スマートコントラクトの記述に焦点を当てましょう。さらに深く掘り下げる前に、異なるブロックチェーンにはスマートコントラクト開発に関連する異なる標準と言語がある可能性があることを繰り返す必要があります。任意のブロックチェーンによって定義された標準に焦点を当てることが必要です。記述と契約の展開を開始するにあたり。

私たちの議論の大部分では、チェーンとしてEthereum、言語としてSolidityに焦点を当てることにします。

プログラミングの役割

スマートコントラクトのプログラミングは、開発サイクルの中で最も重要な部分です。そして、Ethereumや他のブロックチェーンでスマートコントラクトの開発に取り組むためには、Javascriptなどのブロックチェーン以外のプログラミング言語の経験があると良いでしょう。

異なるブロックチェーンとスマートコントラクトを記述する言語:BeInCrypto

スマートコントラクトをプログラムする能力は、同じロジックを実装し、セキュリティ要素を処理し、コードを最適化することができます。ガス手数料, 同じようにカスタマイズし、必要に応じて相互運用可能にもできます。

EVMとスマートコントラクト:土地の概要

Ethereumでスマートコントラクトを書こうとしている人は、Ethereum Virtual Machine(EVM)が何であり、スマートコントラクトとどのように連動するのかを理解する必要があります。まず、EVMはプログラムに孤立した制御された環境を提供するEthereumのコンポーネントです。これは、Ethereum上のすべての契約コードをホストするグローバルコンピューターと考えることができます。ノードイーサリアムネットワーク上でEVMが実行されます。

スマートコントラクト開発者を目指している場合、スマートコントラクトとEVMに関する知識が必要です。

Solidityという高水準言語でプログラムを書いたら、それをバイトコードにコンパイルする必要があります。これは機械が理解できる低水準形式です。このバイトコードはEthereumブロックチェーンに入り、そこに存在します。スマートコントラクトとやり取りする人は、契約のアドレスにトランザクションを送らなければなりません。

EVMをインストールしたすべてのノードはこのトランザクションを見ることができ、検証者が同意すれば、スマートコントラクトコードが実行されます。すべてのノードがトランザクションの可視性を持っているため、何も改ざんされず、コードは書かれた通りに実行されます。コードが実行されると、ブロックチェーンの状態が変化し、プロセスがエンドツーエンドで完全に透明になります。

誰でもスマートコントラクトを書くことができますか?

スマートコントラクトの作成には技術的なノウハウが必要です。しかし、それだけではありません。ターゲットとするブロックチェーンに関連する言語固有のニーズを徹底的に理解する必要もあります。相互運用性, その他にも、コードを書く際に避けるべきスマートコントラクトの脆弱性についてもかなり知っておく必要があります。最後に、契約テストと契約展開の知識も必須です。

すべてが圧倒的になる可能性があります。だから、ここには始めるためのクイックチートシートがあります。

  1. プラットフォームまたはチェーンを選択して作業を開始します。
  2. チェーンに関連するプログラミング言語、例えばEthereumのSolidityを学びます。
  3. Remixなどの統合開発環境などの開発ツールの使用方法について学びます。
  4. 最初に最初の契約を書いて、その後、テストネットを使用してテストを行います。
  5. コードの要素に満足したら、それをオンチェーンに展開できます。コントラクトをオンチェーンに展開すると、ガス手数料の形でコストがかかりますので、ご注意ください。

より良いスマートコントラクトを書くためのいくつかのヒントを紹介します。

🥧 FREI-PI
‼️ スマートコントラクトの開発者がこれを知る必要がある理由!
機能:
– 要件
–効果
– インタラクション
プロトコル
– インバリアント
これは、スマートコントラクトを構築する際に考えるべきパターンです。
ここにその理由があります 👇
— Patrick Collins (@PatrickAlphaC2023年7月6日

プログラミングに飛び込む

スマートコントラクト開発の技術的側面に入る時が来ました。SolanaやCardanoのようなチェーンでもスマートコントラクトを開発できますが、Ethereumが最も人気のあるスマートコントラクト開発プラットフォームであることは変わりません。

2022年だけで、10万以上の分散型アプリケーションがイーサリアムネットワークに登場しました。

なぜEthereum?

イーサリアムには開発者コミュニティがたくさんいます。 開発したものはすぐに注目されます。 さらに、そのネイティブ言語であるSolidityは、PythonやJavaScriptを使いこなせる個人にとって比較的簡単です。 最後に、イーサリアムのグローバルソフトウェアであるEVMは、シームレスな契約の実行を支援します。

もし大多数派であり、EthereumとSolidityを使用することを好む場合、スマートコントラクト開発を始める前に追跡する必要がある事柄のクイックリストが以下にあります。

  1. プラグマまたはコンパイラバージョン
  2. ラベリングのための契約定義
  3. データを格納するための状態変数
  4. EVMログ記録用イベント
  5. 特定の権利を特定の機関に付与する修飾子
  6. プレイ中の機能またはスマートコントラクトのアクティビティ
  7. 相互運用性のための継承
  8. if、else、forループなどの制御構造や、string、integerなどのデータ型の理解。

最初のスマートコントラクトの作成とデプロイ

チェーン上でのことがどのように行われるかを知ったところで、最初のスマートコントラクトの作成と展開にダイブしましょう。 “Hello World” が最初のステップであるにもかかわらず、100%アンロックされた供給量100万の仮想のBICトークンを発行するためのスマートコントラクトの作成から始めます。

基本

最初のステップは、最新バージョンのNode.jsとNPMまたはNode Package Managerをインストールすることです。これにより、開発ツールと開発用のローカル環境が整います。また、Node.jsとNPMを使用すると、スマートコントラクトのためのウェブフロントエンドを設定できます。

今、契約コードを書くためにIDEを設定する必要があります。そのために、Visual Studio Codeをすばやくインストールすることができます。または、混乱を避けることもできます。ホップAlchemy — ブロックチェーン開発プラットフォームに移動します。 Alchemyを使用すると、テストネットのETHを入手できます。これにより、GoerliテストネットやSepoliaテストネットにスマートコントラクトを展開する際のガス手数料がカバーされます。

Sepoliaは若いテストネットなので、ノードの展開に必要なディスク容量が少なくなりますので、ご注意ください。

今のところ、Goerliテストネットを続けます。なぜなら、より多くの展開されたアプリケーションがあります。

テストネットと偽のETHが準備できたので、特にスマートコントラクトの作成に移りましょう。以下は、100万の固定供給量を持つBICトークンを作成するためのコードスニペットです。

Note: 私たちはスマートコントラクトをMacOS上でローカルに展開する予定です。テストネットではなく、テストネットおよびメインネットでのスマートコントラクトの展開については、この議論の範囲を超えた別の部分があります。

書く手順と展開する手順

こちらは架空のトークンに関する単純なコードスニペットです。

pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 {    constructor() ERC20("BIC Token", "BIC") {        _mint(msg.sender, 1000000 * 10 ** decimals());    }}

構文を理解していれば、各コードコンポーネントの意味を知っているはずです。Openzepplinpart、これはERC-20スマートコントラクトのインポートに最適なライブラリです。このライブラリは、ERC-20トークンの基本的な運用基準を提供しています。

mint関数は、初期供給について述べており、それはスマートコントラクトアドレスまたはmsg.senderにデプロイされます。

これをローカルで設定してテストするには、3つのコンポーネントが必要です。

  1. Node.jsとNPM(すでに議論されています):スマートコントラクトを動かすエンジンのように機能します
  2. トリュフ: ツールボックスのように機能し、コード、スクリプト、契約の他の部分を整理するのに役立ちます
  3. Ganache: 仮想の、デバイス上のプレイグラウンドのように機能します。個人用ブロックチェーンのようなものと考えてください。

契約の実行とは何ですか?

スマートコントラクトの詳細なプロセスを経験した場合、契約の実行についてかなり理解していることが重要です。これは、ノードによってチェーン上でスマートコントラクトコードが実行されるプロセスです。

スマートコントラクトを透明で変更不可能にするのは、契約執行に関連する均一性です。今度は、契約執行に関連する段階的なプロセスを理解しましょう。

ステップ1

私たちが書いてきたコードスニペットはどこかで実行する必要があります。スマートコントラクトの場合、この実行場所はブロックチェーンです。チェーンのノードまたは参加メンバーが契約を実行するのを助けます。

ステップ2

ノードは、チェーン関連のインセンティブの代わりに、契約コードブロックの実行の責任を受け入れます。チェーン内で起こるすべてのコマンドやアクションは、スマートコントラクトによって主導されます。

ステップ3

すべてのスマートコントラクトには特定のアドレスがあります。契約を実行するために、取引はその契約アドレスに送信されます。各ノードがEVMを実行し、その後取引の信頼性を確認しやすくするために、スマートコントラクトコードのコピーを持っています。

ステップ4

スマートコントラクトに向けられた取引は、その後ブロックに含めるために選ばれたバリデータによって選ばれます。

ステップ5

トランザクションがプッシュスルーされ、正常に検証されると、ブロックチェーンの一部になります。その後、トランザクションに関連付けられたスマートコントラクト関数が呼び出され、ブロックチェーンノード間で実行されます。

ステップ6

すべてのノードがスマートコントラクトを実行すると、同じ入力セットに対して同じ出力が得られる確定的な結論に達する必要があり、契約の性質は完全に信頼できず透明です。

注意: コードの実行に関するエラーやガス手数料に関連する問題がある場合、取引が元に戻されます。つまり、特定のスマートコントラクトコードに基づく取引が存在しなくなります。これが起こるのは、Gate.ioのプロダクト名に関するゲートと同じです。フラッシュローン特定の規範に従うことができないと、取引全体が逆転し、まるで資金が最初から動いていなかったかのような印象を与える。

スマートコントラクトに関連するすべての状態変更は、ブロックチェーン内に記録され、同じ不変の一部となります。

スマートコントラクトの開発とベストプラクティス

スマートコントラクトについてかなり理解していることを考えると、契約開発を始めるためのいくつかのポイントがここにあります。

  1. 契約を書く際には、OpenZeppelinのような信頼できるライブラリに頼ることが望ましい。これにより、望ましいコードの最適化とセキュリティ基準を遵守することができます。
  2. 契約をモジュール化し、よりシンプルに保つことで、テストやレビューをしやすくすることが目的です。
  3. 契約固有のアクセス制御を実装するのは良い考えです。これは、特定の個人やエンティティだけが契約の重要な特性を変更できるコードビットを宣言することを意味します。アクセス制御は、スマートコントラクトを安全に保つのに役立ちます。
  4. 契約を書く際は、常にエッジケースや例外の処理を考慮してください — 同時に複数のテストを書きながら。

コードの持続可能性に気を配る

上記の各プラクティスは、コードの最適化とセキュリティ固有の実装に役立ちます。ただし、コードの持続可能性に対処するために、従い、実装する必要がある契約固有のプラクティスがいくつかあります。これは、コントラクトコードを軽量で使いやすい状態に保ち、同じノードを実行および実行するすべてのノードが、同じノードに多くの計算能力を費やす必要がないようにすることを目的としています。

  1. データセットを小さくして効率的にストレージを処理します。たとえば、契約書を書く際に、uint256の代わりに操作値としてuint8を使用します。
  2. 契約を書く際には、複数の操作を1つに組み合わせることでコードを最適化することが望ましいとされています。私たちは「スマートコントラクトの作成」に関する詳細な記事でこれについて詳しく見ていきます。
  3. スマートコントラクトの実行に関して遅延評価を使用するのは良い考えです。これにより、必要な時にのみ関数を実行する必要があり、スマートコントラクトアドレスに何かがプッシュされるたびに実行する必要はありません。
  4. 最後に、オフチェーン計算に頼ることも、持続可能性に焦点を当てる良い方法です。これにより、必要なガス料金が削減され、契約の実行がスピードアップすることさえできます。

スマートコントラクトを書いたり開発する際に最善の手法に従っていても、それをメインネットにプッシュする際には契約のセキュリティの脆弱性に注意する必要があります。

スマートコントラクトの監査方法は?

メインネットに存在するすべてのスマートコントラクトは、コードのパフォーマンス、セキュリティ、およびその他の特性について評価する必要があります。これが監査の場面であり、厳格な契約テストプロセスであり、潜在的な契約の脆弱性や弱点を明らかにすることができます。

こちらはすぐに始めるための簡単な監査チェックリストです:
素晴らしいスマートコントラクト監査チェックリスト😈
次回の監査で必ずチェックしてください✅
リツイートしていただけると嬉しいです。知識を広めましょう🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv)2023年7月7日

読書、執筆、監査の関係:なぜスマートコントラクトを監査するのか?

スマートコントラクトの読み書きは、知的なコードを開発する際に絡み合っていますが、監査は特別な位置を占めており、まずロジックをチェックすることを含んでいます。ブロックチェーンベースのコード実行において、すべてが不変であり、何かが破滅的な結果をもたらす可能性があり、契約の実行には取り返しのつかない結果をもたらすことがあります。これが、契約コードやその他の側面を監査を通じて徹底的にチェックする必要がある理由です。

契約の脆弱性と修正

のホストが存在する可能性がありますコントラクトの脆弱性詳細なスマートコントラクト監査で特定できる問題があります。これには再入攻撃、オーバーフローやアンダーフローのチェック、アクセス制御に関連する問題などが含まれます。問題の正確な性質が判明したら、監査人は同じ問題を修正するためのベストプラクティスさえ提案することができます。

侵害はケーススタディや学びに影響を与えます

まだスマートコントラクト監査がどのように役立つかよくわからない?まあ、悪名高いことに戻ってみましょうDAO2016年のハッキングは、再入可能性の問題を悪用し、ほぼ360万ETHの損失を引き起こしました。同様に、2017年にはParityウォレット契約のハッキングがあり、ほぼ50万ETHの損失につながりました。これらの問題は適切な監査セットで回避することができました。


DAOハックフローチャート:BeInCrypto

スマートコントラクトの監査戦略

スマートコントラクトを監査するためのさまざまな戦略があります。よく知られているもののいくつかには、以下が含まれています:

監査ツール

これらのツールは最初の防衛手段として機能し、一般的な脆弱性を特定するのに最適です。より人気のあるツールには、Securify、Mythrilなどがあります。これらのツールは、コードの静的解析を実行し、侵害パターンを検出し、セキュリティに特化したスタートを切るのに役立ちます。

スマートコントラクトを監査するツール:BeInCrypto

コードレビュー

ここで、手動のコードレビュアが登場し、コードベースを精査し、必要に応じて複雑な脆弱性を特定します。手動レビューは、ビジネスロジック、コンテキスト、および使用パターンに対処するのに役立ちます。

マニュアルコードレビューが脅威を特定するのにどのように役立つかを説明します。

ジュニアオーディターのためのちょっとしたトリビア!
バグを見つけたら、リツイートしてください!pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)2023年7月8日

自動スキャン

SnykやGuardRailsなどのツールは、自動契約スキャンを支援し、コードが更新されるたびに呼び出されるセキュリティ実装をサポートします。この種の監査は、コードに加えられた新しい変更が安全で侵害的でないことを確認します。

形式検証

これは、コードのビジネス ロジックのチェックのみに依存する複雑なプロセスです。形式検証は、実際には構文を検証するためのものではなく、コードが意図したとおりに実行されるかどうかを確認するためのロジックのみを目的としていることに注意してください。

上記の戦略に加えて、スマートコントラクトの監査は、ピアレビュー、バグバウンティプログラム、Solidity Coverageなどのツールを介したテストカバレッジを使用して開始し、有効性を最大化することもできます。

スマートコントラクトを監査する簡単な方法:BeInCrypto

コードを正しくレビューする方法は?

スマートコントラクト監査に初めて取り組む場合、コードを広く分析し問題を特定する方法は大きく2つあります。これには、

静的解析

この種のコード解析は、与えられたコーディング基準と規則に従って、基本的なセキュリティ脆弱性、コーディングエラー、その他の問題を特定するのに役立ちます。外部ソースへの未検査の呼び出し、整数オーバーフローなどの脅威は、静的解析を使用して強調表示できます。静的解析の最も良い点は、コードを実行する必要がないことです。

動的解析

この監査アプローチは、コードがEVMと一致しているかどうかをテストします。コードのみをチェックするのではなく、動的分析はスマートコントラクトの応答を幅広い入力で相互チェックします。動的分析は、不整合なガス消費や誤った契約ロジックなどの問題を特定できます。Ganacheのような個人用ブロックチェーン環境は、開発者がトランザクションを行ったり、コマンドを実行したり、契約を活用したりできる動的分析プラットフォームとして機能します。

実際のコードのテスト

ここには、引き出し機能を持つ資金蓄積として機能するスマートコントラクトスニペットがあります。

pragma solidity ^0.6.1;contract VulnerableContract {    mapping(address => uint256) public balances;    function deposit() public payable {        balances[msg.sender] += msg.value;    }    function withdraw(uint256 _amount) public {        require(balances[msg.sender] >= _amount, "Insufficient balance.");        (bool success, ) = msg.sender.call{value: _amount}("");        require(success, "Transfer failed.");        balances[msg.sender] -= _amount;    }}

コードを注意深く見ると、重要な脆弱性があります:

前回のケースでは、「引き出し」機能は、資金を受け取るユーザーが悪意のあるスマートコントラクトであっても、再度呼び出すことができます。したがって、最後の関数または残高の更新が行われる前に、再入攻撃が開始され、追加の資金が転送される可能性があります。経験豊富な監査人は、この種の脆弱性を特定します。

同じコードの修正版はこちらです:

function withdraw(uint256 _amount) public {    require(balances[msg.sender] >= _amount, "残高が不足しています。");    balances[msg.sender] -= _amount;    (bool success, ) = msg.sender.call{value: _amount}("");
require(success, "転送に失敗しました。");}

まず、残高更新機能が呼び出され、その後にユーザーへの最初の移動が行われるかを確認します。この操作順序の変更が契約を修正する要因です。

イーサリアム以外のチェーンとコードレビュー

分散型アプリケーションとスマートコントラクトの世界は、イーサリアムを超えて進化しています。イーサリアムエコシステム内でのアクティビティの大部分は依然として行われていますが、Cardano、Solanaなどの他のチェーンもスマートコントラクトをサポートし、異なる監査基準が必要です。

なぜすべてのプラットフォームがユニークなのですか?

異なるブロックチェーンは異なるプログラミング言語を使用しています。コードの意味論、構文、およびプロパティは異なり、スマートコントラクトは異なる記述や監査の実践に対応しています。たとえば、イーサリアムはSolidityを使用しています。Polkadot特定の監査基準に反応するInkとRustを使用しています。

イーサリアム以外へ行くためのツール

今後、イーサリアムを超えたい場合、いくつかの専門の監査ツールを利用できます。たとえば、Cardanoでは、形式的検証と監査のためのMarloweスイートがあります。Solanaの場合、Rust固有のlibfuzzerとcargo-fuzzは、監査と契約テストに適しています。マルチチェーンの監査人は、これらの概念に精通している必要があり、契約の脆弱性を排除する必要があります。

スマートコントラクト監査の異なる種類は何ですか?

再度強調しますが、スマートコントラクトの監査を手動、自動、ハイブリッドの3つのタイプに分類することができます。複雑な契約や深いビジネスロジックを持つ契約に対しては、ハイブリッド監査戦略が最も包括的であるため、人々はそれを好む傾向があります。

監査を外部委託する

コーディング知識がほとんどない組織や個人は、しばしば執筆や監査の要件を評判のある企業に外部委託します。監査に関しては、適切な企業を選択することがさらに重要になります。AIツールlikeChatGPTスマートコントラクトのコードを書くのに役立ちますが、同じものをチェックするには手動で洞察が必要です。

また、監査業務を外部委託する際に注意すべき要因についても説明します:

適切な企業を選ぶ

適切な外部委託企業を絞り込む前に、過去の監査をチェックし、経験を評価し、さらに主要チームメンバーに焦点を当てることが重要です。

責任、コスト、および経費の理解

採用する前に、監査に関連するコストやサービスに注意してください。提供されるサービスの性質をまず理解することが不可欠です。たとえば、問題の特定、問題の解決などです。最初の修正ラインの実装後に再監査も提供されているかどうかも確認する必要があります。スマートコントラクト監査のコストはサービスによって異なる場合があり、そのため進行する前にすべての要件と提供を追跡する必要があります。

最高のスマートコントラクト監査の実践

自分で企業をやめてスマートコントラクトを監査したい場合は、心に留めておくべきベストな戦略と実践があります。

  1. 常に構文とロジックを含む徹底的なコードレビューに焦点を当てる
  2. 一般的な脆弱性をSlither、MythXなどのツールを使って見つけることから始めます
  3. 既知の脆弱性を見つけ、事前にチェックするために、スマートコントラクトの脆弱性分類登録またはSWCを通じてサーフィンしてください。
  4. 様々なシナリオでコードをストレステストするために、統合テスト、単体テストなどを含むスマートコントラクトを徹底的にテストします。
  5. 再入攻撃の可能性を特にチェックすることが重要です。同じものに対抗する最良の方法は、ハッカーが最初のスマートコントラクト関数の前に呼び出すことができる再帰呼び出しをチェックすることです。
  6. 外部呼び出しにつながる機能に焦点を当てます。この点でのエラーは状態と制御フローを変更する可能性があり、望ましくありません。
  7. 常にガス使用量を指すコードビットに注意を払ってください。契約が過大な費用がかかる対話を開始しないようにしてください。

スマートコントラクトの開発とAI:未来

人工知能は確かにスマートコントラクトの作成を容易にしています。しかし、AIの革新に関係なく、最良の方法でスマートコントラクトを監査する能力には依然として人間の介入が必要です。したがって、次のweb3製品を構築する予定でスマートコントラクトや分散型アプリケーションを重点的に取り上げる場合、スマートコントラクトのための最良の監査リソースに重点を置くことは非常に重要です。暗号通貨のハッキングや侵害が日々表面化し、ハッカーが新たな戦略を立てて侵入しようとしている中で、契約を完璧に監査することは確かにより重要な現代のスキルの1つです。

免責事項:

  1. この記事は[から転載されていますBeincrypto], そして著作権は元の著者[Ananda Banerjee]に帰属します。転載に異議がある場合は、Gate Learnチームに連絡し、チームは関連手続きに応じて迅速に処理します。
  2. 免責事項:この記事で表明された見解や意見は、著者の個人的な見解のみを表しており、投資アドバイスを構成するものではありません。
  3. Gate Learnチームによって他の言語バージョンの記事が翻訳されています。Gate.ioを言及せずに、翻訳された記事をコピー、拡散、または盗用することは許可されていません。
ابدأ التداول الآن
اشترك وتداول لتحصل على جوائز ذهبية بقيمة
100 دولار أمريكي
و
5500 دولارًا أمريكيًا
لتجربة الإدارة المالية الذهبية!