すべての記事

コントラクトの読み取りとコントラクトの書き込み

blockchainFebruary 6, 2026·#Blockchain

スマート コントラクトの動作メカニズムの包括的なビュー、チェーン上のデータの読み取りと書き込みの間の有害な混乱、および専門家 Tan Phat Digital による安全上の指示を解読します。

コントラクトの読み取りとコントラクトの書き込み

分散型金融 (DeFi) とブロックチェーン ベースのアプリケーションの時代では、Etherscan のようなブロック エクスプローラーを介してスマート コントラクトと直接対話することが不可欠なスキルになりました。しかしタンファットデジタルの専門家チームの観察によると、「契約の読み取り」と「契約の書き込み」という 2 つの主要なインタラクション方法の根本的な違いは誤解されることが多く、コスト、実行速度、特にデジタル資産の安全性についての混乱につながっています。次の分析では、イーサリアム仮想マシン (EVM) の技術アーキテクチャ、トークン標準、およびユーザーが頻繁に遭遇する脆弱性を詳しく掘り下げます。

アーキテクチャ原則: 可変状態とデータ クエリの分離

読み取り操作と書き込み操作の区別の基礎は、イーサリアム ネットワークがデータを保存する方法にあります。 Solidity の状態変数はブロックチェーン上に永続的に保存され、すべてのノードによって維持されるネットワーク状態の一部です。これらの変数にアクセスまたは変更するには、EVM のさまざまな実行メカニズムが必要です。

読み取りオペレーション

Etherscan の [コントラクトの読み取り] タブで表される読み取りオペレーションは、ブロックチェーンの状態を変更せずに、暗号化された情報またはコントラクトに保存されている情報をクエリするプロセスです。技術的には、これらの関数は、viewpure などの修飾子を使用して定義されることがよくあります。 view 関数では、状態変数やバランスを読み取ることができますが、それらを変更することはコミットできません。一方、pure 関数は、状態の読み取りも書き込みも行わず、入力パラメーターに基づいて計算のみを実行するという点でさらに制限が厳しくなります。

ユーザーを混乱させることが多い重要な点は、これらの操作の「無料」という性質です。ユーザーが Etherscan 経由で残高またはトークン名をクエリすると、ブラウザは RPC プロトコル (eth_call) 経由で Ethereum ノードへの呼び出し (call) を行います。この操作はネットワーク全体の状態を変更しないため、グローバルな合意を必要とせず、したがってガスのコストもかかりません。ただし、これらの読み取り関数がオンチェーンの別の書き込み関数によって呼び出される場合、微妙な誤解が生じます。そのコンテキストでは、トランザクション全体の一部として依然としてガスを消費します。

書き込みオペレーション

対照的に、[書き込みコントラクト] タブは、資金の転送、所有権の更新、トークンの使用許可の承認など、ブロックチェーンの状態を変更するアクションを表します。すべての状態変化は台帳に永続的に記録される必要があり、そのためにはユーザーが実際にトランザクション (transaction) を送信する必要があります。このトランザクションでは、送信アドレスの制御を証明するために、ユーザーのウォレット (MetaMask など) からのデジタル署名が必要です。

コストと時間の違いは明らかです。書き込み操作はガス (計算コストの尺度) を消費し、マイナーまたはバリデーターがそれをブロックに詰め込むのを待つ必要があります。ユーザーはガス価格の変動を予測していないときに間違いを犯し、不適切なガス制限設定が原因でトランザクションが停止したり失敗したりすることがよくあります。

読み取り契約と書き込み契約の比較特性分析

1.コントラクト読み取り (呼び出し) 操作:

  • 主な目的: ブロックチェーンから現在のデータをクエリします。

  • ソリッド性修飾子: キーワード view または pure を使用します。

  • ガス料金 (オフチェーン): 作成時に完全に無料

  • ウォレットの署名が必要: 個人ウォレットからは署名は必要ありません。

  • ネットワークへの影響: ノードレベルでローカルにのみ発生します。

  • 応答時間: 応答はほぼ瞬時に行われます。

  • 次の可能性があります。失敗: 非常に低く、通常はソース コード内のロジック エラーのみが原因です。

2.コントラクト (トランザクション) の書き込み操作:

  • 主な目的: ブロックチェーン上の状態またはデータを変更します。

  • Solidity 修飾子: 制限キーワードなし (または payable を使用)。

  • ガス料金: ガス料金は常にネットワークで支払う必要があります。基本通貨。

  • ウォレットの署名が必要です: 所有権を認証するために署名が必要です。

  • ネットワークへの影響: コンセンサス メカニズムによる世界的な影響。

  • 応答時間: 速度ネットワーク パフォーマンスとガス価格によって異なります。

  • 障害の可能性: 高い。ガス不足、間違った nonce、権限エラー、または契約ロジックが原因である可能性があります。

詳細を見る: ブロックチェーン エクスプローラーとは何ですか?

コントラクト書き込み操作におけるよくある間違いの分析

Etherscan の「コントラクト書き込み」インターフェイスを直接操作する場合、ユーザーは多くの場合、

小数点の精度の間違い

これは直接的な経済的損失を引き起こす最も一般的な技術的リスクであり、Tan Phat Digital は警告したいと考えています。 Solidity では、ネットワークが浮動小数点数をサポートしていないため、整数 (uint256) が推奨されます。したがって、すべてのトークンには 10 進数 パラメータがあります。

ユーザーは、すべてのトークンが ETH と同様の標準の 18 桁の 10 進数を使用していると誤解することがよくあります。ただし、実際には大きな違いがあります。

  • イーサリアム (ETH): 小数点以下 18 桁。 1 単位の生の値は 1 x 10^{18} (Wei) です。

  • ラップ ビットコイン (WBTC): 小数点以下 8 桁。 1 ユニットの生の値は 1 x 10^8 (Satoshi) です。

  • テザー (USDT): 小数点以下 6 桁。 1 ユニットの生の値は 1 x 10^6 です。

  • USD コイン (USDC): 小数点以下 6 桁。 1 ユニットの生の値は 1 x 10^6 です。

  • DAI ステーブルコイン: 小数点以下 18 桁。 1 ユニットの生の値は 1 x 10^{18} です。

  • 柴犬 (SHIB): 小数点以下 18 桁。 1 単位の生の値は 1 x 10^{18} です。

例: 1,000 USDC を送金する場合は、1000000000 と入力する必要があります。 1000 のみを入力した場合、実際に送金される金額はわずか 0.001 USDC です。

計算エラー: 乗算および四捨五入の前に除算を行う

スマート コントラクトでは、乗算の前に除算を実行することは典型的な間違いです。 uint256 は常に切り捨てを行うため、中間計算で 1 未満の結果が返された場合、すぐに 0 になります。 「書き込み」関数にパラメータを指定する場合、これらの論理エラー状態が引き起こされないように、順序に注意する必要があります。

詳細: トランザクション ID (TxID) は次のとおりです。何を?

承認エコシステムとセキュリティの落とし穴

「承認」メカニズムにより、サードパーティがユーザーに代わってトークンを使用できるようになりますが、これはしばしば悪用される弱点でもあります。

無限承認の神話

ほとんどの dApps は、後でガスを節約するために「無限」の承認を必要とします。ユーザーは、コントラクトの残高を完全に制御できることを理解せずに、uint256 の最大値をコピーすることがよくあります。コントラクトがハッキングされた場合、攻撃者はそれ以上の確認を行わずにウォレットを空にすることができます。

切断と取り消しの混同

多くの Web3 ユーザーは、「切断」ウォレットは安全だと信じていますが、そうではありません。

1.ウォレットの切断:

  • 配置: dApp インターフェースまたはウォレット ウィジェットでの操作。

  • ガス料金: 完全に無料。

  • 影響: ウェブサイト インターフェースからウォレット アドレスのみを非表示にします。スマート コントラクトは、以前に承認された引き出し権を保持します。

  • 目的: 個人のプライバシーを保護します。

2.承認の取り消し:

  • 目的: 絶対的な資産セキュリティ。

プロキシ アーキテクチャとトランザクション エラー

プロジェクトでは、多くの場合、「プロキシ コントラクト」モデルを使用してソース コードをアップグレードします。プロキシ アドレスと実装アドレスを混同すると、エラーが発生することがよくあります。ユーザーは、「これはプロキシですか?」というダイアログを使用する必要があります。 Etherscan で [プロキシとして読み取り] または [プロキシとして書き込み] タブを適切に操作できるようにする必要があります。

書き込みコントラクト実行時のデコード エラー

  • ガス欠エラー: 設定したガス制限が必要以上に低い場合に発生します。支払われたすべてのガス料金は失われ、取引は失敗します。複雑なコントラクトのやり取りでは、デフォルトで 21,000 ガスを設定しないでください。

  • 実行取り消しエラー: ガスは十分ですが、間違った認証、残高不足、または require 条件の違反により、コントラクト ロジックが停止しました。ガスを増やしてもこのエラーは解決されません。

  • ノンス エラー: 各トランザクションにはシーケンス番号 (ノンス) があります。低手数料のトランザクションがスタックすると、後続のより大きな nonce のトランザクションもスタックし、ウォレットの輻輳が発生します。

データのインデックス作成とエクスプローラーの遅延

Etherscan には、数秒から数分の範囲のインデックス作成のラグがあります。ユーザーは、ウォレットが成功を報告しても Etherscan がまだ新しいデータを表示していないときにパニックになることが多く、無駄なトランザクションが繰り返し送信されることになります。

さらに、データの分類もわかりにくいです。

  • トランザクション タブ: 個人ウォレットからの呼び出しを、固有のハッシュ コード (Tx ハッシュ) とともに表示します。

  • 内部トランザクション タブ:コントラクトロジックによって実行されるETHの動きを示します。個別の Tx ハッシュはありませんが、元のトランザクションに依存します。

  • トークン転送タブ: コントラクトから発行されたイベントに基づいて ERC-20、721、1155 標準の転送を表示します。

15 のよくある質問 (FAQ)

  1. なぜ読めるのか手数料なしで Etherscan を超えるウォレット残高はありますか?

    読み取り操作ではブロックチェーンの状態は変更されません。 Etherscan はローカル ノードからデータをクエリして表示するだけなので、ガスやウォレットの署名は必要ありません。

  2. [契約の読み取り] タブの「ビュー」機能と「純粋」機能の違いは何ですか?

    オフチェーンから呼び出された場合、どちらもガスフリーです。ただし、view 関数はコントラクト内の状態変数からデータを読み取ることができますが、pure は読み取りも書き込みも行わず、入力に基づいて計算のみを実行します。

  3. [契約の書き込み] タブで 100 USDT を転送すると、ウォレットに 0.0001 USDT しか表示されないのはなぜですか? 小数点のエラーが原因です。 USDT には小数点以下 6 桁しかありません。 「100」と入力すると、システムは $100 / 10^6$ として解釈します。 100 USDT を転送するには、100000000 を入力する必要があります。

  4. 「ガス切れ」と「実行が取り消されました」はどう違いますか?

    「ガス切れ」は、ガス制限の設定が低すぎるため、マイナーがコードを完全に実行するのに十分なエネルギーを持っていないためです。 「元に戻されました」とは、ガスは十分ですが、特定の条件が満たされていないため (パスワードが間違っている、ウォレットが不足しているなど)、コントラクト ロジックがトランザクションを積極的に停止しているためです。

  5. dApp からウォレットを切断しましたが、ハッカーが私の資金を再び引き出すことはできますか?

    はい。切断はディスプレイ インターフェイスを中断するだけです。署名した「承認」権限は、「取り消し」操作を実行するまでブロックチェーン上で永久に有効です。

  6. Etherscan に「この契約はプロキシ契約である可能性があります」と表示されるのはなぜですか?

    この契約はアップグレード可能にするためにプロキシ モデルを使用しているためです。すべての実装ロジックは別のコントラクト (実装) に存在します。 [プロキシとして読み取り/書き込み] タブを使用できるようにするには、プロキシを検証する必要があります。

  7. 無限承認はどのくらい危険ですか?

    無限承認により、そのコントラクトがいつでもトークン残高全体を引き出すことができます。プロジェクトがハッキングされたり、プロジェクト所有者に悪意がある場合、あなたがそれを止めることができずにウォレットを空にする可能性があります。

  8. Etherscan で古い承認権限を取り消す方法

    Etherscan の「トークン承認チェッカー」セクションに移動し、ウォレットを接続し、信頼できなくなった各契約の「取り消し」ボタンを押します。この操作にはガス料金がかかります。

  9. 私のトランザクションは MetaMask で成功したと報告されていますが、Etherscan にはまだ古い残高が表示されていますか?

    これはインデックス作成の遅延現象です。チェーン上のデータは更新されましたが、Etherscan のサーバー システムが同期して新しいデータを表示するには、数秒から数分かかります。

  10. 「内部トランザクション」とは何ですか?また、独自のハッシュ (Tx ハッシュ) がないのはなぜですか?

    これらは、コントラクト内のロジックから発生するトランザクションです (たとえば、コントラクトは自動的に ETH を送信します)。それらは元のトランザクション (通常のトランザクション) に含まれているため、独立したハッシュ コードはありません。

  11. 「転送」機能を使用してトークンをコントラクト アドレスに転送すると、損失が発生しますか? ほとんどの場合、損失が発生します。一部のコントラクトには直接デポジットされたトークンを処理する機能がなく、永久にそこに留まることになります。通常は、「入金」機能または公式 dApp インターフェースを使用する必要があります。

  12. 取引するために ETH を WETH に「ラップ」する必要があるのはなぜですか?

    ETH はネイティブ通貨であり、ERC-20 標準に従っていないためです。 DEX で「Approve」や「TransferFrom」などの機能を操作するには、ETH を WETH にラップして標準トークンにする必要があります。

  13. アドレス ポイズニングとは何ですか?

    詐欺師は、最初と最後の文字が通常使用しているアドレスと同一のアドレスから、極微量の金銭 (ダスト) を送金します。目的は、次回の送金で取引履歴からアドレスを誤ってコピーしてしまうことです。

  14. ERC-2612 「許可」は従来の「承認」より安全ですか? 「許可」はオフチェーン署名のためガスの節約に役立ちますが、署名フィッシングのリスクが伴います。ハッカーは、無害に見えて実際にはお金を引き出す許可を与えるメッセージに署名させることができます。

  15. 1 ETH は何ウェイですか?

    スマート コントラクト プログラミングでは、最小単位はウェイです。 1 ETH = 10^{18} ウェイ (1,000,000,000,000,000,000 ウェイ)。 [書き込みコントラクト] タブに値を手動で入力するときは、常にこの数値を念頭に置いてください。

読み取りコントラクトと書き込みコントラクトの違いを理解することは、Web3 の世界であなたを守る最強の盾です。 Tan Phat Digital は、ユーザーに次のことを推奨します。

  1. 各タイプのトークンの小数点を常に確認する。

  2. 限定された承認を優先し、定期的に「取り消し」を実行する。

  3. プロキシ テスト ツールを使用して、コマンドが正しいアドレスに送信されていることを確認する。

  4. 冷静にデコードする

  5. 公的に検証された (Verified) 契約とのみ対話します。

Web3 は財務上の自律性をもたらしますが、それに対応する個人の責任も必要とします。 Tan Phat Digital からの共有により、ブロックチェーン上でより安全かつ効果的にやり取りできるようになれば幸いです。

シェア

コメント

0.0 / 5(0 件の評価)

コメントするにはログインしてください。

まだコメントはありません。最初のコメントを投稿しましょう。