スマートコントラクトは、特定の条件が満たされたときにのみ実行されるプログラム可能なコードです。これらは法的に拘束力のある現実世界の契約と同義です。ただし、この場合、コードが法律です。スマートコントラクトはブロックチェーンに存在するため、変更できません。他の特性の中で、この変更不能性がスマートコントラクトを特別なものにしています。
スマートコントラクトブロックチェーン固有の取引を自動化するために意図されています。 条件に応じた契約であるため、中間業者は必要ありません。 スマートコントラクトを有用にする要因の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を超え、余剰金額が受益者に移動します。
どの要素が貸与するかに関して懸念していますセキュリティ契約について知りたいですか?コードのこの部分をチェックしてください:
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
今までに、既に書かれたスマートコントラクトを読んで理解するための先行スタートを持っているはずです。そして、私たちが議論したような多くのスマートコントラクトは、分散型アプリケーションのバックエンドを構成しています — ブロックチェーン標準モバイルアプリケーションのバージョン。
スマートコントラクトの特性のすべて、契約のセキュリティ、自律およびプログラム可能な実行、トランザクションの信頼性などは、分散型アプリケーションの開発中に簡単に実装されます。ですので、次に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 を使用します。:*;) stands for.
SolanaのドキュメントRust固有のスマートコントラクト言語を理解するのに役立ちます。
同様に、CardanoはPlutusに続いて、Ink!言語を選択します。Polkadot, AlgorandのTEAL、NEOのC#など。対応するスマートコントラクトの作成を進める前に、チェーンごとのドキュメントを詳しく学ぶことをお勧めします。
スマートコントラクトを書く能力は非常に認識されていますが、読む能力さえも多くの利点をもたらします:
スマートコントラクトの読み取りが完了したので、スマートコントラクトの記述に焦点を当てましょう。さらに深く掘り下げる前に、異なるブロックチェーンにはスマートコントラクト開発に関連する異なる標準と言語がある可能性があることを繰り返す必要があります。任意のブロックチェーンによって定義された標準に焦点を当てることが必要です。記述と契約の展開を開始するにあたり。
私たちの議論の大部分では、チェーンとしてEthereum、言語としてSolidityに焦点を当てることにします。
スマートコントラクトのプログラミングは、開発サイクルの中で最も重要な部分です。そして、Ethereumや他のブロックチェーンでスマートコントラクトの開発に取り組むためには、Javascriptなどのブロックチェーン以外のプログラミング言語の経験があると良いでしょう。
異なるブロックチェーンとスマートコントラクトを記述する言語:BeInCrypto
スマートコントラクトをプログラムする能力は、同じロジックを実装し、セキュリティ要素を処理し、コードを最適化することができます。ガス手数料, 同じようにカスタマイズし、必要に応じて相互運用可能にもできます。
Ethereumでスマートコントラクトを書こうとしている人は、Ethereum Virtual Machine(EVM)が何であり、スマートコントラクトとどのように連動するのかを理解する必要があります。まず、EVMはプログラムに孤立した制御された環境を提供するEthereumのコンポーネントです。これは、Ethereum上のすべての契約コードをホストするグローバルコンピューターと考えることができます。ノードイーサリアムネットワーク上でEVMが実行されます。
スマートコントラクト開発者を目指している場合、スマートコントラクトとEVMに関する知識が必要です。
Solidityという高水準言語でプログラムを書いたら、それをバイトコードにコンパイルする必要があります。これは機械が理解できる低水準形式です。このバイトコードはEthereumブロックチェーンに入り、そこに存在します。スマートコントラクトとやり取りする人は、契約のアドレスにトランザクションを送らなければなりません。
EVMをインストールしたすべてのノードはこのトランザクションを見ることができ、検証者が同意すれば、スマートコントラクトコードが実行されます。すべてのノードがトランザクションの可視性を持っているため、何も改ざんされず、コードは書かれた通りに実行されます。コードが実行されると、ブロックチェーンの状態が変化し、プロセスがエンドツーエンドで完全に透明になります。
スマートコントラクトの作成には技術的なノウハウが必要です。しかし、それだけではありません。ターゲットとするブロックチェーンに関連する言語固有のニーズを徹底的に理解する必要もあります。相互運用性, その他にも、コードを書く際に避けるべきスマートコントラクトの脆弱性についてもかなり知っておく必要があります。最後に、契約テストと契約展開の知識も必須です。
すべてが圧倒的になる可能性があります。だから、ここには始めるためのクイックチートシートがあります。
より良いスマートコントラクトを書くためのいくつかのヒントを紹介します。
🥧 FREI-PI
‼️ スマートコントラクトの開発者がこれを知る必要がある理由!
機能:
– 要件
–効果
– インタラクション
プロトコル
– インバリアント
これは、スマートコントラクトを構築する際に考えるべきパターンです。
ここにその理由があります 👇
— Patrick Collins (@PatrickAlphaC2023年7月6日
スマートコントラクト開発の技術的側面に入る時が来ました。SolanaやCardanoのようなチェーンでもスマートコントラクトを開発できますが、Ethereumが最も人気のあるスマートコントラクト開発プラットフォームであることは変わりません。
2022年だけで、10万以上の分散型アプリケーションがイーサリアムネットワークに登場しました。
イーサリアムには開発者コミュニティがたくさんいます。 開発したものはすぐに注目されます。 さらに、そのネイティブ言語であるSolidityは、PythonやJavaScriptを使いこなせる個人にとって比較的簡単です。 最後に、イーサリアムのグローバルソフトウェアであるEVMは、シームレスな契約の実行を支援します。
もし大多数派であり、EthereumとSolidityを使用することを好む場合、スマートコントラクト開発を始める前に追跡する必要がある事柄のクイックリストが以下にあります。
チェーン上でのことがどのように行われるかを知ったところで、最初のスマートコントラクトの作成と展開にダイブしましょう。 “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つのコンポーネントが必要です。
スマートコントラクトの詳細なプロセスを経験した場合、契約の実行についてかなり理解していることが重要です。これは、ノードによってチェーン上でスマートコントラクトコードが実行されるプロセスです。
スマートコントラクトを透明で変更不可能にするのは、契約執行に関連する均一性です。今度は、契約執行に関連する段階的なプロセスを理解しましょう。
私たちが書いてきたコードスニペットはどこかで実行する必要があります。スマートコントラクトの場合、この実行場所はブロックチェーンです。チェーンのノードまたは参加メンバーが契約を実行するのを助けます。
ノードは、チェーン関連のインセンティブの代わりに、契約コードブロックの実行の責任を受け入れます。チェーン内で起こるすべてのコマンドやアクションは、スマートコントラクトによって主導されます。
すべてのスマートコントラクトには特定のアドレスがあります。契約を実行するために、取引はその契約アドレスに送信されます。各ノードがEVMを実行し、その後取引の信頼性を確認しやすくするために、スマートコントラクトコードのコピーを持っています。
スマートコントラクトに向けられた取引は、その後ブロックに含めるために選ばれたバリデータによって選ばれます。
トランザクションがプッシュスルーされ、正常に検証されると、ブロックチェーンの一部になります。その後、トランザクションに関連付けられたスマートコントラクト関数が呼び出され、ブロックチェーンノード間で実行されます。
すべてのノードがスマートコントラクトを実行すると、同じ入力セットに対して同じ出力が得られる確定的な結論に達する必要があり、契約の性質は完全に信頼できず透明です。
注意: コードの実行に関するエラーやガス手数料に関連する問題がある場合、取引が元に戻されます。つまり、特定のスマートコントラクトコードに基づく取引が存在しなくなります。これが起こるのは、Gate.ioのプロダクト名に関するゲートと同じです。フラッシュローン特定の規範に従うことができないと、取引全体が逆転し、まるで資金が最初から動いていなかったかのような印象を与える。
スマートコントラクトに関連するすべての状態変更は、ブロックチェーン内に記録され、同じ不変の一部となります。
スマートコントラクトについてかなり理解していることを考えると、契約開発を始めるためのいくつかのポイントがここにあります。
上記の各プラクティスは、コードの最適化とセキュリティ固有の実装に役立ちます。ただし、コードの持続可能性に対処するために、従い、実装する必要がある契約固有のプラクティスがいくつかあります。これは、コントラクトコードを軽量で使いやすい状態に保ち、同じノードを実行および実行するすべてのノードが、同じノードに多くの計算能力を費やす必要がないようにすることを目的としています。
スマートコントラクトを書いたり開発する際に最善の手法に従っていても、それをメインネットにプッシュする際には契約のセキュリティの脆弱性に注意する必要があります。
メインネットに存在するすべてのスマートコントラクトは、コードのパフォーマンス、セキュリティ、およびその他の特性について評価する必要があります。これが監査の場面であり、厳格な契約テストプロセスであり、潜在的な契約の脆弱性や弱点を明らかにすることができます。
こちらはすぐに始めるための簡単な監査チェックリストです:
素晴らしいスマートコントラクト監査チェックリスト😈
次回の監査で必ずチェックしてください✅
リツイートしていただけると嬉しいです。知識を広めましょう🫡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スマートコントラクトのコードを書くのに役立ちますが、同じものをチェックするには手動で洞察が必要です。
また、監査業務を外部委託する際に注意すべき要因についても説明します:
適切な外部委託企業を絞り込む前に、過去の監査をチェックし、経験を評価し、さらに主要チームメンバーに焦点を当てることが重要です。
採用する前に、監査に関連するコストやサービスに注意してください。提供されるサービスの性質をまず理解することが不可欠です。たとえば、問題の特定、問題の解決などです。最初の修正ラインの実装後に再監査も提供されているかどうかも確認する必要があります。スマートコントラクト監査のコストはサービスによって異なる場合があり、そのため進行する前にすべての要件と提供を追跡する必要があります。
自分で企業をやめてスマートコントラクトを監査したい場合は、心に留めておくべきベストな戦略と実践があります。
人工知能は確かにスマートコントラクトの作成を容易にしています。しかし、AIの革新に関係なく、最良の方法でスマートコントラクトを監査する能力には依然として人間の介入が必要です。したがって、次のweb3製品を構築する予定でスマートコントラクトや分散型アプリケーションを重点的に取り上げる場合、スマートコントラクトのための最良の監査リソースに重点を置くことは非常に重要です。暗号通貨のハッキングや侵害が日々表面化し、ハッカーが新たな戦略を立てて侵入しようとしている中で、契約を完璧に監査することは確かにより重要な現代のスキルの1つです。
مشاركة
スマートコントラクトは、特定の条件が満たされたときにのみ実行されるプログラム可能なコードです。これらは法的に拘束力のある現実世界の契約と同義です。ただし、この場合、コードが法律です。スマートコントラクトはブロックチェーンに存在するため、変更できません。他の特性の中で、この変更不能性がスマートコントラクトを特別なものにしています。
スマートコントラクトブロックチェーン固有の取引を自動化するために意図されています。 条件に応じた契約であるため、中間業者は必要ありません。 スマートコントラクトを有用にする要因の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を超え、余剰金額が受益者に移動します。
どの要素が貸与するかに関して懸念していますセキュリティ契約について知りたいですか?コードのこの部分をチェックしてください:
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
今までに、既に書かれたスマートコントラクトを読んで理解するための先行スタートを持っているはずです。そして、私たちが議論したような多くのスマートコントラクトは、分散型アプリケーションのバックエンドを構成しています — ブロックチェーン標準モバイルアプリケーションのバージョン。
スマートコントラクトの特性のすべて、契約のセキュリティ、自律およびプログラム可能な実行、トランザクションの信頼性などは、分散型アプリケーションの開発中に簡単に実装されます。ですので、次に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 を使用します。:*;) stands for.
SolanaのドキュメントRust固有のスマートコントラクト言語を理解するのに役立ちます。
同様に、CardanoはPlutusに続いて、Ink!言語を選択します。Polkadot, AlgorandのTEAL、NEOのC#など。対応するスマートコントラクトの作成を進める前に、チェーンごとのドキュメントを詳しく学ぶことをお勧めします。
スマートコントラクトを書く能力は非常に認識されていますが、読む能力さえも多くの利点をもたらします:
スマートコントラクトの読み取りが完了したので、スマートコントラクトの記述に焦点を当てましょう。さらに深く掘り下げる前に、異なるブロックチェーンにはスマートコントラクト開発に関連する異なる標準と言語がある可能性があることを繰り返す必要があります。任意のブロックチェーンによって定義された標準に焦点を当てることが必要です。記述と契約の展開を開始するにあたり。
私たちの議論の大部分では、チェーンとしてEthereum、言語としてSolidityに焦点を当てることにします。
スマートコントラクトのプログラミングは、開発サイクルの中で最も重要な部分です。そして、Ethereumや他のブロックチェーンでスマートコントラクトの開発に取り組むためには、Javascriptなどのブロックチェーン以外のプログラミング言語の経験があると良いでしょう。
異なるブロックチェーンとスマートコントラクトを記述する言語:BeInCrypto
スマートコントラクトをプログラムする能力は、同じロジックを実装し、セキュリティ要素を処理し、コードを最適化することができます。ガス手数料, 同じようにカスタマイズし、必要に応じて相互運用可能にもできます。
Ethereumでスマートコントラクトを書こうとしている人は、Ethereum Virtual Machine(EVM)が何であり、スマートコントラクトとどのように連動するのかを理解する必要があります。まず、EVMはプログラムに孤立した制御された環境を提供するEthereumのコンポーネントです。これは、Ethereum上のすべての契約コードをホストするグローバルコンピューターと考えることができます。ノードイーサリアムネットワーク上でEVMが実行されます。
スマートコントラクト開発者を目指している場合、スマートコントラクトとEVMに関する知識が必要です。
Solidityという高水準言語でプログラムを書いたら、それをバイトコードにコンパイルする必要があります。これは機械が理解できる低水準形式です。このバイトコードはEthereumブロックチェーンに入り、そこに存在します。スマートコントラクトとやり取りする人は、契約のアドレスにトランザクションを送らなければなりません。
EVMをインストールしたすべてのノードはこのトランザクションを見ることができ、検証者が同意すれば、スマートコントラクトコードが実行されます。すべてのノードがトランザクションの可視性を持っているため、何も改ざんされず、コードは書かれた通りに実行されます。コードが実行されると、ブロックチェーンの状態が変化し、プロセスがエンドツーエンドで完全に透明になります。
スマートコントラクトの作成には技術的なノウハウが必要です。しかし、それだけではありません。ターゲットとするブロックチェーンに関連する言語固有のニーズを徹底的に理解する必要もあります。相互運用性, その他にも、コードを書く際に避けるべきスマートコントラクトの脆弱性についてもかなり知っておく必要があります。最後に、契約テストと契約展開の知識も必須です。
すべてが圧倒的になる可能性があります。だから、ここには始めるためのクイックチートシートがあります。
より良いスマートコントラクトを書くためのいくつかのヒントを紹介します。
🥧 FREI-PI
‼️ スマートコントラクトの開発者がこれを知る必要がある理由!
機能:
– 要件
–効果
– インタラクション
プロトコル
– インバリアント
これは、スマートコントラクトを構築する際に考えるべきパターンです。
ここにその理由があります 👇
— Patrick Collins (@PatrickAlphaC2023年7月6日
スマートコントラクト開発の技術的側面に入る時が来ました。SolanaやCardanoのようなチェーンでもスマートコントラクトを開発できますが、Ethereumが最も人気のあるスマートコントラクト開発プラットフォームであることは変わりません。
2022年だけで、10万以上の分散型アプリケーションがイーサリアムネットワークに登場しました。
イーサリアムには開発者コミュニティがたくさんいます。 開発したものはすぐに注目されます。 さらに、そのネイティブ言語であるSolidityは、PythonやJavaScriptを使いこなせる個人にとって比較的簡単です。 最後に、イーサリアムのグローバルソフトウェアであるEVMは、シームレスな契約の実行を支援します。
もし大多数派であり、EthereumとSolidityを使用することを好む場合、スマートコントラクト開発を始める前に追跡する必要がある事柄のクイックリストが以下にあります。
チェーン上でのことがどのように行われるかを知ったところで、最初のスマートコントラクトの作成と展開にダイブしましょう。 “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つのコンポーネントが必要です。
スマートコントラクトの詳細なプロセスを経験した場合、契約の実行についてかなり理解していることが重要です。これは、ノードによってチェーン上でスマートコントラクトコードが実行されるプロセスです。
スマートコントラクトを透明で変更不可能にするのは、契約執行に関連する均一性です。今度は、契約執行に関連する段階的なプロセスを理解しましょう。
私たちが書いてきたコードスニペットはどこかで実行する必要があります。スマートコントラクトの場合、この実行場所はブロックチェーンです。チェーンのノードまたは参加メンバーが契約を実行するのを助けます。
ノードは、チェーン関連のインセンティブの代わりに、契約コードブロックの実行の責任を受け入れます。チェーン内で起こるすべてのコマンドやアクションは、スマートコントラクトによって主導されます。
すべてのスマートコントラクトには特定のアドレスがあります。契約を実行するために、取引はその契約アドレスに送信されます。各ノードがEVMを実行し、その後取引の信頼性を確認しやすくするために、スマートコントラクトコードのコピーを持っています。
スマートコントラクトに向けられた取引は、その後ブロックに含めるために選ばれたバリデータによって選ばれます。
トランザクションがプッシュスルーされ、正常に検証されると、ブロックチェーンの一部になります。その後、トランザクションに関連付けられたスマートコントラクト関数が呼び出され、ブロックチェーンノード間で実行されます。
すべてのノードがスマートコントラクトを実行すると、同じ入力セットに対して同じ出力が得られる確定的な結論に達する必要があり、契約の性質は完全に信頼できず透明です。
注意: コードの実行に関するエラーやガス手数料に関連する問題がある場合、取引が元に戻されます。つまり、特定のスマートコントラクトコードに基づく取引が存在しなくなります。これが起こるのは、Gate.ioのプロダクト名に関するゲートと同じです。フラッシュローン特定の規範に従うことができないと、取引全体が逆転し、まるで資金が最初から動いていなかったかのような印象を与える。
スマートコントラクトに関連するすべての状態変更は、ブロックチェーン内に記録され、同じ不変の一部となります。
スマートコントラクトについてかなり理解していることを考えると、契約開発を始めるためのいくつかのポイントがここにあります。
上記の各プラクティスは、コードの最適化とセキュリティ固有の実装に役立ちます。ただし、コードの持続可能性に対処するために、従い、実装する必要がある契約固有のプラクティスがいくつかあります。これは、コントラクトコードを軽量で使いやすい状態に保ち、同じノードを実行および実行するすべてのノードが、同じノードに多くの計算能力を費やす必要がないようにすることを目的としています。
スマートコントラクトを書いたり開発する際に最善の手法に従っていても、それをメインネットにプッシュする際には契約のセキュリティの脆弱性に注意する必要があります。
メインネットに存在するすべてのスマートコントラクトは、コードのパフォーマンス、セキュリティ、およびその他の特性について評価する必要があります。これが監査の場面であり、厳格な契約テストプロセスであり、潜在的な契約の脆弱性や弱点を明らかにすることができます。
こちらはすぐに始めるための簡単な監査チェックリストです:
素晴らしいスマートコントラクト監査チェックリスト😈
次回の監査で必ずチェックしてください✅
リツイートしていただけると嬉しいです。知識を広めましょう🫡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スマートコントラクトのコードを書くのに役立ちますが、同じものをチェックするには手動で洞察が必要です。
また、監査業務を外部委託する際に注意すべき要因についても説明します:
適切な外部委託企業を絞り込む前に、過去の監査をチェックし、経験を評価し、さらに主要チームメンバーに焦点を当てることが重要です。
採用する前に、監査に関連するコストやサービスに注意してください。提供されるサービスの性質をまず理解することが不可欠です。たとえば、問題の特定、問題の解決などです。最初の修正ラインの実装後に再監査も提供されているかどうかも確認する必要があります。スマートコントラクト監査のコストはサービスによって異なる場合があり、そのため進行する前にすべての要件と提供を追跡する必要があります。
自分で企業をやめてスマートコントラクトを監査したい場合は、心に留めておくべきベストな戦略と実践があります。
人工知能は確かにスマートコントラクトの作成を容易にしています。しかし、AIの革新に関係なく、最良の方法でスマートコントラクトを監査する能力には依然として人間の介入が必要です。したがって、次のweb3製品を構築する予定でスマートコントラクトや分散型アプリケーションを重点的に取り上げる場合、スマートコントラクトのための最良の監査リソースに重点を置くことは非常に重要です。暗号通貨のハッキングや侵害が日々表面化し、ハッカーが新たな戦略を立てて侵入しようとしている中で、契約を完璧に監査することは確かにより重要な現代のスキルの1つです。