知っておくと良いこと
+AIエージェントおよび関連ツールは、まだ開発の初期段階にあり、非常に実験的な段階です——使用には注意が必要です。
+`nonce``
-`` - _コードスニペットの開始タグく_
+`` - _コードスニペットを含む開始タグ_
-nonce - _翻訳しないテキスト_
+nonce - _翻訳対象外のテキスト_
`` - _終了タグ_
@@ -154,13 +160,13 @@ nonce - _翻訳しないテキスト_
ソーステキストに数値のみの短縮タグも含まれている場合があり、そのタグの意味がすぐには分からない場合があります。 これらのタグにカーソルを合わせると、タグの意味や機能を確認できます。
-以下の例では、 \<0> タグにカーソルを合わせると、 ``が表示され、コードスニペットであることが分かります。そのため、これらのタグ内のテキストは翻訳しないでください。
+以下の例では、`<0>`タグにカーソルを合わせると、それが``を表し、コードスニペットを含んでいることがわかります。したがって、これらのタグ内のコンテンツは翻訳しないでください。

-## 短縮語、非短縮語/略語 {#short-vs-full-forms}
+## 短縮形と完全形/略語 {#short-vs-full-forms}
-本ウェブサイトではdapp、NFT、DAO、DeFiなど多くの略語が使用されています。 これらの略語は英語で一般的に使用されており、ウェブサイトの多くの訪問者はそれらが何を意味するのか知っています。
+このウェブサイトでは、dapps、NFT、DAO、DeFiなど、多くの略語が使用されています。 これらの略語は英語で一般的に使用されており、ウェブサイトの多くの訪問者はそれらが何を意味するのか知っています。
これらの用語は、他の言語で確立された翻訳がないことが多いため、省略していない原語をフルで翻訳し、英語の略語を括弧で追加します。
@@ -168,9 +174,9 @@ nonce - _翻訳しないテキスト_
「dapp」の翻訳例:
-- Decentralized application (dapp) → _非省略形の用語の翻訳(英語の略語)_
+- Decentralized applications (dapps) → _翻訳された完全形 (括弧内に英語の略語)_
-## 確立された翻訳のない用語 {#terms-without-established-translations}
+## 定訳のない用語 {#terms-without-established-translations}
いくつかの用語は、他の言語では確立された用語がない場合があり、元の英語の用語の方が広く知られていることがあります。 このような用語には、主に、proof-of-work、proof-of-stake、Beacon Chain、stakingなどを含む比較的新しい概念のものが含まれます。
@@ -178,7 +184,7 @@ nonce - _翻訳しないテキスト_
それらを翻訳するときは、クリエイティブな翻訳、説明的な翻訳、もしくは単に文字通りに翻訳します。
-**大半の用語を英語ではなく、各言語に翻訳するのは、 イーサリアムと関連技術がより多くの人々に使われるにつれて、これらの新しい用語が将来、より広く普及するであろうという考えによるものです。 世界中のより多くの人々にイーサリアムを使用してもらうため、たとえ造語であっても可能な限り多くの言語で理解できる用語を提供する必要があります。**
+**ほとんどの用語を英語のままにせず翻訳すべき理由は、将来、より多くの人々がイーサリアムや関連技術を使い始めるにつれて、この新しい専門用語がより広く普及するという事実にあります。** **世界中のより多くの人々をこの分野に迎え入れたいのであれば、たとえ自分たちで造語する必要があるとしても、できるだけ多くの言語で理解しやすい専門用語を提供する必要があります。**
## ボタンとCTA {#buttons-and-ctas}
@@ -186,11 +192,11 @@ nonce - _翻訳しないテキスト_
ボタンのテキストは、ほとんどの文字列同様、コンテキストのスクリーンショット、またはエディタのコンテキストで確認することができます。(エディタのコンテキストに「button」と記載)。
-ボタンの翻訳は、書式の不一致を防ぐためにできるだけ短くする必要があります。 さらに、ボタンの翻訳は、コマンドやリクエストを示すものでなければなりません。
+ボタンの翻訳は、書式の不一致を防ぐためにできるだけ短くする必要があります。 さらに、ボタンの翻訳は、命令や要求を表す命令形にする必要があります。

-## 包括性を踏まえた翻訳 {#translating-for-inclusivity}
+## インクルーシビティを意識した翻訳 {#translating-for-inclusivity}
ethereum.orgには、世界中から、さまざまな背景を持った訪問者が来ます。 そのため、ウェブサイトは中立的、かつ非排他的、すべての人を歓迎するものである必要があります。
@@ -200,7 +206,7 @@ ethereum.orgには、世界中から、さまざまな背景を持った訪問
最後に、すべての訪問者と年齢層に適している必要があります。
-## 言語特有の翻訳 {#language-specific-translations}
+## 言語固有の翻訳 {#language-specific-translations}
翻訳するときは、ソースからコピーするのではなく、翻訳言語の文法ルール、規定、書式に従うことが重要です。 ソースは英語の文法ルールと規則に従っており、他の多くの言語には当てはまりません。
@@ -208,7 +214,7 @@ ethereum.orgには、世界中から、さまざまな背景を持った訪問
特に注意すべき事例:
-### 句読点、書式設定 {#punctuation-and-formatting}
+### 句読点、フォーマット {#punctuation-and-formatting}
**大文字表記**
@@ -220,16 +226,16 @@ ethereum.orgには、世界中から、さまざまな背景を持った訪問
- 各言語のスペースの使用については、正書法に従ってください。 スペースはあらゆるところで使われているため、最も目立つものであり、またスペースは最も誤りが多い点の一つです。
- 英語と他の言語のスペースの使用の一般的な違い:
- - 単位と通貨(例: USD、EUR、kB、MB)の前のスペース
- - 特殊記号の前のスペース(例:°C、°F)
+ - 計量単位や通貨 (例: USD、EUR、kB、MB) の前のスペース
+ - 度記号 (例: °C、℉) の前のスペース
- 句読点の前のスペース、特にエリプシス(…)の前のスペース
- スラッシュ(/)の前後のスペース
-**箇条書き**
+**リスト**
- 箇条書きに関して、言語により多様で複雑な規則があります。 これらは英語とは大幅に異なる場合があります。
- ある言語では新しい行の最初の単語を大文字、またその他の言語では新しい行は小文字で始める必要があります。 各行の長さに応じて、箇条書きの大文字に関するルールも多くあります。
-- 同様のことが行項目の句読点にも当てはまります。 箇条書きの終止符は言語により、句点(**。**)、読点(**、**)、セミコロン(**;**)である場合があります。
+- 同様のことが行項目の句読点にも当てはまります。 リストの文末の句読点は、言語によってピリオド(.)、コンマ(,)、またはセミコロン(;)の場合があります。
**引用符**
@@ -247,16 +253,16 @@ ethereum.orgには、世界中から、さまざまな背景を持った訪問
- 英語では、単語間や単語の異なる部分を結合するためにハイフン(-)が使用されます。対して、範囲を示したり、中断を入れるためにダッシュ(-)が使用されます。
- 言語により、ハイフンとダッシュの使用ルールが異なります。
-### 書式 {#formats}
+### フォーマット {#formats}
**数字**
- 数字の表記に関する言語による主な違いは、小数と3桁の区切りに使用される区切り文字です。 千の単位の場合、ピリオド、カンマ、スペースが使われることがあります。 同様に、小数点を使用する言語もあれば、小数点にコンマを使用する言語もあります。
- 数字の表記の例:
- - 英語 ー **1,000.50**
- - スペイン語 ー **1.000,50**
- - フランス語 ー **1,000,50**
-- 数字を翻訳する際、気を付けるべきもう一つ重要な事項は、パーセント記号です。 **100%**、**100 %**または**%100**と異なる表記方法があります。
+ - 英語 – **1,000.50**
+ - スペイン語 – **1.000,50**
+ - フランス語 – **1 000,50**
+- 数字を翻訳する際、気を付けるべきもう一つ重要な事項は、パーセント記号です。 **100%**、**100 %**、**%100**など、さまざまな書き方があります。
- 最後に、マイナスの数字は言語により、 -100、100-、(100)、または[100]と表記方法が異なります。
**日付**
@@ -284,7 +290,7 @@ ethereum.orgには、世界中から、さまざまな背景を持った訪問
- 原則として、単位はソースと同じにします。 あなたの国が別の単位を使用している場合は、括弧内に変換した数値と単位を記載することができます。
- 測定単位以外にも、言語によるこれらの単位の表記方法の違いについても注意することも重要です。 主には、数字と単位のスペースが言語により異なります。 例: 100kBと100 kB、 50ºFと50 ºFなど
-## まとめ {#conclusion}
+## 結論 {#conclusion}
ethereum.orgを翻訳することでイーサリアムのさまざまな側面について学ぶことができます。
diff --git a/public/content/translations/ja/dao/index.md b/public/content/translations/ja/dao/index.md
index c8bcea98654..8ffbf3f879d 100644
--- a/public/content/translations/ja/dao/index.md
+++ b/public/content/translations/ja/dao/index.md
@@ -1,15 +1,16 @@
---
-title: 分散型自律組織(DAO)
-description: イーサリアムにおける分散型自律組織(DAO)の概要
+title: "DAOとは何ですか?"
+metaTitle: "DAOとは何ですか? | 分散型自律組織"
+description: "イーサリアムにおける分散型自律組織(DAO)の概要"
lang: ja
template: use-cases
emoji: ":handshake:"
sidebarDepth: 2
image: /images/use-cases/dao-2.png
-alt: 提案に対する分散型自律組織(DAO)投票
-summaryPoint1: 中央集権的な制御がない、メンバー所有のコミュニティ
-summaryPoint2: インターネットの見知らぬ人と協力する安全な方法
-summaryPoint3: 特定の目的に資金を委ねるのに安全な場所
+alt: "提案に対する分散型自律組織(DAO)投票"
+summaryPoint1: "中央集権的な制御がない、メンバー所有のコミュニティ"
+summaryPoint2: "インターネットの見知らぬ人と協力する安全な方法"
+summaryPoint3: "特定の目的に資金を委ねるのに安全な場所"
---
## 自律分散組織(DAO)とは {#what-are-daos}
@@ -18,41 +19,41 @@ DAOは、共通の目的のために行動する、集団所有された組織
分散型自律組織(DAO)は資金や運営の管理において、誰かを信用することなく、世界中の同じ志を持つ人々と共に働くことを可能します。 気まぐれに資金を使い込むCEOはいませんし、帳簿を操作できるCFOもいません。 誰かを依存・信用するのではなく、ブロックチェーンベースのルールがコード化され、組織の運営や資金の使われ方を定義しています。
-グループの承認なしには誰もアクセスできない資金が組み込まれています。 意思決定は、提案と投票によって行われ、組織内の誰しもが発言権を持つことが保障されています。また、全て[オンチェーン](/glossary/#on-chain)で行われるため、透明性も確保されています。
+グループの承認なしには誰もアクセスできない資金が組み込まれています。 決定は提案と投票によって管理され、組織内の全員が発言権を持ち、すべてが透明に[オンチェーン](/glossary/#onchain)で行われることが保証されています。
## 分散型自律組織(DAO)が必要な理由 {#why-dao}
-組織を誰かと一緒に組織を立ち上げるには、資金やお金が関わるため、相手との信頼関係が必要になります。 しかし、インターネット上でしか交流のない人を信用するのは難しいと思います。 分散型自律組織(DAO)では、グループ内の他の誰かを信用する必要はなく、100%透明で誰でも検証可能なコードだけを信用すれば大丈夫です。
+資金や金銭が関わる組織を誰かと一緒に立ち上げるには、一緒に働く人々との間に多くの信頼が必要になります。 しかし、インターネット上でしか交流のない人を信用するのは難しいと思います。 分散型自律組織(DAO)では、グループ内の他の誰かを信用する必要はなく、100%透明で誰でも検証可能なコードだけを信用すれば大丈夫です。
これにより、グローバルなコラボレーションやコーディネーションに新たな可能性が広がりました。
### 比較 {#dao-comparison}
-| 分散型自律組織(DAO) | 従来の組織 |
-| ----------------------------------------- | ----------------------------------------------- |
-| 通常はフラットな組織で、完全に民主化 | 通常は階層的 |
-| 変更を実行するには、メンバーによる投票が必要 | 組織構造によっては、単独の当事者から変更が要求されることがあり、または投票が行われる場合がある |
-| 投票は集計され、結果は信頼できる仲介者なしに自動的に実行される | 投票が可能な場合、投票は内部で集計され、投票結果は手動での処理が必要 |
+| 自律分散型組織 | 従来の組織 |
+| ------------------------------------------------------------ | ----------------------------------------------- |
+| 通常はフラットな組織で、完全に民主化 | 通常は階層的 |
+| 変更を実行するには、メンバーによる投票が必要 | 組織構造によっては、単独の当事者から変更が要求されることがあり、または投票が行われる場合がある |
+| 投票は集計され、結果は信頼できる仲介者なしに自動的に実行される | 投票が可能な場合、投票は内部で集計され、投票結果は手動での処理が必要 |
| 提供されるサービスは、自動的に分散化された方法で処理される(例えば慈善資金の分配) | 人間による処理、または集中管理された自動化を必要とし、改ざんされるおそれがある |
-| すべてのアクティビティは透明で完全に公開 | 通常、アクティビティは非公開で、一般には非公開 |
+| すべてのアクティビティは透明で完全に公開 | 通常、アクティビティは非公開で、一般には非公開 |
-### 分散型自律組織(DAO)の事例 {#dao-examples}
+### DAOの例 {#dao-examples}
もう少し理解を深められるように、分散型自律組織(DAO)の使用方法についていくつか例をご紹介します。
- **慈善事業** – 世界中の誰からでも寄付を受け付け、資金の使い道を投票にて決定可能。
-- **共同所有**– 物理的またはデジタル資産を購入し、メンバーは資産の活用方法について投票できる。
-- **ベンチャーキャピタルと助成金** - 投資資金をプールし、投票により支援先ベンチャーを選択する、ベンチャーファンドを作成可能。 返済金は後に分散型自律組織(DAO)のメンバー間で再配分できる。
+- **共同所有** – 物理的またはデジタル資産を購入し、メンバーは資産の活用方法について投票できる。
+- **ベンチャーキャピタルと助成** – 投資資金をプールし、投票により支援先ベンチャーを選択、ベンチャーファンドを作成可能。 返済金は後に分散型自律組織(DAO)のメンバー間で再配分できる。
## 分散型自律組織(DAO)の仕組み {#how-daos-work}
-組織のルールを定義し、その組織の資産を保持している[スマートコントラクト](/glossary/#smart-contract)が、分散型自律組織(DAO) のバックボーンです。 このスマートコントラクトがイーサリアム上で稼働し始めると、投票以外では誰もルールを変更できません。 もし誰かがコードのルールやロジックでカバーされていないことを試みても失敗に終わります。 また、資産はスマートコントラクトによって定義されているため、グループの承認なしには誰も組織の資金を使うことができません。 つまり、分散型自律組織(DAO)は中央集権を必要とせず、 グループが集合的に決定を下し、投票が可決されると支払いが自動的に承認されます。
+DAOのバックボーンは、組織のルールを定義し、グループの財源を保持する[スマートコントラクト](/glossary/#smart-contract)です。 このスマートコントラクトがイーサリアム上で稼働し始めると、投票以外では誰もルールを変更できません。 もし誰かがコードのルールやロジックでカバーされていないことを試みても失敗に終わります。 また、資産はスマートコントラクトによって定義されているため、グループの承認なしには誰も組織の資金を使うことができません。 つまり、分散型自律組織(DAO)は中央集権を必要とせず、 グループが集合的に決定を下し、投票が可決されると支払いが自動的に承認されます。
これが可能なのは、スマートコントラクトがイーサリアム上で稼働すると、改ざんができないためです。 すべてが公開されているので、コード(分散型自律組織のルール)を誰にも気づかれずに、変更することはできません。
-## イーサリアムと分散型自律組織(DAO) {#ethereum-and-daos}
+## イーサリアムとDAO {#ethereum-and-daos}
イーサリアムは、次の理由から分散型自律組織(DAO)の完璧な基盤となります。
@@ -61,105 +62,105 @@ DAOは、共通の目的のために行動する、集団所有された組織
- スマートコントラクトは、資金の送受信が可能。 これができないと、グループ資金を管理する信頼できる仲介者が必要となる。
- イーサリアムのコミュニティは、競争的なものではなく、むしろ協調的であることが証明されており、最善の方法やサポートシステムが迅速に生みだされている。
-## 分散型自律組織(DAO)ガバナンス {#dao-governance}
+## DAOのガバナンス {#dao-governance}
分散型自律組織(DAO)のガバナンスには、投票や提案の仕組みなど様々な考慮事項があります。
-### デリゲーション(委任) {#governance-delegation}
+### 委任 {#governance-delegation}
デリゲーション(委任)とは、分散型自律組織版の議会制民主主義のようなものです。 トークン保有者は、プロトコルを管理し、最新情報を入手することにコミットする立候補者に投票権を委任します。
-#### 有名な事例 {#governance-example}
+#### 有名な例 {#governance-example}[ENS](https://claim.ens.domains/delegate-ranking) – ENS保有者は、自分たちの代表として、熱心なコミュニティメンバーに投票を委任できます。
-[ENS](https://claim.ens.domains/delegate-ranking) – ENS保有者は、自分たちの代表として、コミュニティメンバーに投票を委任できます。
-
-### 自動トランザクションガバナンス {#governance-example}
+### 自動取引ガバナンス {#governance-example}
多くの分散型自律組織(DAO)では、メンバーの賛成票が定足数を満たせば自動的にトランザクションが実行されます。
-#### 有名な事例 {#governance-example}
+#### 有名な例 {#governance-example}
[Nouns](https://nouns.wtf) – Nouns DAOでは、定足数を満たし、過半数が賛成票であれば、創設者が拒否権を行使しない限り、トランザクションは自動的に実行されます。
-### マルチシグガバナンス {#governance-example}
+### マルチシグ・ガバナンス {#governance-example}
-分散型自律組織(DAO)には投票権のあるメンバーが何千人も在籍するかもしれませんが、資金は5~20人のアクティブなメンバーが共有する[ウォレット](/glossary/#wallet)に保有されている場合があります。これらのメンバーは信用されており、通常は個人情報が公開されています(コミュニティに公的な身元が公開)。 投票の結果をもって、[マルチシグ](/glossary/#multisig)の署名者はコミュニティの意思を実施します。
+DAOには何千人もの投票メンバーがいる場合がありますが、資金は信頼され、通常はdoxxed(コミュニティに身元が公開されている)状態の5~20人のアクティブなコミュニティメンバーが共有する[ウォレット](/glossary/#wallet)に存在することがあります。 投票後、[multisig](/glossary/#multisig)署名者はコミュニティの意思を実行します。
-## 分散型自律組織(DAO)法 {#dao-laws}
+## DAOの法律 {#dao-laws}
1977年にワイオミング州は、起業家を保護し、責任を有限にする合同会社(LLC)を制定しました。 近年では、ワイオミング州は分散型自律組織(DAO)の法的地位を確立する法律を制定し、パイオニアとなっています。 現在、ワイオミング州、バーモント州、ヴァージン諸島に、何らかの形の分散型自律組織(DAO)法があります。
-### 有名な事例 {#law-example}
+### 有名な例 {#law-example}
-[CityDAO](https://citizen.citydao.io/) – CityDAOは、ワイオミング州の分散型自律組織(DAO)法を利用して、イエローストーン国立公園近くの40エーカーの土地を購入しました。
+[CityDAO](https://citizen.citydao.io/) – CityDAOはワイオミング州のDAO法を利用して、イエローストーン国立公園の近くにある40エーカーの土地を購入しました。
-## 分散型自律組織(DAO)のメンバーシップ {#dao-membership}
+## DAOのメンバーシップ {#dao-membership}
分散型自律組織(DAO)のメンバーシップにはいくつかのモデルがあります。 メンバーシップにより、投票の仕組みやDAOの他の重要な部分を決定することができます。
### トークンベースのメンバーシップ {#token-based-membership}
-使用されるトークンにもよりますが、通常は完全に[パーミッションレス](/glossary/#permissionless)です。 ほとんどの場合、これらのガバナンストークンは、[分散型取引所](/glossary/#dex)でパーミッションレスで取引できます。 それ以外のトークンは、流動性もしくはその他の「プルーフ・オブ・ワーク」を提供することで獲得する必要があります。 いずれにせよ、トークンの保持により投票権が付与されます。
+使用されるトークンによりますが、通常は完全に[パーミッションレス](/glossary/#permissionless)です。 ほとんどの場合、これらのガバナンストークンは、[分散型取引所](/glossary/#dex)でパーミッションレスに取引できます。 それ以外のトークンは、流動性もしくはその他の「プルーフ・オブ・ワーク」を提供することで獲得する必要があります。 いずれにせよ、トークンの保持により投票権が付与されます。
_一般的には、広範な分散型プロトコルやトークン自体を管理するために使用されます。_
-#### 有名な事例 {#token-example}
+#### 有名な例 {#token-example}
[MakerDAO](https://makerdao.com) – MakerDAOのトークンであるMKRは分散型取引所で広く入手可能で、購入することにより、誰でもMakerプロトコルの将来についての投票権を得ることができます。
-### シェアベースのメンバーシップ {#share-based-membership}
+### 株式ベースのメンバーシップ {#share-based-membership}
シェアベースの分散型自律組織(DAO)は、よりパーミッション型ではありますが、かなりオープンです。 分散型自律組織(DAO)への参加希望者は、トークンや作品といった何らかの価値のある物を提供することで、自分自身の参加を提案します。 シェアは、直接投票権と所有権を表します。 メンバーはいつでも、自分の保有する資産の持分を持って退会できます。
-_一般的には、慈善団体やワーカーズ・コレクティブ、投資クラブなど、より密接な関係を持つ人間が中心となる組織に使われています。 また、プロトコルやトークンも管理できます。_
+_一般的には、慈善団体やワーカーズ・コレクティブ、投資クラブなど、より密接な関係を持つ人間が中心となる組織に使われています。_ _また、プロトコルやトークンも管理できます。_
-#### 有名な事例 {#share-example}
+#### 有名な例 {#share-example}
-[MolochDAO](http://molochdao.com/) - MolochDAOは主にイーサリアムプロジェクトの資金調達を行っています。 メンバーになるには、提案が必要となります。この提案によって、あなたが助成先候補に関して、十分な情報に基づいて判断できるだけの必要な専門知識と資本を持っているかどうかが評価されます。 オープン市場で権利を購入するだけでは、この分散型自律組織(DAO)に参加することはできません。
+[MolochDAO](http://molochdao.com/) – MolochDAOは、イーサリアムプロジェクトへの資金提供に重点を置いています。 メンバーになるには、提案が必要となります。この提案によって、あなたが助成先候補に関して、十分な情報に基づいて判断できるだけの必要な専門知識と資本を持っているかどうかが評価されます。 オープン市場で権利を購入するだけでは、この分散型自律組織(DAO)に参加することはできません。
-### レピュテーション(評価・評判)ベースのメンバーシップ {#reputation-based-membership}
+### 評判ベースのメンバーシップ {#reputation-based-membership}
-レピュテーション(評価・評判)とは、分散型自律組織(DAO)における参加証明と投票権の付与を表します。 トークンやシェアベースのメンバーシップとは異なり、レピュテーションベースの分散型自律組織(DAO)は所有権をコントリビューターに譲渡しません。 レピュテーションは購入、移管、または委任できず、分散型自律組織メンバーは参加を通じてレピュテーションを構築する必要があります。 オンチェーン投票はパーミッションレスで、メンバー候補は分散型自律組織(DAO)への参加を自由に提案でき、貢献の対価としてレピュテーションやトークンを受け取ることを要求することができます。
+レピュテーション(評価・評判)とは、分散型自律組織(DAO)における参加証明と投票権の付与を表します。 トークンやシェアベースのメンバーシップとは異なり、レピュテーションベースの分散型自律組織(DAO)は所有権をコントリビューターに譲渡しません。 レピュテーションは購入、移管、または委任できず、分散型自律組織メンバーは参加を通じてレピュテーションを構築する必要があります。 オンチェーン投票は許可不要で、将来のメンバーは自由にDAOへの参加提案を提出し、貢献の対価として報酬として評判とトークンを受け取ることを要求できます。
-_主にプロトコルや[分散型アプリ(Dapp)](/glossary/#dapp)の分散型開発や分散型ガバナンスに利用されていますが、慈善団体、ワーカーズ・コレクティブ、投資クラブなど、多様な組織にも向いています。_
+_主にプロトコルや[dapps](/glossary/#dapp)の分散型開発とガバナンスに利用されますが、慈善団体、ワーカーズコレクティブ、投資クラブといった多様な組織にもよく適しています。_
-#### 有名な事例 {#reputation-example}
+#### 有名な例 {#reputation-example}
-[DXdao](https://DXdao.eth.limo) - DXdaoは、2019年から分散型プロトコルやアプリケーションを構築し統治するグローバル・ソブリン団体でした。 レピュテーションに基づくガバナンスと[ホログラフィック・コンセンサス](/glossary/#holographic-consensus)を活用して資金を調整・管理することで、誰かが金銭的な手段を使って、DXdaoの今後に影響をおよぼしたり、支配したりすることはできませんでした。
+[DXdao](https://DXdao.eth.limo) – DXdaoは、2019年から分散型プロトコルやアプリケーションを構築・管理する、世界的な主権を持つコレクティブでした。 評判に基づくガバナンスと[ホログラフィック・コンセンサス](/glossary/#holographic-consensus)を活用して資金を調整・管理することで、誰も金銭的な手段を使ってその将来やガバナンスに影響を及ぼすことはできませんでした。
-## DAOに参加する/DAOを立ち上げる {#join-start-a-dao}
+## DAOへの参加/DAOの設立 {#join-start-a-dao}
-### 分散型自律組織(DAO)への参加 {#join-a-dao}
+### DAOに参加する {#join-a-dao}
-- [イーサリアムコミュニティ分散型自律組織(DAO)](/community/get-involved/#decentralized-autonomous-organizations-daos)
-- [DAOHausの分散型自律組織(DAO)リスト](https://app.daohaus.club/explore)
-- [Tally.xyzの分散型自律組織(DAO)リスト](https://www.tally.xyz)
+- [イーサリアムコミュニティのDAO](/community/get-involved/#decentralized-autonomous-organizations-daos)
+- [DAOHausのDAOリスト](https://app.daohaus.club/explore)
+- [Tally.xyzのDAOリスト](https://www.tally.xyz/explore)
+- [DeGov.AIのDAOリスト](https://apps.degov.ai/)
-### 分散型自律組織(DAO)を始める {#start-a-dao}
+### DAOを始める {#start-a-dao}
-- [DAOHausで分散型自律組織(DAO)を招集](https://app.daohaus.club/summon)
-- [TallyでGovernor DAOを始める](https://www.tally.xyz/add-a-dao)
-- [Aragonによる分散型自律組織(DAO)を作成](https://aragon.org/product)
+- [DAOHausでDAOを召喚する](https://app.daohaus.club/summon)
+- [TallyでGovernor DAOを始める](https://www.tally.xyz/get-started)
+- [Aragonを利用してDAOを作成する](https://aragon.org/product)
- [コロニーを始める](https://colony.io/)
-- [DAOstackのホログラフィック・コンセンサスでDAOを作成](https://alchemy.daostack.io/daos/create)
+- [DAOstackのホログラフィック・コンセンサスでDAOを作成する](https://alchemy.daostack.io/daos/create)
+- [DeGov LauncherでDAOを立ち上げる](https://docs.degov.ai/integration/deploy)
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-### 分散型自律組織(DAO)の関連記事 {#dao-articles}
+### DAO関連の記事 {#dao-articles}
-- [分散型自律組織(DAO)とは](https://aragon.org/dao) – [Aragon](https://aragon.org/)
-- [分散型自律組織(DAO)](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/)
-- [分散型自律組織(DAO)とは、およびその目的](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) – [DAOhaus](https://daohaus.club/)
-- [分散型自律組織(DAO)のデジタルコミュニティの作成方法](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/)
-- [分散型自律組織(DAO)とは](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com)
-- [ホログラフィック・コンセンサスとは](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/)
-- [分散型自律組織(DAO)とは企業ではなく、分散型の自律組織 – Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html)
-- [分散型自律組織(DAO)、分散型自律企業(DAC)、分散型アプリケーション(DA)など: 不完全な用語集](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [イーサリアムブログ](https://blog.ethereum.org)
+- [DAOとは?](https://aragon.org/dao) – [Aragon](https://aragon.org/)
+- [House of DAOs](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/)
+- [DAOとは何か、何のためのものか?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) – [DAOhaus](https://daohaus.club/)
+- [DAOを活用したデジタルコミュニティの始め方](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/)
+- [DAOとは?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com)
+- [ホログラフィック・コンセンサスとは?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/)
+- [DAOは企業ではない:自律的組織における分散化の重要性 (ヴィタリック筆)](https://vitalik.eth.limo/general/2022/09/20/daos.html)
+- [DAO、DAC、DAなど:不完全な用語ガイド](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [イーサリアムブログ](https://blog.ethereum.org)
-### ビデオ {#videos}
+### 動画 {#videos}
-- [仮想通貨における分散型自律組織(DAO)とは](https://youtu.be/KHm0uUPqmVE)
-- [分散型自律組織(DAO)で街はつくれるのか?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) – [TED](https://www.ted.com/)
+- [暗号資産におけるDAOとは?](https://youtu.be/KHm0uUPqmVE)
+- [DAOは都市を建設できるか?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) – [TED](https://www.ted.com/)
diff --git a/public/content/translations/ja/decentralized-identity/index.md b/public/content/translations/ja/decentralized-identity/index.md
index 9818baaf876..12f60ee812f 100644
--- a/public/content/translations/ja/decentralized-identity/index.md
+++ b/public/content/translations/ja/decentralized-identity/index.md
@@ -1,25 +1,25 @@
---
-title: 分散型アイデンティティ
-description: 分散型アイデンティティとは、またこれが重要な理由
+title: "分散型アイデンティティ"
+description: "分散型アイデンティティとは、またこれが重要な理由"
lang: ja
template: use-cases
emoji: ":id:"
sidebarDepth: 2
image: /images/eth-gif-cat.png
-summaryPoint1: 身元を証明するIDは中央集権的に発行、更新、管理されてきた従来のアイデンティティ制度
-summaryPoint2: 分散型アイデンティティにより、中央集権的なサードパーティへの依存から脱却
-summaryPoint3: 暗号技術により、今や再び自分自身のIDとアテステーションを発行、保持、管理することが可能
+summaryPoint1: "身元を証明するIDは中央集権的に発行、更新、管理されてきた従来のアイデンティティ制度"
+summaryPoint2: "分散型アイデンティティにより、中央集権的なサードパーティへの依存から脱却"
+summaryPoint3: "暗号技術により、今や再び自分自身のIDとアテステーションを発行、保持、管理することが可能"
---
身分を証明するアイデンティティは、今日の生活のほぼすべての側面の基盤となっています。 オンラインサービスの利用、銀行口座の開設、選挙での投票、不動産の購入、雇用の確保、これらすべてにおいて身分証明が必要です。
-しかし、従来の身分証明書管理システムは、IDと[アテステーション](/glossary/#attestation)を発行、保有、管理する中央管理型の仲介機関に長く依存してきました。 つまり、自分の身元証明に関する情報を自分自身で管理したり、誰が個人を特定できる情報(PII)にアクセスできるか、またこれらの機関がどのくらいアクセス権を持っているかを決めることはできないということです。
+しかし、従来のID管理システムは、IDと[アテステーション](/glossary/#attestation)を発行、保有、管理する中央集権型の仲介機関に長く依存してきました。 つまり、自分の身元証明に関する情報を自分自身で管理したり、誰が個人を特定できる情報(PII)にアクセスできるか、またこれらの機関がどのくらいアクセス権を持っているかを決めることはできないということです。
-こうした問題を解決するために、イーサリアムのようなパブリックブロックチェーン上に分散型アイデンティティシステムを構築しています。 分散型アイデンティティでは、自分の身元証明に関する情報を管理することができます。 サービスプロバイダーや政府などの中央機関に依存することなく、_自分自身で_身分証明を作成し、本人であるというアテステーションを主張・保持することができます。
+こうした問題を解決するために、イーサリアムのようなパブリックブロックチェーン上に分散型アイデンティティシステムを構築しています。 分散型アイデンティティでは、自分の身元証明に関する情報を管理することができます。 分散型IDソリューションを使えば、サービスプロバイダーや政府のような中央機関に頼ることなく、_あなた_がIDを作成し、自分のアテステーションを請求・保持できます。
## アイデンティティとは? {#what-is-identity}
-アイデンティティとは、自分が自分であるという自覚で、その人が誰であるかということを表す性質や特徴により定義されます。 アイデンティティとは、_個_であること、すなわち一人の確たる人間存在であることを意味します。 またアイデンティティは、組織や行政機関などのように人間ではない存在を指すこともあります。
+アイデンティティとは、自分が自分であるという自覚で、その人が誰であるかということを表す性質や特徴により定義されます。 「アイデンティティ」とは、_個人_であること、すなわち、個別の人間存在であることを指します。 またアイデンティティは、組織や行政機関などのように人間ではない存在を指すこともあります。
@@ -35,67 +35,93 @@ summaryPoint3: 暗号技術により、今や再び自分自身のIDとアテス
上記のような例では、IDは中央機関や組織により発行、保持、管理されています。 氏名の変更には政府からの、ユーザー名の変更にはソーシャルメディアからの承認が必要です。
-## 分散型アイデンティティの利点 {#benefits-of-decentralized-identity}
+## 分散型IDのメリット {#benefits-of-decentralized-identity}
1. 分散型アイデンティティは、自分自身のID情報をより管理することができます。 中央集権機関やサードパーティのサービスに依存することなく、分散型IDとアテステーションを検証することができます。
-2. 分散型アイデンティティのソリューションは、信頼性が高く、シームレスで、プライバシーを保護しつつ、ユーザーのアイデンティティの検証と管理を容易にします。
+2. 分散型IDソリューションは、ユーザーのIDを検証・管理するための、信頼を必要としない (トラストレスな) 、シームレスでプライバシーを保護する方法を容易にします。
3. 分散型アイデンティティは、ブロックチェーン技術を活用し、異なる当事者間の信頼関係を構築し、暗号的にアテステーションの正当性を証明することができます。
-4. 分散型アイデンティティは、アイデンティティデータのポータブル化を実現します。 ユーザーは、アテステーションとIDをモバイルウォレットに保存し、任意の相手と共有することができます。 分散型IDとアテステーションは、発行組織のデータベースに保管されることはありません。
+4. 分散型アイデンティティは、アイデンティティデータのポータブル化を実現します。 ユーザーは、アテステーションとIDをモバイルウォレットに保存し、任意の相手と共有できます。 分散型IDとアテステーションは、発行組織のデータベースに保管されることはありません。
-5. 分散型アイデンティティは、新しい[ゼロ知識証明](/glossary/#zk-proof)技術とうまく機能すると考えられています。ゼロ知識証明とは、個人の所有または何かを行ったことを、それが何であるかを明かすことなく証明できるものです。 これは、投票などのアプリケーションでの応用において、信頼性とプライバシーを両立させる強力な方法となる可能性を秘めています。
+5. 分散型IDは、個人がそれが何であるかを明かすことなく、何かを所有している、あるいは何かを成し遂げたことを証明できる、新しい[ゼロ知識](/glossary/#zk-proof)技術とうまく連携するはずです。 これは、投票などのアプリケーションでの応用において、信頼性とプライバシーを両立させる強力な方法となる可能性を秘めています。
-6. 分散型アイデンティティは、[耐シビル](/glossary/#anti-sybil)メカニズムを実現するため、一人の人間が複数の人間になりすました操作やスパムを防ぐことができます。
+6. 分散型IDは、[アンチシビル](/glossary/#anti-sybil)メカニズムを可能にし、一個人がシステムを悪用したりスパム行為をしたりするために複数の人間になりすましているのを識別します。
-## 分散型アイデンティティのユースケース {#decentralized-identity-use-cases}
+## 分散型IDのユースケース {#decentralized-identity-use-cases}
分散型アイデンティティには、多くの潜在的なユースケースがあります。
### 1. ユニバーサルログイン {#universal-dapp-logins}
-分散型アイデンティティは、パスワードベースのログインを分散型認証に置き換えるのに役立ちます。 サービスプロバイダーは、アテステーションを発行することができ、ユーザーはそれをイーサリアムのウォレットに保存できます。 アテステーションの例としては、[非代替性トークン(NFT)](/glossary/#nft)保有者にオンラインコミュニティへのアクセスを許可することなどが挙げられます。
+分散型アイデンティティは、パスワードベースのログインを分散型認証に置き換えるのに役立ちます。 サービスプロバイダーは、アテステーションを発行することができ、ユーザーはそれをイーサリアムのウォレットに保存できます。 アテステーションの例として、保有者にオンラインコミュニティへのアクセスを許可する[NFT](/glossary/#nft)が挙げられます。
-[イーサリアムでサインイン](https://siwe.xyz/)機能を使うと、サーバはユーザーのイーサリアムアカウントを確認し、アカウントアドレスから必要なアテステーションを取得することができます。 これにより、ユーザーは長いパスワードを記憶することなくプラットフォームやウェブサイトにアクセスでき、オンライン・エクスペリエンスを向上させることができます。
+[Sign-In with Ethereum](https://siwe.xyz/)機能により、サーバーはユーザーのEthereumアカウントを確認し、そのアカウントアドレスから必要なアテステーションを取得できるようになります。 これにより、ユーザーは長いパスワードを記憶することなくプラットフォームやウェブサイトにアクセスでき、オンライン・エクスペリエンスを向上させることができます。
### 2. KYC認証 {#kyc-authentication}
オンラインサービスの多くを利用するには、運転免許証やパスポートなどのアテステーションを提出する必要があります。 しかし、この方法では、ユーザーの個人情報が漏洩するおそれがあり、サービスプロバイダーはアテステーションの正当性を確認できないという問題があります。
-分散型アイデンティティにより、企業は従来の[本人確認(KYC)](https://en.wikipedia.org/wiki/Know_your_customer)プロセスを省略し、検証可能な資格情報を利用してユーザーのアイデンティティを認証することができます。 これにより、ID管理のコストを削減し、偽造文書の使用を防ぐことができます。
+分散型IDにより、企業は従来の[顧客確認 (KYC)](https://en.wikipedia.org/wiki/Know_your_customer)プロセスを省略し、検証可能な資格情報を使ってユーザーIDを認証できます。 これにより、ID管理のコストを削減し、偽造文書の使用を防ぐことができます。
### 3. 投票とオンラインコミュニティ {#voting-and-online-communities}
-オンライン投票とソーシャルメディアは、分散型アイデンティティの新しい適用です。 オンライン投票の仕組みでは、悪意ある者が偽のIDを作成し投票することで、改ざんされるおそれがあります。 個人に対してオンチェーン・アテステーションを求めることで、オンライン投票プロセスの信頼性を向上できます。
+オンライン投票とソーシャルメディアは、分散型アイデンティティの新しい適用です。 オンライン投票の仕組みでは、悪意ある者が偽のIDを作成し投票することで、改ざんされるおそれがあります。 個人にオンチェーンのアテステーションの提示を求めることで、オンライン投票プロセスの健全性を向上させることができます。
-分散型アイデンティティは、偽アカウントのないオンラインコミュニティの構築に役立ちます。 例えば、ENS(イーサリアム・ネーム・サービス)のようなオンチェーンのアイデンティティシステムを使って認証させることで、ボットを減らすことができる可能性があります。
+分散型アイデンティティは、偽アカウントのないオンラインコミュニティの構築に役立ちます。 例えば、各ユーザーがEthereum Name ServiceのようなオンチェーンのIDシステムを使って本人認証を行うことで、ボットの可能性を減らせるかもしれません。
-### 4. シビル攻撃の防御 {#sybil-protection}
+### 4. アンチシビル対策 {#sybil-protection}
-[クアドラティック・ボーティング](/glossary/#quadratic-voting)を用いた助成金授与アプリケーションでは、より多くの投票が集まることで助成金の価値が上がり、多くのIDを使って寄付するというインセンティブが働くため、[シビル攻撃](/glossary/#sybil-attack)を受けやすくなっています。 分散型アイデンティティは、多くの場合、特定の個人情報を明らかにすることなく、各参加者自身が機械ではなく本当に人間であることを証明するという負担を高めることで、シビル攻撃の防止に役立ちます。
+[クアドラティック・ボーティング](/glossary/#quadratic-voting)を使用する助成金提供アプリケーションは、[シビル攻撃](/glossary/#sybil-attack)に対して脆弱です。なぜなら、より多くの個人が投票すると助成金の価値が上がり、ユーザーが多くのIDに貢献を分割するインセンティブが働くからです。 分散型アイデンティティは、多くの場合、特定の個人情報を明らかにすることなく、各参加者自身が機械ではなく本当に人間であることを証明するという負担を高めることで、シビル攻撃の防止に役立ちます。
+
+### 5. 国および政府のID {#national-and-government-id}
+
+政府は、分散型IDの原則を用いて、国民ID、パスポート、運転免許証などの基本的な身分証明書をEthereum上の検証可能な資格情報として発行し、オンラインでの本人確認における詐欺や偽造を減らすための強力な暗号学的真正性保証を提供できます。 市民はこれらのアテステーションを個人の[ウォレット](/wallets/)に保存し、身元、年齢、または投票権を証明するために使用できます。
+
+このモデルは、特に[ゼロ知識証明 (ZKP)](/zero-knowledge-proofs/) プライバシー技術と組み合わせることで、選択的開示を可能にします。 例えば、市民は、従来のIDよりも高いプライバシーを提供し、正確な生年月日を明かすことなく、年齢制限のあるサービスにアクセスするために18歳以上であることを暗号技術によって証明できます。
+
+#### 💡ケーススタディ: Ethereum上のブータン国民デジタルID (NDI) {#case-study-bhutan-ndi}
+
+- ブータンの約80万人の国民に、検証可能なID資格情報へのアクセスを提供
+- 2025年10月にPolygonネットワークから[Ethereumメインネット](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878)に移行
+- 2025年3月時点で[234,000件以上](https://www.blockchain-council.org/blockchain/bhutan-uses-blockchain-in-digital-id-project/)のデジタルIDを発行
+
+ブータン王国は、2025年10月に[国民デジタルID (NDI) システムをEthereumに移行しました](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878)。 分散型IDと自己主権型IDの原則に基づいて構築されたブータンのNDIシステムは、分散型IDと検証可能な資格情報を使用して、デジタル署名された資格情報を市民の個人ウォレットに直接発行します。 これらの資格情報の暗号学的証明をEthereum上に固定することで、システムはそれらが本物で改ざん不可能であり、中央機関に問い合わせることなくどの当事者でも検証できることを保証します。
+
+このシステムのアーキテクチャは、[ゼロ知識証明 (ZKP)](/zero-knowledge-proofs/) 技術の使用を通じてプライバシーを重視しています。 この「選択的開示」の実装により、市民は完全なID番号や正確な生年月日などの基礎となる個人データを明かすことなく、サービスにアクセスするために特定の事実 (例:「私は18歳以上です」または「私は国民です」) を証明できます。 これは、安全でユーザー中心、かつプライバシーを保護する国民IDシステムのための、Ethereumの強力な実世界での使用例を示しています。
+
+#### 💡ケーススタディ: Ethereumの[レイヤー2](/layer-2/)であるZKSync Era上のブエノスアイレス市のQuarkID {#case-study-buenos-aires-quarkid}
+
+- ローンチ時に[360万人以上のユーザー](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo)に分散型ID資格情報を発行
+- QuarkIDは、国連の持続可能な開発目標の下で[デジタル公共財](https://www.digitalpublicgoods.net/r/quarkid)として認識されているオープンソースプロトコルです
+- 市がプロトコルを所有せず、市民に完全なデータ所有権とプライバシーを与える「[ユーザーとしての政府](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo)」モデルを強調
+
+2024年、ブエノスアイレス市政府 (GCBA) は、GCBAのイノベーション・デジタル変革事務局が構築したオープンソースの「デジタル信頼フレームワーク」であるQuarkIDを、住民が政府サービスや公式文書にアクセスするための市の公式アプリであるmiBAに統合しました。 ローンチ時、miBAの360万人以上の全ユーザーに分散型デジタルIDが発行され、市民権の証明書、出生、結婚、死亡証明書、納税記録、ワクチン接種記録など、検証可能なデジタル文書や証明書をオンチェーンで管理・共有できるようになりました。
+
+Ethereumの[レイヤー2](/layer-2/)ネットワークであるZKSync Era上に構築されたQuarkIDシステムは、ZKP技術を使用して、市民が不必要な個人データを公開することなく、モバイルデバイスを通じてピアツーピアで個人の資格情報を検証できるようにします。 このプログラムは、GCBAが中央集権的な所有者としてではなく、オープンソースで相互運用可能なQuarkIDプロトコルの1ユーザーとして機能する「ユーザーとしての政府」モデルを強調しています。 このZKP対応アーキテクチャは、重要なプライバシー機能を提供します。第三者、GCBAでさえも、市民がいつ、どこで、なぜ資格情報を使用したかを追跡することはできません。 この成功したプログラムは、市民に完全な自己主権型IDと機密データに対する管理権を提供し、そのすべてがEthereumの世界的に分散したネットワークによって保護されています。
## アテステーションとは {#what-are-attestations}
アテステーションとは、ある存在が別の存在に対して行われる証明を意味します。 例えばアメリカに住んでいる場合、車両管理局(ある存在)が、あなた(別の存在)が合法的に車の運転を許可されているということを証明するために運転免許証を発行します。
-アテステーションは身分を証明するIDとは異なります。 アテステーションには、_特定のアイデンティティを参照するためのIDを含み_、また当該アイデンティティに関連する属性についても証します。 つまり、運転免許証には身分を証明するID(氏名、生年月日、住所)が含まれ、同時に、運転できるという法的権利(属性)に関しても証明します。
+アテステーションは身分を証明するIDとは異なります。 アテステーションは、特定のアイデンティティを参照するためのIDを_含み_、このアイデンティティに関連する属性についての主張を行います。 つまり、運転免許証には身分を証明するID(氏名、生年月日、住所)が含まれ、同時に、運転できるという法的権利(属性)に関しても証明します。
### 分散型IDとは {#what-are-decentralized-identifiers}
氏名やメールアドレスといった従来のIDは、政府やメールプロバイダーといったサードパーティに依存します。 分散型ID (DID)は、中央集権組織により発行、管理、制御されないという点で異なります。
-分散型IDは、自分自身で発行、保有、管理することができます。 [イーサリアムアカウント](/glossary/#account)は、分散型IDの一例です。 誰からの許可も不要で、また中央台帳に保存する必要もなく、好きなだけアカウントを作成することができます。
+分散型IDは、自分自身で発行、保有、管理することができます。 [Ethereumアカウント](/glossary/#account)は、分散型IDの一例です。 誰からの許可も不要で、また中央台帳に保存する必要もなく、好きなだけアカウントを作成することができます。
-分散型IDは、分散型台帳([ブロックチェーン](/glossary/#blockchain))や[ピアツーピアネットワーク](/glossary/#peer-to-peer-network)に格納されるため、 分散型IDは[世界的に一意で、高い可用性で解決可能で、暗号技術で検証可能](https://w3c-ccg.github.io/did-primer/)なものです。 分散型IDは、人、組織、政府機関など、さまざまなエンティティに関連付けることができます。
+分散型IDは、分散型台帳 ([ブロックチェーン](/glossary/#blockchain)) や[ピアツーピア・ネットワーク](/glossary/#peer-to-peer-network)に保存されます。 これにより、DIDは[世界的に一意で、高い可用性で解決可能で、暗号技術によって検証可能](https://w3c-ccg.github.io/did-primer/)になります。 分散型IDは、人、組織、政府機関など、さまざまなエンティティに関連付けることができます。
-## 分散型IDを実現する技術 {#what-makes-decentralized-identifiers-possible}
+## 分散型IDを実現する技術 分散型IDを可能にするもの {#what-makes-decentralized-identifiers-possible}
### 1. 公開鍵暗号 {#public-key-cryptography}
-公開鍵暗号とは、あるエンティティに対して[公開鍵](/glossary/#public-key)と[秘密鍵](/glossary/#private-key)を生成する情報セキュリティのことです。 公開鍵の[暗号技術](/glossary/#cryptography)は、ブロックチェーンネットワークにおいて、ユーザーの身分を認証し、デジタル資産の所有権を証明するために使用されます。
+公開鍵暗号は、エンティティに対して[公開鍵](/glossary/#public-key)と[秘密鍵](/glossary/#private-key)を生成する情報セキュリティ対策です。 公開鍵[暗号](/glossary/#cryptography)は、ブロックチェーンネットワークにおいて、ユーザーIDを認証し、デジタル資産の所有権を証明するために使用されます。
-イーサリアムアカウントなどの分散型IDには、公開鍵と秘密鍵があるものがあります。 公開鍵はアカウントのコントローラを識別し、秘密鍵はこのアカウントのメッセージに署名および復号化します。 公開鍵暗号は、[暗号署名](https://andersbrownworth.com/blockchain/public-private-keys/)を使用してすべての主張を検証することにより、エンティティを認証し、なりすましや偽のIDの使用を防ぎます。
+イーサリアムアカウントなどの分散型IDには、公開鍵と秘密鍵があるものがあります。 公開鍵はアカウントのコントローラを識別し、秘密鍵はこのアカウントのメッセージに署名および復号化します。 公開鍵暗号は、[暗号署名](https://andersbrownworth.com/blockchain/public-private-keys/)を使用してすべての主張を検証することで、エンティティを認証し、なりすましや偽のIDの使用を防ぐために必要な証明を提供します。
### 2. 分散型データストア {#decentralized-datastores}
@@ -107,7 +133,7 @@ summaryPoint3: 暗号技術により、今や再び自分自身のIDとアテス
分散型アイデンティティとは、アイデンティティに関連する情報は自己管理され、プライベートでポータブルであるべきという考え方であり、分散型IDとアテステーションにより成り立っています。
-分散型アイデンティティの文脈では、アテステーション([検証可能な資格情報](https://www.w3.org/TR/vc-data-model/))とは、改ざんできず、暗号学的に検証できる発行者の主張です。 エンティティ(組織など)が発行するすべてのアテステーション、すなわち検証可能な資格情報は、その分散型ID (DID)と紐づけられます。
+分散型IDの文脈において、アテステーション (別名[検証可能な資格情報](https://www.w3.org/TR/vc-data-model/)) は、発行者によってなされる、改ざん不可能で暗号技術によって検証可能な主張です。 エンティティ(組織など)が発行するすべてのアテステーション、すなわち検証可能な資格情報は、その分散型ID (DID)と紐づけられます。
分散型ID (DID)はブロックチェーンに保存されるため、発行者のDIDをイーサリアム上で照合すれば、誰でもアテステーションの正当性を確認することができます。 基本的に、イーサリアムのブロックチェーンは、特定のエンティティに関連する分散型IDの検証を可能にするグローバルディレクトリのように機能します。
@@ -115,77 +141,78 @@ summaryPoint3: 暗号技術により、今や再び自分自身のIDとアテス
また、分散型IDは個人情報のプライバシーを保護する上でも非常に重要になります。 例えば、個人がアテステーション(運転免許証)を提出する場合、検証者は証明書の情報の正当性を確認する必要はありません。 検証者は、アテステーションの正当性の暗号学的な保証と、発行組織のアイデンティティだけで証明書の正当性を判断できます。
-## 分散型アイデンティティにおけるアテステーションの種類 {#types-of-attestations-in-decentralized-identity}
+## 分散型IDにおけるアテステーションの種類 {#types-of-attestations-in-decentralized-identity}
イーサリアムベースの分散型アイデンティティにおいては、アテステーション情報をどのように保存し、取得するかは、従来のアイデンティティ管理とは異なります。 ここでは、分散型IDシステムにおけるアテステーションの発行、保管、検証のためのさまざまなアプローチの概要を説明します。
-### オフチェーン・アテステーション {#off-chain-attestations}
+### オフチェーンアテステーション {#offchain-attestations}
-アテステーションをオンチェーンで保存する場合の懸念点として、個人が秘密にしたい情報が含まれている可能性があることが挙げられます。 イーサリアムのブロックチェーンはパブリックな性質を持っているため、個人情報が含まれるアテステーションを保存することは望ましくありません。
+アテステーションをオンチェーンで保存する際の懸念の1つは、個人が非公開にしておきたい情報が含まれている可能性があることです。 イーサリアムのブロックチェーンはパブリックな性質を持っているため、個人情報が含まれるアテステーションを保存することは望ましくありません。
-解決策としては、ユーザーがオフチェーンでデジタルウォレットに保有し、オンチェーンで保存されている発行者の分散型ID (DID)で署名されたアテステーションを発行することです。 これらのアテステーションは[JSONウェブトークン](https://en.wikipedia.org/wiki/JSON_Web_Token)としてエンコードされ、発行者のデジタル署名を含んでいるため、オフチェーンでの主張を簡単に検証することができます。
+解決策は、ユーザーがオフチェーンのデジタルウォレットで保持し、発行者のオンチェーンに保存されたDIDで署名されたアテステーションを発行することです。 これらのアテステーションは、[JSON Web Token](https://en.wikipedia.org/wiki/JSON_Web_Token)としてエンコードされ、発行者のデジタル署名を含んでいるため、オフチェーンでの主張を簡単に検証できます。
-ここで、仮想シナリオを用いてオフチェーン・アテステーションの説明します。
+オフチェーンアテステーションを説明するための、仮説のシナリオを以下に示します:
1. 大学(発行者)は証明書(デジタル学術証明書)を生成し、大学の鍵で署名し、ボブ(アイデンティティ所有者)に発行します。
2. ボブは就職活動で、自分の学歴を雇用主に証明するため、モバイルウォレットからアテステーションを共有します。 企業(検証者)は、発行者の分散型ID (イーサリアム上の公開鍵)を確認することで、アテステーションの正当性を確認することができます。
-### 永続的なアクセスによるオフチェーン・アテステーション {#offchain-attestations-with-persistent-access}
+### 永続的アクセスが可能なオフチェーンアテステーション {#offchain-attestations-with-persistent-access}
-この方式のアテステーションでは、JSONファイルに変換され、オフチェーンに保存されます(理想的には、IPFSやSwarmなどの [分散型クラウドストレージ](/developers/docs/storage/) プラットフォーム上)。 ただし、JSONファイルの[ハッシュ](/glossary/#hash)はオンチェーンに保存され、オンチェーンレジストリ経由で分散型IDにリンクされています。 紐づけられる分散型IDは、アテステーションの発行者または受取人のどちらかのものであることがあります。
+この方式では、アテステーションはJSONファイルに変換され、オフチェーン (理想的にはIPFSやSwarmなどの[分散型クラウドストレージ](/developers/docs/storage/)プラットフォーム) に保存されます。 しかし、JSONファイルの[ハッシュ](/glossary/#hash)はオンチェーンに保存され、オンチェーンレジストリを介してDIDにリンクされます。 紐づけられる分散型IDは、アテステーションの発行者または受取人のどちらかのものであることがあります。
このアプローチにより、アテステーションはブロックチェーンベースの永続性を得て、主張する情報を暗号化し検証可能な状態に保つことができます。 また、秘密鍵の保有者は情報を復号化できるため、選択的に開示することも可能です。
-### オフチェーン・アテステーション {#onchain-attestations}
+### オンチェーンアテステーション {#onchain-attestations}
-オンチェーン・アテステーションは、イーサリアムのブロックチェーン上の[スマートコントラクト](/glossary/#smart-contract)に保持されます。 スマートコントラクト(レジストリとして機能)は、アテステーションを該当するオンチェーン分散型ID公開鍵)にマッピングします。
+オンチェーンアテステーションは、Ethereumブロックチェーン上の[スマートコントラクト](/glossary/#smart-contract)で保持されます。 スマートコントラクト (レジストリとして機能) は、アテステーションを対応するオンチェーンの分散型ID (公開鍵) にマッピングします。
-ここでは、オンチェーン・アテステーションがどのように機能するか例を紹介します。
+オンチェーンアテステーションが実際にどのように機能するかの例を以下に示します:
1. ある企業(XYZ Corp)は、スマートコントラクトを使用して所有権の株式を売却することを計画していますが、バックグラウンドチェックを通った買手のみを求めています。
-2. XYZ Corpは、バックグラウンドチェックを行う会社に、イーサリアム上でオンチェーン・アテステーションを発行してもらうことができます。 このアテステーションは、個人情報を明かすことなくバックグラウンドチェックに通ったことを証明するものです。
+2. XYZ社は、身元調査を行う会社に、Ethereum上でオンチェーンアテステーションを発行させることができます。 このアテステーションは、個人情報を明かすことなくバックグラウンドチェックに通ったことを証明するものです。
3. 株式を売却するスマートコントラクトは、レジストリコントラクトで審査した買い手の身元を確認し、株式の買手を判断することができます。
-### ソウルバウンド・トークンとアイデンティティ {#soulbound}
+### ソウルバウンドトークンとID {#soulbound}
-[ソウルバウンドトークン](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)([譲渡不可の非代替性トークン](/glossary/#nft))は、特定のウォレットに固有の情報の収集に使用される可能性があります。 これは、特定のイーサリアムアドレスに結びついた一意のオンチェーンアイデンティティを効果的に作成し、業績(例えば、特定のオンラインコースの修了や、ゲームで閾値のスコアの通過など)やコミュニティへの参加を表すトークンを含むことができます。
+[ソウルバウンドトークン](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ([譲渡不可能なNFT](/glossary/#nft)) は、特定のウォレットに固有の情報を収集するために使用できます。 これにより、特定のEthereumアドレスに紐付けられた一意のオンチェーンIDが効果的に作成されます。これには、実績 (例: 特定のオンラインコースの修了、ゲームでのしきい値スコアの達成) やコミュニティへの参加を表すトークンを含めることができます。
-## 分散型アイデンティティの利用 {#use-decentralized-identity}
+## 分散型IDを使用する {#use-decentralized-identity}
分散型アイデンティティソリューションの基盤としてイーサリアムを使用する、大掛かりなプロジェクトが数多くあります。
-- **[イーサリアム・ネーム・サービス(ENS)](https://ens.domains/)** - _イーサリアムウォレットアドレス、コンテンツハッシュ、メタデータなどのオンチェーン、機械読み取り可能なIDの分散型ネーミングシステム_
-- **[SpruceID](https://www.spruceid.com/)** - _サードパーティーのサービスに頼らず、イーサリアムアカウントとENSプロファイルでデジタルアイデンティティを管理できるようにする分散型アイデンティティプロジェクト_
-- **[イーサリアム・アテステーション・サービス (EAS)](https://attest.sh/)** - _あらゆるものについてオンチェーンまたはオフチェーンのアテステーションを作成するための分散型台帳/プロトコル_
-- **[Proof of Humanity](https://www.proofofhumanity.id)** - _Proof of Humanity (PoH)は、イーサリアム上に構築されたソーシャルID認証システム_
-- **[BrightID](https://www.brightid.org/)** - _ソーシャルグラフの作成と分析を通じて、本人確認の改革を目指す分散型オープンソース・ソーシャルアイデンティティネットワーク_
-- **[walt.id](https://walt.id)** — _オープンソースの分散型アイデンティティとウォレットのインフラストラクチャです。これにより、デベロッパーや組織は、自己主権型アイデンティティとNFT/SBTを活用可能にします。_
-- **[Veramo](https://veramo.io/)** - _JavaScriptフレームワークで、暗号学的に検証可能なデータを誰でも簡単にアプリケーションで利用することができます。_
+- **[Ethereum Name Service (ENS)](https://ens.domains/)** - _Ethereumウォレットアドレス、コンテンツハッシュ、メタデータなどのオンチェーンで機械可読なIDのための分散型ネーミングシステム。_
+- **[Sign in with Ethereum (SIWE)](https://siwe.xyz/)** - _Ethereumアカウントによる認証のためのオープンスタンダード。_
+- **[SpruceID](https://www.spruceid.com/)** - _サードパーティのサービスに依存せず、EthereumアカウントとENSプロファイルでデジタルIDを管理できる分散型IDプロジェクト。_
+- **[Ethereum Attestation Service (EAS)](https://attest.org/)** - _あらゆるものについてオンチェーンまたはオフチェーンのアテステーションを行うための分散型台帳/プロトコル。_
+- **[Proof of Humanity](https://www.proofofhumanity.id)** - _Proof of Humanity (またはPoH) は、Ethereum上に構築されたソーシャルID認証システムです。_
+- **[BrightID](https://www.brightid.org/)** - _ソーシャルグラフの作成と分析を通じて、ID認証の改革を目指す、分散型のオープンソース・ソーシャルIDネットワーク。_
+- **[walt.id](https://walt.id)** — _開発者や組織が自己主権型IDとNFT/SBTを活用できるようにする、オープンソースの分散型IDおよびウォレットインフラストラクチャ。_
+- **[Veramo](https://veramo.io/)** - _誰でもアプリケーションで暗号技術によって検証可能なデータを簡単に使用できるようにするJavaScriptフレームワーク。_
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
### 記事 {#articles}
-- [ブロックチェーンの活用事例: デジタルIDにおけるブロックチェーン](https://consensys.net/blockchain-use-cases/digital-identity/) —_ConsenSys_
-- [イーサリアムERC725とは ブロックチェーン上の自己主権型ID管理](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_
-- [ブロックチェーンはデジタルID問題をどのように解決するか](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_
-- [分散型アイデンティティとは、注目に値する理由](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_
-- [分散型アイデンティティの紹介](https://walt.id/white-paper/digital-identity) — _Dominik Beron_
+- [ブロックチェーンのユースケース: デジタルIDにおけるブロックチェーン](https://consensys.net/blockchain-use-cases/digital-identity/) — _ConsenSys_
+- [イーサリアムERC725とは? ブロックチェーン上での自己主権型ID管理](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_
+- [ブロックチェーンはデジタルIDの問題をどのように解決できるか](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_
+- [分散型IDとは何か、そしてなぜ気にかけるべきか?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_
+- [分散型ID入門](https://walt.id/white-paper/digital-identity) — _Dominik Beron_
-### ビデオ {#videos}
+### 動画 {#videos}
-- [分散型アイデンティティ(ボーナスライブストリームセッション)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _Andreas Antonopolousによる分散型アイデンティティに関する秀逸な解説ビデオ_
-- [イーサリアムでサインインし、Ceramic、IDX、React、および 3ID Connectを使用した分散型ID](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _Nader Dabitによるイーサリアムウォレットを使用したユーザープロファイルの作成、読み取り、更新のID管理システムの構築に関するYouTubeチュートリアルビデオ_
-- [BrightID - イーサリアム上の分散型アイデンティティ](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _イーサリアムの分散型IDソリューション「BrightID」に関するBanklessポッドキャスト_
-- [オフ・チェーン・インターネット: 分散型アイデンティティと検証可能な資格情報](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — Evin McMullenによるEthDenver 2022のプレゼンテーション
-- [検証可能な資格情報の説明](https://www.youtube.com/watch?v=ce1IdSr-Kig) - Tamino Baumannによるデモを含んだYouTubeの説明ビデオ
+- [分散型ID (ボーナスライブストリームセッション)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _Andreas Antonopolousによる分散型IDに関する秀逸な解説動画_
+- [Ceramic、IDX、React、3ID Connectを使ったイーサリアムでのサインインと分散型ID](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _Nader Dabitによる、Ethereumウォレットを使用してユーザーのプロファイルを作成、読み取り、更新するためのID管理システムを構築するYouTubeチュートリアル_
+- [BrightID - Ethereum上の分散型ID](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Ethereum向けの分散型IDソリューションであるBrightIDについて議論するBanklessポッドキャストエピソード_
+- [オフチェーンインターネット: 分散型IDと検証可能な資格情報](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — Evin McMullenによるEthDenver 2022でのプレゼンテーション
+- [検証可能な資格情報の説明](https://www.youtube.com/watch?v=ce1IdSr-Kig) - Tamino Baumannによるデモ付きYouTube解説動画
### コミュニティ {#communities}
-- [GitHub上のERC-725アライアンス](https://github.com/erc725alliance) — _イーサリアムのブロックチェーン上でIDを管理するための規格「ERC725」のサポーターコミュニティ_
-- [EthID Discordサーバ](https://discord.com/invite/ZUyG3mSXFD) — _「イーサリアムでサインイン」に取り組むファンやデベロッパーのためのコミュニティ_
-- [Veramo Labs](https://discord.gg/sYBUXpACh4) — _アプリケーション向けの検証可能なデータのフレームワークの構築に貢献するデベロッパーのコミュニティ_
-- [walt.id](https://discord.com/invite/AW8AgqJthZ) — _さまざまな業界にわたる分散型IDのユースケースに取り組むデベロッパーおよびビルダーのコミュニティ_
+- [GitHubのERC-725アライアンス](https://github.com/erc725alliance) — _Ethereumブロックチェーン上でIDを管理するためのERC725標準の支持者_
+- [EthID Discordサーバー](https://discord.com/invite/ZUyG3mSXFD) — _Sign-in with EthereumおよびEthereum Follow Protocolに取り組む愛好家と開発者のためのコミュニティ_
+- [Veramo Labs](https://discord.gg/sYBUXpACh4) — _アプリケーション向けの検証可能データのためのフレームワーク構築に貢献する開発者のコミュニティ_
+- [walt.id](https://discord.com/invite/AW8AgqJthZ) — _さまざまな業界にわたる分散型IDのユースケースに取り組む開発者とビルダーのコミュニティ_
diff --git a/public/content/translations/ja/defi/index.md b/public/content/translations/ja/defi/index.md
index fb74ec963bb..9d68d98127d 100644
--- a/public/content/translations/ja/defi/index.md
+++ b/public/content/translations/ja/defi/index.md
@@ -1,15 +1,16 @@
---
-title: 分散型金融(DeFi)
-description: イーサリアムにおける分散型金融(DeFi)の概要
+title: "分散型金融(DeFi)"
+metaTitle: "分散型金融(DeFi)とは | 分散型金融の利点と使用法"
+description: "イーサリアムにおける分散型金融(DeFi)の概要"
lang: ja
template: use-cases
emoji: ":money_with_wings:"
image: /images/use-cases/defi.png
-alt: レゴブロックで作られたETHのロゴ
+alt: "レゴブロックで作られたETHのロゴ"
sidebarDepth: 2
-summaryPoint1: 現在の金融システムに変わる、グローバルで開かれた分散型金融。
-summaryPoint2: 借りる、貯蓄、投資、取引などを実現する製品。
-summaryPoint3: オープンソース技術に基づき、誰でもプログラミング可能。
+summaryPoint1: "現在の金融システムに変わる、グローバルで開かれた分散型金融。"
+summaryPoint2: "借りる、貯蓄、投資、取引などを実現する製品。"
+summaryPoint3: "オープンソース技術に基づき、誰でもプログラミング可能。"
---
分散型金融(DeFi)は、インターネット時代に対応したオープンでグローバルな金融システムであり、不透明で厳しく管理された、何十年も前のインフラやプロセスのシステムを置き換えるものです。 自分のお金をコントロールし、可視化することができます。 グローバル市場に入ることができ、自国の通貨や銀行の選択肢の代替となります。 分散型金融(DeFi)製品は、インターネットの接続がある人であれば誰でも金融サービスを受けることができ、ほとんどがユーザーによって所有・維持されています。 これまでに数百億ドル相当の暗号資産が、分散型金融(DeFi)アプリケーションを経由しており、その額は日々増加しています。
@@ -22,7 +23,7 @@ summaryPoint3: オープンソース技術に基づき、誰でもプログラ
-## 分散型金融(DeFi)と従来の金融システムとの比較 {#defi-vs-tradfi}
+## DeFi 対 従来の金融 {#defi-vs-tradfi}
分散型金融(DeFi)の可能性を知るための最良の方法の一つは、現在ある問題を理解することです。
@@ -31,24 +32,24 @@ summaryPoint3: オープンソース技術に基づき、誰でもプログラ
- 金融サービスは、あなたをブロックし、支払いを受けることができないようにすることができます。
- 金融サービスへの隠された料金には、利用者の個人情報があります。
- 政府や中央集権機関が自由に市場を閉鎖することができます。
-- 取引時間は、大抵特定の営業時間帯に限定されます。
+- 取引時間は、多くの場合、特定のタイムゾーンの営業時間内に限定されます。
- 内部の人的なプロセスにより、送金には数日かかる場合があります。
- 仲介機関への分け前が必要なため、金融サービスには手数料が必要です。
### 比較 {#defi-comparison}
-| 分散型金融(DeFi) | 従来の金融システム |
+| 分散型金融(DeFi) | 従来の金融システム |
| ----------------------------------------------------- | --------------------------------------------------- |
| 自分でお金を保有します。 | 企業があなたのお金を保有します。 |
| 自分のお金がどこに行くか、どのように使われるかをコントロールすることができます。 | リスクの高い借り手に貸し出す等、企業があなたのお金を煩雑に管理していないことを信用する必要があります。 |
| 資金の移動は数分で完了します。 | 支払いには手動の作業プロセスのために数日かかることがあります。 |
| トランザクションは仮名で行われます。 | 金融活動は、利用者の個人情報と密接に結びついています。 |
-| 分散型金融(DeFi)は誰でも利用できます。 | 金融サービスの利用申請が必要です。 |
+| 分散型金融(DeFi)は誰でも利用できます。 | 金融サービスの利用申請が必要です。 |
| 市場は常にオープンしています。 | 従業員の休息のため、市場が閉じる時間があります。 |
| 誰もが製品データを見て、システムがどのように機能しているかを調べることができる、透明性の高いシステムです。 | 金融機関はクローズド・ブックであり、融資の履歴や運用資産の記録などを見せてもらうことはできません。 |
- 分散型金融(DeFi)アプリを探す
+ DeFiアプリを探す
## 始まりはビットコイン... {#bitcoin}
@@ -59,16 +60,16 @@ summaryPoint3: オープンソース技術に基づき、誰でもプログラ
-## プログラム可能な通貨 {#programmable-money}
+## プログラム可能なお金 {#programmable-money}
-これは一見奇妙なことのように聞こえます。「なぜ自分のお金をプログラムする必要があるのでしょうか?」 しかし、これはむしろイーサリアムのトークンのデフォルト機能に過ぎません。 誰でも支払いに論理をプログラムすることができます。 プログラミングにより、金融機関が提供するサービスに、ビットコインのコントロールとセキュリティを混在させることができます。 貸し借りや支払いのスケジューリング、インデックスファンドへの投資など、ビットコインではできないことを暗号通貨で行うことができます。
+奇妙に聞こえるかもしれませんが… 「なぜ自分のお金をプログラムする必要があるのでしょうか?」 しかし、これはむしろイーサリアムのトークンのデフォルト機能に過ぎません。 誰でも支払いに論理をプログラムすることができます。 プログラミングにより、金融機関が提供するサービスに、ビットコインのコントロールとセキュリティを混在させることができます。 貸し借りや支払いのスケジューリング、インデックスファンドへの投資など、ビットコインではできないことを暗号通貨で行うことができます。
-
+
イーサリアムを初めて使う方にお勧めの分散型金融(DeFi)アプリケーション
- 分散型金融(DeFi)アプリを探す
+ DeFiアプリを探す
@@ -77,49 +78,49 @@ summaryPoint3: オープンソース技術に基づき、誰でもプログラ
ほとんどの金融サービスには、分散型の代替手段があります。 しかし、イーサリアムは、次のようなまったく新しい金融商品を生み出す機会も与えてくれます。 リストは増え続けていきます。
-- [世界中への送金](#send-money)
-- [世界中へのお金の流通](#stream-money)
-- [安定した通貨へのアクセス](#stablecoins)
-- [担保から資金の借り入れ](#lending)
-- [担保なしの借り入れ](#flash-loans)
-- [暗号資産の預金口座の開設](#saving)
-- [トークンのトランザクション](#swaps)
-- [ポートフォリオの拡大](#investing)
-- [アイデアへの資金供給](#crowdfunding)
-- [保険の購入](#insurance)
-- [ポートフォリオ管理](#aggregators)
+- [世界中に送金する](#send-money)
+- [世界中にお金をストリーミングする](#stream-money)
+- [ステーブルコインにアクセスする](#stablecoins)
+- [担保付きで資金を借りる](#lending)
+- [担保なしで借りる](#flash-loans)
+- [暗号資産で貯蓄を始める](#saving)
+- [トークンを取引する](#swaps)
+- [ポートフォリオを拡大する](#investing)
+- [アイデアの資金を調達する](#crowdfunding)
+- [保険に加入する](#insurance)
+- [ポートフォリオを管理する](#aggregators)
-### 世界中に素早く送金 {#send-money}
+### 世界中に素早く送金する {#send-money}
-イーサリアムはブロックチェーンとして、安全かつグローバルな方法でトランザクションを行うために設計されています。 ビットコイン同様、イーサリアムは世界中にお金を送ることが、メールを送るように簡単にできます。 受信者の[イーサリアム・ネーム・サービス(ENS)名](/glossary/#ens) (例: bob.eth)またはウォレットのアカウントアドレスを入力するだけで、通常、数分後には支払いが直接相手に届きます。 支払いの送受信には、 [ウォレット](/wallets/)が必要です。
+イーサリアムはブロックチェーンとして、安全かつグローバルな方法でトランザクションを行うために設計されています。 ビットコイン同様、イーサリアムは世界中にお金を送ることが、メールを送るように簡単にできます。 受信者の[ENS名](/glossary/#ens)(bob.ethなど)またはウォレットのアカウントアドレスを入力するだけで、通常は数分で支払いが直接相手に届きます。 支払いの送受信には、[ウォレット](/wallets/)が必要です。
- 支払いの分散型アプリ(Dapp)を見る
+ 決済dappsを見る
#### 世界中へのお金の流通... {#stream-money}
また、イーサリアムでお金を流通させることもできます。 これにより、誰かに給料を秒単位で支払うことができ、受取人は必要なときにいつでもお金にアクセスすることができます。 また、コインロッカーや電動自転車など、秒単位でレンタルすることもできます。
-また、[ETH](/glossary/#ether)の価値がどれだけ変わるかわからないので、送金や流通はしたくないという方には、イーサリアムの代替通貨である[ステーブルコイン](/glossary/#stablecoin)があります。
+また、価値の変動が大きいため[ETH](/glossary/#ether)の送金やストリーミングをしたくない場合でも、イーサリアムには代替通貨である[ステーブルコイン](/glossary/#stablecoin)があります。
-### 安定した通貨へのアクセス {#stablecoins}
+### ステーブルコインへのアクセス {#stablecoins}
暗号通貨の変動性は、多くの金融商品や一般歳出にとっては問題となります。 分散型金融(DeFi)コミュニティはこれをステーブルコインで解決しました。 ステーブルコインの価値は、別の資産、通常はドルのような一般的な通貨を担保にしています。
DaiやUSDCのようなコインの価値変動は、1ドルで数セントの範囲内です。 そのため、給与や小売業に最適です。 中南米では、政府が発行する通貨に大きな不安があるため、自分の貯蓄を守る手段として、多くの人々がステーブルコインを利用しています。
- ステーブルコインの詳細
+ステーブルコインの詳細はこちら
-### 融資 {#lending}
+### 借り入れ {#lending}
分散型プロバイダーからお金を借りるには、大きく分けて2種類あります。
@@ -127,24 +128,24 @@ DaiやUSDCのようなコインの価値変動は、1ドルで数セントの範
- プールベース: 借り手が借り入れることができるプールに、貸し手が資金(流動性)を提供する方法です。
- 融資分散型アプリ(Dapp)を見る
+ 借り入れdappsを見る
分散型貸付業者の利用には、多くの利点があります。
-#### プライバシーを守りながらの借り入れ {#borrowing-privacy}
+#### プライバシーを確保した借り入れ {#borrowing-privacy}
現在、お金の貸し借りは、すべて個人が中心となって行われています。 銀行は融資をする前に、借り手に返済する見込みがあるかどうかを見極める必要があります。
-分散型融資は、どちらも自分の名前を名乗る必要がありません。 その代わり、借り手は担保を提供する必要があり、その担保は融資が返済されない場合に貸し手が自動的に受け取ることになります。 一部の貸し手では、[非代替性トークン(NFT)](/glossary/#nft)を担保として受け入れています。 非代替性トークン(NFT)とは、美術絵画のような唯一無二の資産に対する証明です。 [非代替性トークン(NFT)の詳細](/nft/)
+分散型融資は、どちらも自分の名前を名乗る必要がありません。 その代わり、借り手は担保を提供する必要があり、その担保は融資が返済されない場合に貸し手が自動的に受け取ることになります。 貸し手の中には、[NFT](/glossary/#nft)を担保として受け入れるところもあります。 非代替性トークン(NFT)とは、美術絵画のような唯一無二の資産に対する証明です。 [NFTの詳細](/nft/)
これにより、クレジットチェックや個人情報を開示せずにお金を借りることができます。
-#### グローバル資金へのアクセス {#access-global-funds}
+#### グローバルな資金へのアクセス {#access-global-funds}
-分散型金融機関を利用すると、あなたが選んだ銀行や金融機関に預けている資金だけでなく、世界中から入金された資金にアクセスすることができます。 これにより、ローンがより利用しやすくなり、金利も改善されます。
+分散型金融機関を利用すると、あなたが選んだ銀行や金融機関に預けている資金だけでなく、世界中から入金された資金にアクセスすることができます。 これによりローンがより利用しやすくなり、金利が改善されます。
-#### 課税効率 {#tax-efficiencies}
+#### 税効率 {#tax-efficiencies}
ETHを売却(課税対象)することなく、必要な資金を借り入れることができます。 その代わり、ETHを担保にステーブルコインを借りることができます。 これにより、必要なキャッシュフローを得ることができ、ETHをそのまま保有しておくことができます。 ステーブルコインは、ETHのように価値が変動しないので、現金が必要な時にはより適しているトークンです。 [ステーブルコインの詳細](#stablecoins)
@@ -177,22 +178,22 @@ ETHを売却(課税対象)することなく、必要な資金を借り入れる
-### 暗号資産で預金を始める {#saving}
+### 暗号資産で貯蓄を始める {#saving}
-#### 貸付 {#lending}
+#### 貸し出し {#lending}
-暗号通貨を貸すことで利息を得ることができ、資金が増えていく様子をリアルタイムで見ることができます。 現在の利息は、地元の銀行で得られる金利よりもはるかに高いです(運良く銀行を利用できた場合)。 次に例を示します。
+暗号通貨を貸すことで利息を得ることができ、資金が増えていく様子をリアルタイムで見ることができます。 現在の利息は、地元の銀行で得られる金利よりもはるかに高いです(運良く銀行を利用できた場合)。 具体的なコードは、以下のようになります:
-- [ステーブルコイン](/stablecoins/)である100 DaiをAaveのようなサービスに貸し付けます。
+- [ステーブルコイン](/stablecoins/)である100 Daiを、Aaveのようなプロダクトに貸し付けます。
- 貸したDaiを表すトークンである100 Aave Dai (aDai)を受領します。
-- aDaiは金利に基づいて増加し、あなたのウォレットで残高が増えていくのを見ることができます。 [年換算利回り(APR)](/glossary/#apr)に応じて、数日後、あるいは数時間後にウォレットの残高が100.1234のように表示されます。
+- aDaiは金利に基づいて増加し、あなたのウォレットで残高が増えていくのを見ることができます。 [APR](/glossary/#apr)(年換算利回り)に応じて、数日後、あるいは数時間後にはウォレットの残高が100.1234のように表示されます。
- aDai残高と同額の通常のDaiをいつでも引き出すことができます。
- 貸付サービスの分散型アプリ(Dapp)を見る
+ レンディングdappsを見る
-#### 損失がない宝くじ {#no-loss-lotteries}
+#### 損失のでない宝くじ {#no-loss-lotteries}
PoolTogetherのような損失のない宝くじは、楽しく革新的な新しい貯蓄方法です。
@@ -210,14 +211,14 @@ PoolTogetherのような損失のない宝くじは、楽しく革新的な新
-### トークンの交換 {#swaps}
+### トークンを交換する {#swaps}
イーサリアムには何千ものトークンがあります。 分散型取引所(DEX)でいつでも異なるトークンを取引できます。 ご自身の資産の管理をあきらめる必要はありません。 これは、外国に行ったときに両替所を利用するようなものです。 しかし、分散型金融(DeFi)では両替所は閉じることはありません。 市場は365日24時間体制で、テクノロジーにより、取引を受け付ける人が常にいます。
-例えば、上述の損失のない宝くじPoolTogetherを利用したい場合、DaiやUSDCなどのトークンが必要になります。 これらの分散型取引所では、自分のETHをそれらのトークンと交換し、終了後またETHに戻すことができます。
+例えば、上述の損失のない宝くじPoolTogetherを利用したい場合、DaiやUSDCなどのトークンが必要になります。 これらの分散型取引所では、自分のETHをそれらのトークンと取引し、終了後またETHに戻すことができます。
- トークン交換所を見る
+ トークン取引所を見る
@@ -229,24 +230,24 @@ PoolTogetherのような損失のない宝くじは、楽しく革新的な新
中央集権的な取引所を利用する場合は、取引を行う前に資産を預けて、その資産の管理を任せなければなりません。 中央の取引所はハッカーにとって魅力的なターゲットであるため、資産が預けられている間はリスクがあります。
- トレード分散型アプリ(Dapp)を見る
+ トレーディングdappsを見る
-### ポートフォリオの拡大 {#investing}
+### ポートフォリオを拡大する {#investing}
イーサリアムには、自分が選んだ戦略に基づいてポートフォリオを拡大を図るファンドマネジメント商品があります。 これは、自動的、誰にでも開かれていて、かつ管理者に利益の一部を取られる必要はありません。
-その良い例が、[分散型金融Pulseインデックスファンド(DPI)](https://defipulse.com/blog/defi-pulse-index/)です。 これは、あなたのポートフォリオが常に時価総額上位のDeFiトークンを含むように自動的にリバランスするファンドです。 細かい管理をする必要がなく、好きな時にファンドから引き出すことができます。
+良い例として、[DeFi Pulse Indexファンド(DPI)](https://defipulse.com/blog/defi-pulse-index/)が挙げられます。 これは、あなたのポートフォリオが常に時価総額上位のDeFiトークンを含むように自動的にリバランスするファンドです。 細かい管理をする必要がなく、好きな時にファンドから引き出すことができます。
- 投資分散型アプリ(Dapp)を見る
+ 投資dappsを見る
-### アイデアへの資金供給 {#crowdfunding}
+### アイデアの資金を調達する {#crowdfunding}
イーサリアムはクラウドファンディングに理想的なプラットフォームです。
@@ -255,14 +256,14 @@ PoolTogetherのような損失のない宝くじは、楽しく革新的な新
- 出資者は、例えば、特定の期限や最低金額が達成されなかった場合、自動的に返金されるように設定することができます。
- クラウドファンディング分散型アプリ(Dapp)を見る
+ クラウドファンディングdappsを見る
-#### クオドラティック・ファンディング {#quadratic-funding}
+#### クアドラティック・ファンディング {#quadratic-funding}
-イーサリアムはオープンソースソフトウェアであり、これまでの作業の多くはコミュニティの資金提供を受けてきました。 これにより、クオドラティック・ファンディングという興味深い新しい資金調達モデルが成長しました。 将来的に、私達が公共財のすべてのタイプに資金を供給する方法を改善する可能性があるファンディングです。
+イーサリアムはオープンソースソフトウェアであり、これまでの作業の多くはコミュニティの資金提供を受けてきました。 これにより、クオドラティック・ファンディングという興味深い新しい資金調達モデルが成長しました。 クアドラティック・ファンディングは、将来的にすべての種類の公共財の資金供給方法を改善できる可能性を秘めており、
-クオドラティック・ファンディングでは、最もユニークな必要性があるプロジェクトが、最も多くの資金を受け取るようになっています。 つまり、ほとんどの人々の生活を向上させるためのプロジェクトです。 その仕組みは次のとおりです。
+最もユニークな必要性があるプロジェクトが、最多の資金を受け取るようになっています。 つまり、最も多くの人々が必要なものに資金が渡り、人々の生活の向上につながるプロジェクトです。 その仕組みは次のとおりです。
1. 寄付を集めて供与先を決めるためのマッチングプールがあります。
2. 資金供与のラウンドが始まります。
@@ -272,7 +273,7 @@ PoolTogetherのような損失のない宝くじは、楽しく革新的な新
つまり、1ドルの寄付が100件集まったプロジェクトAの方が、1つの1万ドルの寄付に支援されたプロジェクトBよりも多くの資金を得られる可能性があるということです(マッチングプールの大きさによります)。
- クオドラティック・ファンディングの詳細
+ クアドラティック・ファンディングの詳細
@@ -281,10 +282,10 @@ PoolTogetherのような損失のない宝くじは、楽しく革新的な新
分散型保険は、保険料をより安く、より早く、より透明にすることを目指しています。 自動化が進めば、保険料はより手頃になり、支払いもより迅速になります。 保険請求を決定するために使用されるデータには、完全に透明性があります。
-他のソフトウェアと同様、イーサリアム製品は、バグや不正搾取の問題があります。 そのため、現在のところ、この分野の保険商品の多くは、ユーザーが資金を失うことを防ぐことに重点を置いています。 しかし、起こりうるあらゆることをカバーするプロジェクトも存在しています。 その良い例が、[ケニアの零細農家を干ばつや洪水から守ることを目的とした](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc)Etheriscの生産物保証です。 分散型の保険は、従来の保険では値段が高過ぎて手がでないことが多い農民に、より安価な保険を提供することができます。
+Ethereum製品は、他のソフトウェアと同様に、バグや不正搾取に悩まされることがあります。 そのため、現在のところ、この分野の保険商品の多くは、ユーザーが資金を失うことを防ぐことに重点を置いています。 しかし、起こりうるあらゆることをカバーするプロジェクトも存在しています。 この良い例は、[ケニアの小規模農家を干ばつや洪水から守る](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc)ことを目的としたEtheriscのCrop coverです。 分散型の保険は、従来の保険では値段が高過ぎて手がでないことが多い農民に、より安価な保険を提供することができます。
- 保険分散型アプリ(Dapp)見る
+ 保険dappsを見る
@@ -294,7 +295,7 @@ PoolTogetherのような損失のない宝くじは、楽しく革新的な新
多くのことが行われているため、すべての投資、ローン、取引を記録する方法が必要になります。 すべての分散型金融(DeFi)アクティビティを1つの場所で管理できる製品が多数あります。 これが分散型金融(DeFi)のオープンアーキテクチャーの魅力です。 製品すべての残高を確認できるだけでなく、その機能を利用できるインターフェースを構築することができます。 分散型金融(DeFi)をより深く知るための参考にしてみてください。
- ポートフォリオ分散型アプリ(Dapp)を見る
+ ポートフォリオdappsを見る
@@ -311,53 +312,54 @@ PoolTogetherのような損失のない宝くじは、楽しく革新的な新
これは、現在のところ、コードを解読できるイーサリアムコミュニティの技術的なメンバーを信頼する必要があることを意味しています。 オープンソースベースのコミュニティは、デベロッパーをチェックするのに役立っていますが、スマートコントラクトが解読しやすくなり、コードの信頼性を証明する他の方法が開発されるにつれて、この必要性は時間とともに減少していくでしょう。
-## イーサリアムと分散型金融(DeFi) {#ethereum-and-defi}
+## イーサリアムとDeFi {#ethereum-and-defi}
イーサリアムは、さまざまな理由から分散型金融(DeFi)の基盤として最適です。
- イーサリアムやスマートコントラクトは誰かの所有物ではないため、誰もが分散型金融(DeFi)を利用することができます。 これはまた、誰もあなたに関するルールを変更できないことを意味します。
-- 分散型金融(DeFi)製品はすべて、舞台裏で同じ言語を話しており、その言語はイーサリアムです。 このため、多くの製品がシームレスに連携します。 あるプラットフォームでトークンを貸し出し、その利息付きトークンを全く別のアプリケーションで別の市場で交換することができます。 これは、銀行でポイントを現金化できるようなものです。
+- 分散型金融(DeFi)製品はすべて、舞台裏で同じ言語を話しており、その言語はイーサリアムです。 このため、多くの製品がシームレスに連携します。 あるプラットフォームでトークンを貸し出し、その利息付きトークンを全く別のアプリケーションで別の市場で取引することができます。 これは、銀行でポイントを現金化できるようなものです。
- トークンと暗号通貨は、共有台帳であるイーサリアムに組み込まれています。トランザクションや所有権を追跡することは、イーサリアムの得意とするところです。
- イーサリアムは完全な経済的自由を可能にします。ほとんどの製品はあなたの資金を管理することはなく、自分の資金を自分でコントロールすることができます。
分散型金融(DeFi)をレイヤーで考えてみましょう。
1. ブロックチェーン - イーサリアムには、トランザクション履歴やアカウント状態が記録されています。
-2. 資産 - [ETH](/what-is-ether/)とその他のトークン(通貨)
-3. プロトコル - 機能を提供する[スマートコントラクト](/glossary/#smart-contract)は、例えば資産の分散型レンディングを可能にするサービスなどを提供します。
-4. [アプリ](/apps/) - プロトコルの管理やアクセスのために使用する製品
+2. 資産 – [ETH](/what-is-ether/)およびその他のトークン(通貨)のことです。
+3. プロトコル – 機能を提供する[スマートコントラクト](/glossary/#smart-contract)のことで、例えば資産の分散型貸付を可能にするサービスなどです。
+4. [アプリケーション](/apps/) – プロトコルを管理し、アクセスするために使用するプロダクトのことです。
-注意: DeFiの多くは、[ERC-20規格](/glossary/#erc-20)を使っています。 DeFiのアプリケーションでは、ラップドイーサ(WETH)というラップされたETHを使うことになります。 [ラップドイーサの詳細](/wrapped-eth)。
+注:DeFiの多くは[ERC-20規格](/glossary/#erc-20)を利用しています。 DeFiのアプリケーションでは、Wrapped ether(WETH)と呼ばれるETHのラッパーを使用します。 [ラップされたEtherの詳細はこちら](/wrapped-eth)。
-## 分散型金融(DeFi)の構築 {#build-defi}
+## DeFiを構築する {#build-defi}
分散型金融(DeFi)はオープンソースのムーブメントです。 分散型金融(DeFi)のプロトコルとアプリケーションはすべて公開されており、ユーザーが検査、フォーク(分岐)、改変を行うことができます。 このようにレイヤー状になっているため(ベースとなるブロックチェーンや資産はすべて共通)、プロトコルを組み合わせ、ユニークな組み合わせでのチャンスを生み出すことができます。
- 分散型アプリ(Dapp)構築の詳細
+ dapps構築の詳細
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-### 分散型金融(DeFi)データ {#defi-data}
+### DeFiデータ {#defi-data}
- [DeFi Prime](https://defiprime.com/)
- [DeFi Llama](https://defillama.com/)
-### 分散型金融(DeFi)に関する記事 {#defi-articles}
+### DeFi関連記事 {#defi-articles}
-- [DeFi初心者ガイド](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu (2020年1月6日)_
+- [DeFi初心者ガイド](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu、2020年1月6日_
+- [EEA DeFiリスク評価ガイドライン](https://entethalliance.org/specs/defi-risks/) – DeFiプロトコルの主要なリスクを特定・評価する方法について、業界が支援する概要。
-### ビデオ {#videos}
+### 動画 {#videos}
-- [Finematics - 分散型金融に関する教育](https://finematics.com/) – _分散型金融(DeFi)に関するビデオ_
-- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _分散型金融(DeFi)の基本: 時に不可解な分散型金融を始めるために学ぶべきことすべて。_
-- [Whiteboard Crypto](https://youtu.be/17QRFlml4pA) _分散型金融(DeFi)とは_
+- [Finematics - 分散型金融の教育](https://finematics.com/) – _DeFiに関するビデオ_
+- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _DeFiの基礎: 時には難解なこの分野を始めるために知っておくべきことのすべて。_
+- [Whiteboard Crypto](https://youtu.be/17QRFlml4pA) _DeFiとは?_
### コミュニティ {#communities}
-- [DeFi Pulse Discord server](https://discord.defillama.com/)
-- [DeFi Pulse Discord server](https://discord.gg/Gx4TCTk)
+- [DeFi LlamaのDiscordサーバー](https://discord.defillama.com/)
+- [DeFi PulseのDiscordサーバー](https://discord.gg/Gx4TCTk)
diff --git a/public/content/translations/ja/desci/index.md b/public/content/translations/ja/desci/index.md
index 2096652408c..e12a7708586 100644
--- a/public/content/translations/ja/desci/index.md
+++ b/public/content/translations/ja/desci/index.md
@@ -1,43 +1,43 @@
---
-title: 分散型科学 (DeSci)
-description: イーサリアム上の分散型科学の概要
+title: "分散型サイエンス(DeSci)"
+description: "イーサリアム上の分散型科学の概要"
lang: ja
template: use-cases
emoji: ":microscope:"
sidebarDepth: 2
image: /images/future_transparent.png
alt: ""
-summaryPoint1: 現在の科学に代わる、グローバルで開かれたシステム。
-summaryPoint2: 科学者が資金を調達し、実験を行い、データーを共有し、得られた見識を広めることなどを可能にする技術。
-summaryPoint3: オープンサイエンス運動の上に構築。
+summaryPoint1: "現在の科学に代わる、グローバルで開かれたシステム。"
+summaryPoint2: "科学者が資金を調達し、実験を行い、データーを共有し、得られた見識を広めることなどを可能にする技術。"
+summaryPoint3: "オープンサイエンス運動の上に構築。"
---
## 分散型科学(DeSci)とは何か {#what-is-desci}
-分散型科学(DeSci)は[Web3](/glossary/#web3)スタックを用いることで、科学的知見に対する財政支援、そして科学的知見の創造、審査、認定、保管、普及のための、公平公正な公的インフラストラクチャの形成を目指す運動です。
+分散型科学(DeSci)は、[Web3](/glossary/#web3)スタックを使用して、科学的知識の資金調達、創造、レビュー、単位認定、保存、普及を公正かつ公平に行うための公共インフラの構築を目指す運動です。
DeSciは、科学者が自身の研究を公然と共有することにインセンティブを与えられ、そしてその仕事に対する名声を得られ、一方で誰もが簡単にその研究にアクセスし、さらに研究に貢献できるようなエコシステムの形成を目指しています。 DeSciは、科学的知識は誰にでもアクセス可能であり、科学研究のプロセスは透明であるべきという考えに則っています。 DeSciはより非中央集権的で分散型の科学研究モデルを形成することで、中央当局による検閲と管理に対する抵抗力を高めます。 DeSciは、資金調達、科学的ツール、コミュニケーション手段へのアクセスを分散化することによって、慣習にとらわれない新しいアイデアが繁栄する環境を作りたいと考えています。
-分散型科学により、多様な資金調達方法([分散型自律組織](/glossary/#dao)、[クアドラティックドネーション](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531)、クラウドファンディングなど)が可能となることで、データや科学的手法へのアクセスが容易になり、さらに再現性へのインセンティブを付与することができます。
+分散型科学は、[DAO](/glossary/#dao)や[クアドラティックドネーション](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531)からクラウドファンディングなど、より多様な資金源を可能にし、データや手法へのアクセスを容易にし、再現性へのインセンティブも提供します。
### Juan Benet - DeSci運動
-## いかにしてDeSciが科学を向上させるのか {#desci-improves-science}
+## DeSciが科学をいかに改善するか {#desci-improves-science}
科学の主要な問題点と、分散型科学でどのような解決が可能かをまとめた現時点におけるリストです。
-| **分散型科学** | **従来の科学** |
-| --------------------------------------------------------------- | ------------------------------------------------------------- |
-| 資金分配は、クアドラティックドネーションやDAOなどのメカニズムを用いて、**大衆によって決定されます**。 | 小規模で閉鎖的な**中央集権化されたグループ**が、資金分配をコントロールします。 |
-| **世界中の誰とでも**、動的なチームを形成して研究ができます。 | 資金提供団体や科学者の所属機関により、共同研究が**制限**されます。 |
-| 資金調達の決定は、オンラインかつ**透明性**をもって実行されます。 新しい資金調達のメカニズムが検討されます。 | 資金調達の決定には長い時間がかかり、**限られた透明性**の中で実行しています。 資金調達のメカニズムはほぼ存在しません。 |
-| [Web3](/glossary/#web3)技術を利用することで、研究所のサービスをより簡単かつ透明性をもって共有できます。 | 研究所のリソースを共有できるまでに**時間がかかることが多く、その手続きも不透明**です。 |
-| Web3プリミティブによって、信頼性と透明性が高く、かつ普遍的アクセスを実現する**新たな出版モデル**の開発が可能です。 | **非効率的でバイアスがあり、悪用されうる**旧来の手続きによって研究成果が出版されます。 |
-| **論文を査読することでトークンや評価を得ることができます**。 | 研究者が**無報酬で査読**し、営利目的の出版社に利益を提供します。 |
-| 科学者が自身の生み出した**知的財産(IP)を所有し**、透明性のある条件に従って配布します。 | 科学者が生み出した**知的財産は所属機関が所有**します。 知的財産へのアクセスは不透明です。 |
-| 全手順をオンチェーンにすることで、失敗した作業のデータも含めて、**すべての研究を共有できます**。 | **出版バイアス**とは、成功した実験ほど共有する傾向が強いというバイアスです。 |
+| **分散型科学** | **従来の科学** |
+| -------------------------------------------------------------- | ------------------------------------------------------------ |
+| 資金の分配は、クアドラティックドネーションやDAOなどのメカニズムを用いて**一般の人々によって決定されます**。 | 小規模で閉鎖的な**中央集権化されたグループ**が、資金の分配をコントロールします。 |
+| ダイナミックなチームで**世界中の**仲間と共同作業ができます。 | 資金提供団体や所属機関によって、共同研究が**制限されます**。 |
+| 資金調達の決定は、オンラインかつ**透明性をもって**実行されます。 新しい資金調達のメカニズムが検討されます。 | 資金調達の決定には長い時間がかかり、**限られた透明性**の中で実行されます。 資金調達のメカニズムはほぼ存在しません。 |
+| [Web3](/glossary/#web3)技術を利用することで、研究室サービスの共有がより簡単かつ透明になります。 | 研究室リソースの共有は、しばしば**遅くて不透明です**。 |
+| 信頼、透明性、普遍的なアクセスのためにWeb3プリミティブを使用する**新しい出版モデル**を開発することができます。 | しばしば**非効率的、偏向的、搾取的**と見なされる既存の経路を通して出版されます。 |
+| **査読作業でトークンと評価を得る**ことができます。 | **査読作業は無報酬**で、営利目的の出版社に利益をもたらします。 |
+| **あなたが生成した知的財産(IP)を所有**し、透明性のある条件に従って配布します。 | **あなたが生成したIPは、所属機関が所有します**。 知的財産へのアクセスは不透明です。 |
+| すべてのステップをオンチェーンにすることで、失敗した取り組みのデータを含む**すべての研究を共有**します。 | **出版バイアス**とは、研究者が成功した結果の実験を共有する可能性が高いことを意味します。 |
## イーサリアムとDeSci {#ethereum-and-desci}
@@ -49,89 +49,91 @@ DeSciは、従来の学術界をデジタルの世界にオンボーディング
### 出版 {#publishing}
-科学論文の出版は顕著な問題を抱えており、その背景には、論文の作成にあたり、科学者、査読者、編集者を無報酬で働かせ、法外な出版料を請求する出版社の存在があります。 一般市民は税金という形で科学者の活動費と出版費を間接的に支払っていますが、通常は、出版社に対して追加で支払いを行わないと、出版物を閲覧することはできません。 個々の科学論文の出版にかかる総額は、通常米ドルで5桁に上り、[公共財](/glossary/#public-goods)としての科学的知識の概念が損なわれる一方で、少数の出版社に莫大な利益がもたらされています。
+科学論文の出版は顕著な問題を抱えており、その背景には、論文の作成にあたり、科学者、査読者、編集者を無報酬で働かせ、法外な出版料を請求する出版社の存在があります。 一般市民は税金という形で科学者の活動費と出版費を間接的に支払っていますが、通常は、出版社に対して追加で支払いを行わないと、出版物を閲覧することはできません。 個々の科学論文を出版するための総費用は、しばしば5桁(米ドル)に上り、科学的知識を[公共財](/glossary/#public-goods)とみなす概念を損なう一方で、少数の出版社に莫大な利益がもたらされています。
-無料のオープンアクセスプラットフォームは、[ArXiv](https://arxiv.org/)などのプリントサーバーという形で存在します。 しかし、こうしたプラットフォームは品質管理や[シビル攻撃を防ぐメカニズム](/glossary/#anti-sybil)が不足しているうえに、通常は個々の論文の評価も追跡しません。つまり、従来の出版社に投稿する前に研究を発表するためだけに利用されています。 SciHubでは出版された論文に自由にアクセスできますが、合法ではありません。自由なアクセスは、出版社が料金を受け取った後、厳格に著作権法に則って提供されるべきものです。 科学論文やデーターをアクセスしやすい形で、かつ合法性が担保された枠組みで提供することについては、大きな改善の余地があります。 Web3には、このようなシステムを構築するためのツールが存在します。
+無料のオープンアクセスプラットフォームは、[ArXiv](https://arxiv.org/)などのプレプリントサーバーの形で存在します。 しかし、これらのプラットフォームは品質管理や[アンチシビルメカニズム](/glossary/#anti-sybil)に欠けており、通常、記事レベルの指標を追跡しません。つまり、従来の出版社に投稿する前に研究を公表するためにのみ使用されているのが普通です。 SciHubでは出版された論文に自由にアクセスできますが、合法ではありません。自由なアクセスは、出版社が料金を受け取った後、厳格に著作権法に則って提供されるべきものです。 科学論文やデーターをアクセスしやすい形で、かつ合法性が担保された枠組みで提供することについては、大きな改善の余地があります。 Web3には、このようなシステムを構築するためのツールが存在します。
-### 再現可能性と再生可能性 {#reproducibility-and-replicability}
+### 再現性と複製可能性 {#reproducibility-and-replicability}
再現可能性と再生可能性は価値ある科学的発見の基礎となるものです。
- 再現可能な結果とは、同一の研究グループが同じ手法を用いて、繰り返し連続で得られるものです。
- 再生可能な結果とは、別の研究グループが、同一の実験設定の下で得られるものです。
-新しいWeb3ネイティブなツールによって、再現性と複製性が発見の基礎であることが保証できるようになります。 アカデミアの技術的な構造に優れた科学を織り込むことができます。 Web3によって、生データ、計算エンジン、アプリケーションの結果などの解析コンポーネントに関する[アテステーション](/glossary/#attestation)を作成できるようになります。 コンセンサスシステムの素晴らしいところは、信頼できるネットワークを作成してそれらのコンポーネントを維持する場合に、ネットワークの各参加者が計算の再現と結果の検証に貢献できることにあります。
+新しいWeb3ネイティブなツールによって、再現性と複製性が発見の基礎であることが保証できるようになります。 アカデミアの技術的な構造に優れた科学を織り込むことができます。 Web3により、生データ、計算エンジン、アプリケーションの結果といった各分析コンポーネントの[アテステーション](/glossary/#attestation)を作成できます。 コンセンサスシステムの素晴らしいところは、信頼できるネットワークを作成してそれらのコンポーネントを維持する場合に、ネットワークの各参加者が計算の再現と結果の検証に貢献できることにあります。
### 資金調達 {#funding}
-科学への資金提供における現在の標準モデルでは、個人や科学者のグループが資金配分機関に書面にて申請する手順となっています。 信頼できる少数の識者が申請書を採点し、その後候補者の面接を経て、評価の高かった一部の候補者に資金が提供されます。 助成金の申請から受領まで、時に**年単位で待つ**ことになるボトルネックを生み出すだけでなく、このモデルは、審査委員会による**偏見、私欲、権力闘争に対して非常に脆弱である**と言われています。
+科学への資金提供における現在の標準モデルでは、個人や科学者のグループが資金配分機関に書面にて申請する手順となっています。 信頼できる少数の識者が申請書を採点し、その後候補者の面接を経て、評価の高かった一部の候補者に資金が提供されます。 助成金の申請から受領までの間に時に**年単位の待ち時間**が生じるボトルネックを生み出すだけでなく、このモデルは審査委員会の**偏見、私利私欲、政治に対して非常に脆弱である**ことが知られています。
同じ提案であっても同委員会の担当者によって結果が大きく異なることがあり、優れた提案を選択するうえで助成金審査委員会は責務を果たしていないことが研究によって示されています。 資金調達が厳しくなる中で、資金の行く先は保守的なプロジェクトを行う少人数の上席研究者へと集中してきました。 その結果、非常に競争の激しい資金調達環境が生み出され、歪んだインセンティブを根付かせ、イノベーションを妨げることになりました。
-DAOとWeb3によって培われた各種インセンティブモデルを広く試すことで、現在の破綻した資金調達モデルを食い止めることができるかもしれません。 [遡及的な公共財の資金調達](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c)、[クオドラティック・ファンディング](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531)、[DAOガバナンス](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead)、[トークン化されたインセンティブ構造](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design)などのWeb3ツールには、科学の資金調達に大変革をもたらす可能性があります。
+DAOとWeb3によって培われた各種インセンティブモデルを広く試すことで、現在の破綻した資金調達モデルを食い止めることができるかもしれません。 [遡及的な公共財ファンディング](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c)、[クアドラティックファンディング](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531)、[DAOガバナンス](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead)、[トークン化されたインセンティブ構造](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design)は、科学の資金調達に革命を起こしうるWeb3ツールの一部です。
### IPの所有権と開発 {#ip-ownership}
-従来の科学において知的財産(IP)は大きな問題となっています。大学で身動きが取れない状況に陥っていたり、バイオテクノロジー業界で応用されていなかったり、評価ができない状態になってしまっています。 しかし、Web3が[非代替性トークン(NFT)](/glossary/#nft)を活用することで、デジタル資産(科学的データや論文など)を真に所有できるようになります。
+従来の科学において知的財産(IP)は大きな問題となっています。大学で身動きが取れない状況に陥っていたり、バイオテクノロジー業界で応用されていなかったり、評価ができない状態になってしまっています。 しかし、Web3は[非代替性トークン(NFT)](/glossary/#nft)を使用することで、デジタル資産(科学データや記事など)の所有権を非常にうまく扱うことができます。
NFTが将来の取引の収益を元の作成者に還元できるように、透明性のある価値の帰属チェーンを確立することができます。これにより、研究者やDAOのような管理団体、そしてデータの収集元となった被験者へも報酬を与えることができます。
-[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6)もまた、進行中の研究実験の分散データレポジトリにアクセスするための鍵として機能し、NFTや[DeFi](/glossary/#defi)の金融化(資産の分散、融資プールと価値評価) へとつながります。 また、[VitaDAO](https://www.vitadao.com/)のようなネイティブにチェーン上に存在するDAOを使用することで、研究活動を直接オンチェーンで行うことができます。 譲渡不可の[「ソウルバウンド」トークン](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)の出現により、イーサリアムアドレスにリンクされた経験や経歴を個人が証明できるようになるため、DeSciで重要な役割を果たす可能性があります。
+[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6)は、実施されている研究実験の分散型データリポジトリへの鍵として機能し、NFTや[DeFi](/glossary/#defi)の金融化(フラクショナル化からレンディングプール、価値評価まで)に接続することも可能です。 また、[VitaDAO](https://www.vitadao.com/)のようなDAOなど、ネイティブにオンチェーンのエンティティが、研究を直接オンチェーンで実施することも可能になります。
+譲渡不可能な["ソウルバウンド"トークン](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)の登場は、個人が自身のイーサリアムアドレスに紐づいた経験や信用情報を証明することを可能にするため、DeSciにおいて重要な役割を果たす可能性があります。
### データストレージ、アクセス、アーキテクチャ {#data-storage}
Web3の様式を活用することで科学データへのアクセスが大幅に向上し、分散ストレージによって研究成果を大災害から守ることができます。
-起点となるシステムは、適切かつ検証可能な認証情報を備えた分散型アイデンティティでアクセスできる必要があります。 そうすることで、冗長性や検閲耐性、結果の再現を可能にし、さらには複数の関係者が協力してデータセットに新しいデータを追加できるようになり、信頼のおける関係者によって機密データを安全に再生することができます。 [compute-to-data](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol)のような機密コンピューティング方法は、生データの再生への代替アクセス機構を提供し、極めて機密性の高いデータに対して「信頼できる研究環境」を生成します。 [NHS](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb)は、信頼できる研究環境について、データプライバシーとコラボレーションにおいて将来的な解決策であると言及しています。これは、研究者がデータを安全に扱い、コードやプラクティスを共有するための標準化された環境を利用してオンサイトで作業できるエコシステムの構築を意味します。
+起点となるシステムは、適切かつ検証可能な認証情報を備えた分散型アイデンティティでアクセスできる必要があります。 そうすることで、冗長性や検閲耐性、結果の再現を可能にし、さらには複数の関係者が協力してデータセットに新しいデータを追加できるようになり、信頼のおける関係者によって機密データを安全に再生することができます。 [コンピュート・トゥ・データ](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol)のような秘匿コンピューティング手法は、生データの複製に代わるアクセスメカニズムを提供し、最も機密性の高いデータのために信頼できる研究環境を創出します。 信頼できる研究環境は、研究者がコードやプラクティスを共有するための標準化された環境を使用してオンサイトで安全にデータと連携できるエコシステムを作成することで、データプライバシーとコラボレーションの将来を見据えたソリューションとして、[NHSによって言及されています](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb)。
柔軟なWeb3データソリューションは、上記のシナリオをサポートし、研究者がアクセス許可や手数料なしで公共財を作成できる真のオープンサイエンスの基盤を提供します。 IPFS、Arweave、FilecoinなどのWeb3パブリックデータソリューションは、分散化のために最適化されています。 たとえば、dClimateは、気象観測所や予測気候モデルなどを含む、気候や気象データへの普遍的なアクセスを提供しています。
-## 参加 {#get-involved}
+## 参加する {#get-involved}
プロジェクトを探索し、DeSciコミュニティに参加してください。
-- [DeSci.Global: グローバルなイベントとオフ会カレンダー](https://desci.global)
-- [サイエンステレグラムのためのブロックチェーン](https://t.me/BlockchainForScience)
-- [Molecule: 研究プロジェクトのための資金提供と資金獲得](https://www.molecule.xyz/)
-- [VitaDAO: 長寿研究のための研究スポンサー契約を通じた資金獲得](https://www.vitadao.com/)
+- [DeSci.Global: 世界的なイベントとミートアップカレンダー](https://desci.global)
+- [Blockchain for Science Telegram](https://t.me/BlockchainForScience)
+- [Molecule: 研究プロジェクトへの資金提供と資金調達](https://www.molecule.xyz/)
+- [VitaDAO: 長寿研究のためのスポンサー付き研究契約を通じて資金提供を受ける](https://www.vitadao.com/)
- [ResearchHub: 科学的成果を投稿し、仲間と会話する](https://www.researchhub.com/)
-- [dClimate API: 分散型コミュニティに収集された気候データのクエリ](https://www.dclimate.net/)
-- [DeSci財団: DeSci出版ツールビルダー](https://descifoundation.org/)
-- [DeSci.World: ユーザーが閲覧して参加できる分散型科学のワンストップショップ](https://desci.world)
-- [OceanDAO: データ関連科学のための、DAOに統制された資金調達](https://oceanprotocol.com/)
-- [Opsciana: オープン分散型サイエンスワークフロー](https://opsci.io/research/)
-- [Bio.xyz: バイオテクノロジーDAOや分散型サイエンスプロジェクトのための資金獲得](https://www.bio.xyz/)
-- [Flemingプロトコル: 共同のバイオメディカルの発見を促進するオープンソースのデータエコノミー](http://flemingprotocol.io/)
+- [dClimate API: 分散型コミュニティによって収集された気候データをクエリする](https://www.dclimate.net/)
+- [DeSci Foundation: DeSci出版ツールビルダー](https://descifoundation.org/)
+- [DeSci.World: ユーザーが分散型科学を閲覧し、関与するためのワンストップショップ](https://desci.world)
+- [OceanDAO: データ関連科学のためのDAOによる資金調達](https://oceanprotocol.com/)
+- [Opscientia: オープンな分散型科学ワークフロー](https://opsci.io/research/)
+- [Bio.xyz: バイオテクノロジーDAOまたはDeSciプロジェクトのための資金調達](https://www.bio.xyz/)
+- [Fleming Protocol: 協調的な生物医学的発見を促進するオープンソースのデータエコノミー](http://flemingprotocol.io/)
- [Active Inference Institute](https://www.activeinference.org/)
-- [IdeaMarkets: 分散型科学の信ぴょう性の有効化](https://ideamarket.io/)
+- [IdeaMarkets: 分散型科学の信頼性を実現](https://ideamarket.io/)
- [DeSci Labs](https://www.desci.com/)
-- [ValleyDAO: オープンなグローバルコミュニティで合成生物学研究のファンディングおよび翻訳に関するサポートを提供](https://www.valleydao.bio)
-- [Cerebrum DAO: 脳の健康と神経変性を防ぐためのソリューションの調達と育成](https://www.cerebrumdao.com/)
-- [CryoDAO: 冷凍保存分野におけるムーンショット型研究へのファンディング](https://www.cryodao.org)
-
-新しいプロジェクトを提案する際には[ポリシー一覧](/contributing/adding-desci-projects/)をご覧ください。
-
-## 参考文献 {#further-reading}
-
-- [Jocelynn PearlとUltraareによるDeSci Wiki](https://docs.google.com/document/d/1aQC6zn-eXflSmpts0XGE7CawbUEHwnL6o-OFXO52PTc/edit#)
-- [Jocelynn Pearlによるa16zの未来のための分散型バイオテックのガイド](https://future.a16z.com/a-guide-to-decentralized-biotech/)
-- [DeSciのケース](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/)
-- [DeSciのガイド](https://future.com/what-is-decentralized-science-aka-desci/)
-- [分散型科学のリソース](https://www.vincentweisser.com/desci)
-- [MoleculeのBiopharma IP-NFTs - 技術説明](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description)
-- [Jon Starrによるトラストレスな科学システムの構築](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673)
-- [Paul Kohlaas - DeSci: 分散型科学の未来(ポッドキャスト)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a)
-- [分散型サイエンスのための活発な推論オントロジー: 状況感覚から知識コモンズへ](https://zenodo.org/record/6320575)
-- [DeSci: Samuel Akinoshoによる研究の未来](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec)
-- [サイエンスファンディング(エピローグ: DeSciと新しい暗号プリミティブ) by Nadia](https://nadia.xyz/science-funding)
-- [分散化は薬物開発を妨害する](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f)
-- [DeSci - 分散型科学とは何か?](https://usadailytimes.com/2022/09/12/what-is-desci-decentralized-science/)
+- [ValleyDAO: 合成生物学研究に資金提供とトランスレーショナルサポートを提供するオープンなグローバルコミュニティ](https://www.valleydao.bio)
+- [Cerebrum DAO: 脳の健康を促進し、神経変性を予防するためのソリューションのソーシングと育成](https://www.cerebrumdao.com/)
+- [CryoDAO: 人体冷凍保存分野のムーンショット研究への資金提供](https://www.cryodao.org)
+- [Elata: 精神医学の未来に発言権を持つ](https://www.elata.bio/)
+
+新しいプロジェクトの掲載提案を歓迎します。まずは[掲載ポリシー](/contributing/adding-desci-projects/)をご覧ください。
+
+## 参考リンク {#further-reading}
+
+- [Jocelynn PearlとUltrarareによるDeSci Wiki](https://docs.google.com/document/d/1aQC6zn-eXflSmpts0XGE7CawbUEHwnL6o-OFXO52PTc/edit#)
+- [Jocelynn Pearlによる分散型バイオテクノロジーのガイド(a16z future)](https://future.a16z.com/a-guide-to-decentralized-biotech/)
+- [DeSciの事例](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/)
+- [DeSciガイド](https://future.com/what-is-decentralized-science-aka-desci/)
+- [分散型科学リソース](https://www.vincentweisser.com/desci)
+- [Moleculeのバイオ医薬品IP-NFT - 技術的説明](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description)
+- [Jon Starr著『トラストが不要な科学のシステムの構築』](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673)
+- [Paul Kohlhaas - DeSci: 分散型科学の未来(ポッドキャスト)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a)
+- [分散型科学のための能動的推論オントロジー: 状況的意味形成から認識論的コモンズまで](https://zenodo.org/record/6320575)
+- [Samuel Akinosho著『DeSci: 研究の未来』](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec)
+- [Nadia著『科学への資金提供(エピローグ: DeSciと新しい暗号プリミティブ)』](https://nadia.xyz/science-funding)
+- [分散化が医薬品開発を破壊する](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f)
+- [DeSci(分散型科学)とは何か](https://usadailytimes.com/2022/09/12/what-is-desci-decentralized-science/)
### 動画 {#videos}
- [分散型科学とは何か](https://www.youtube.com/watch?v=-DeMklVWNdA)
-- [長寿研究と暗号の交点についてのVitalik Buterinと科学者Aubrey de Greyの会話](https://www.youtube.com/watch?v=x9TSJK1widA)
-- [破綻している科学出版業界を Web3で救えるか?](https://www.youtube.com/watch?v=WkvzYgCvWj8)
-- [Juan Benet - DeSci、Independent Labs、及び大規模データサイエンス](https://www.youtube.com/watch?v=zkXM9H90g_E)
-- [Sebastian Brunemeier - DeSciによる生体医学研究 & ベンチャーキャピタルの転換](https://www.youtube.com/watch?v=qB4Tc3FcVbM)
-- [Paige Donner - Web3とブロックチェーンによるオープンサイエンスのツール化](https://www.youtube.com/watch?v=nC-2QWQ-lgw&t=17s)
+- [Vitalik Buterinと科学者Aubrey de Greyの対談: 長寿研究と暗号通貨の交差点](https://www.youtube.com/watch?v=x9TSJK1widA)
+- 科学出版は破綻している。 Web3はそれを修正できるか?](https://www.youtube.com/watch?v=WkvzYgCvWj8)
+- [Juan Benet - DeSci、独立研究室、大規模データサイエンス](https://www.youtube.com/watch?v=zkXM9H90g_E)
+- [Sebastian Brunemeier - DeSciはいかにして生物医学研究とベンチャーキャピタルを変革できるか](https://www.youtube.com/watch?v=qB4Tc3FcVbM)
+- [Paige Donner - Web3とブロックチェーンによるオープンサイエンスのツーリング](https://www.youtube.com/watch?v=nC-2QWQ-lgw&t=17s)
diff --git a/public/content/translations/ja/developers/docs/accounts/index.md b/public/content/translations/ja/developers/docs/accounts/index.md
index e638d0c0488..5e7a041ee2d 100644
--- a/public/content/translations/ja/developers/docs/accounts/index.md
+++ b/public/content/translations/ja/developers/docs/accounts/index.md
@@ -1,28 +1,28 @@
---
-title: イーサリアムアカウント
-description: イーサリアムアカウントの説明 - データ構造、鍵ペア暗号技術との関係
+title: "イーサリアムアカウント"
+description: "イーサリアムアカウントの説明 - データ構造、鍵ペア暗号技術との関係"
lang: ja
---
-イーサリアムアカウントとは、イーサリアム上でトランザクションを送信できるEther(ETH)残高を持つエンティティです。 アカウントはユーザーが管理し、スマートコントラクトとしてデプロイすることができます。
+イーサリアムアカウントは、イーサ(ETH)残高を持ち、イーサリアム上でメッセージを送信できるエンティティです。 アカウントはユーザーが管理し、スマートコントラクトとしてデプロイすることができます。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-このページをよりよく理解するためには、[イーサリアム入門](/developers/docs/intro-to-ethereum/)を読むことをお勧めします。
+このページをよりよく理解するために、まず[イーサリアム入門](/developers/docs/intro-to-ethereum/)を読むことをお勧めします。
## アカウントの種類 {#types-of-account}
イーサリアムには2種類のアカウントがあります。
- 外部所有アカウント(EOA) – 秘密鍵の保有者により管理
-- コントラクトアカウント – ネットワークにデプロイされたスマートコントラクトでコードにより制御される。 [スマートコントラクト](/developers/docs/smart-contracts/)の詳細
+- コントラクトアカウント – ネットワークにデプロイされたスマートコントラクトでコードにより制御される。 [スマートコントラクト](/developers/docs/smart-contracts/)について学ぶ
両方のアカウントで次のことができます。
- ETHやトークンの受信、保有、送信
- 展開されたスマートコントラクトとのやりとり
-### 主な相違点 {#key-differences}
+### 主な違い {#key-differences}
**外部所有アカウント**
@@ -31,10 +31,10 @@ lang: ja
- 外部所有アカウント間のトランザクションは、ETHやトークンの送金のみ可能
- アカウントの活動をコントロールする公開鍵と秘密鍵という暗号鍵のペアで構成
-**コントラクトアカウント**
+**コントラクト**
- コントラクト作成は有償(ネットワークストレージを使用するため)
-- トランザクションの受信に応じてのみ、トランザクションを送信可能
+- トランザクションを受信することに対してのみメッセージを送信可能
- 外部アカウントからコントラクトアカウントへのトランザクションは、トークンの転送や新しいコントラクト作成まで、さまざまなアクションを実行するコードをトリガー可能
- コントラクトアカウントには秘密鍵がなく スマートコントラクトのコードのロジックによって制御される
@@ -42,14 +42,15 @@ lang: ja
イーサリアムアカウントには4つのフィールドがあります。
-- `nonce` – カウンターで、外部所有アカウントから送信されたトランザクションの数、あるいはコントラクトアカウントによって作成されたコントラクトの数を表します。 各アカウントは、既定のnonceを持つトランザクションを1回だけ実行するように設計されています。これにより、署名済みのトランザクションが繰り返しブロードキャスト、再実行されるリプレイ攻撃を防いでいます。
-- `balance` - アドレスが所有するwei額。 weiはETHの最小単位で、1ETHは1e+18wei。
-- `codeHash` - このハッシュは、イーサリアム仮想マシン(EVM)のアカウントの_コード_を指す。 コントラクトアカウントには、さまざまな操作を行えるコードの断片がプログラムされており、 このEVMコードはアカウントにメッセージ呼び出しがあった場合に実行される。 他のアカウントのフィールドとは異なり、変更することはできない。 このようなコードの断片はすべて、対応するハッシュの状態データベースに含まれ、後で取得可能。 このハッシュ値がcodeHashとして知られている。 外部所有アカウントの場合、codeHashフィールドは空の文字列のハッシュとなる。
-- `storageRoot` – ストレージハッシュとも呼ばれる。 アカウントのストレージ内容をコード化するMerkle Patriciaツリーのルートノードの256ビットハッシュ(256ビット整数値間のマッピング)で、256ビット整数キーのKeccak 256ビットハッシュからRLPエンコードされた256ビット整数値へのマッピングとしてデジタルツリーの中へコード化される。 このツリーは、このアカウントのストレージコンテンツのハッシュであり、デフォルトは空です。
+- `nonce` – 外部所有アカウントから送信されたトランザクションの数、またはコントラクトアカウントによって作成されたコントラクトの数を示すカウンター。 各アカウントは、既定のnonceを持つトランザクションを1回だけ実行するように設計されています。これにより、署名済みのトランザクションが繰り返しブロードキャスト、再実行されるリプレイ攻撃を防いでいます。
+- `balance` – このアドレスが所有するweiの数。 weiはETHの最小単位で、1ETHは1e+18wei。
+- `codeHash` – このハッシュは、イーサリアム仮想マシン(EVM)のアカウントの_コード_を指します。 コントラクトアカウントには、さまざまな操作を行えるコードの断片がプログラムされており、 このEVMコードはアカウントにメッセージ呼び出しがあった場合に実行される。 他のアカウントのフィールドとは異なり、変更することはできない。 このようなコードの断片はすべて、対応するハッシュの状態データベースに含まれ、後で取得可能。 このハッシュ値がcodeHashとして知られている。 外部所有アカウントの場合、codeHashフィールドは空の文字列のハッシュとなる。
+- `storageRoot` – ストレージハッシュとも呼ばれます。 アカウントのストレージ内容(256ビット整数値間のマッピング)をエンコードする[マークルパトリシアトライ](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/)のルートノードの256ビットハッシュであり、256ビット整数キーのKeccak-256ハッシュからRLPエンコードされた256ビット整数値へのマッピングとしてトライにエンコードされます。 このツリーは、このアカウントのストレージコンテンツのハッシュであり、デフォルトは空です。
- _ [イーサリアムEVM](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)からの図解_
+
+_図は[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)を参考に作成_
-## 外部所有アカウントと鍵のペア {#externally-owned-accounts-and-key-pairs}
+## 外部所有アカウントと鍵ペア {#externally-owned-accounts-and-key-pairs}
アカウントは、公開鍵と秘密鍵の暗号鍵のペアで構成されています。 トランザクションが送信者によって実際に署名されていることを証明し、偽造を防ぐためです。 秘密鍵はトランザクションの署名に使用されるもので、アカウントに紐づく資金を管理する権限を与えます。 暗号通貨を実際に保有することはなく、秘密鍵を保有するだけで、資金は常にイーサリアム台帳にあります。
@@ -63,36 +64,36 @@ lang: ja
秘密鍵は64文字で構成されており、パスワードで暗号化することができます。
-例:
+例:
`fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f`
-公開鍵は、秘密鍵から[楕円曲線DSA](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm)を用いて生成されます。 公開鍵のkeccak-256ハッシュの末尾20バイトに`0x` を先頭に追加することで、アカウントの公開アドレスを取得できます。
+公開鍵は、[楕円曲線デジタル署名アルゴリズム](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm)を用いて秘密鍵から生成されます。 アカウントの公開アドレスは、公開鍵のKeccak-256ハッシュの最後の20バイトを取り出し、先頭に「0x」を付加することで得られます。
-これにより、外部所有アカウント (EOA) は42文字のアドレスを持ちます (20バイトのセグメントの40文字の16進数と `0x` のプレフィックスから成ります) 。
+これは、外部所有アカウント(EOA)のアドレスが42文字(20バイトのセグメントである40の16進文字に、プレフィックス「0x」を加えたもの)であることを意味します。
-例:
+例:
`0x5e97870f263700f46aa00d967821199b9bc5a120`
-次の例は、[Clef](https://geth.ethereum.org/docs/tools/clef/introduction) というサインツールで、新しいアカウントを生成する方法です。 Clefは、イーサリアムクライアントの[Geth](https://geth.ethereum.org)に含まれる、アカウント管理および署名ツールです。 `clef newaccount`コマンドは、新しい鍵ペアを作成して、暗号化された鍵ストアに保存します。
+以下の例では、[Clef](https://geth.ethereum.org/docs/tools/clef/introduction)という署名ツールを使って新しいアカウントを生成する方法を説明します。 Clefは、イーサリアムクライアントである[Geth](https://geth.ethereum.org)にバンドルされているアカウント管理・署名ツールです。 `clef newaccount`コマンドは、新しい鍵ペアを作成し、暗号化されたキーストアに保存します。
```
> clef newaccount --keystore
-Please enter a password for the new account to be created:
+作成する新しいアカウントのパスワードを入力してください:
>
------------
-INFO [10-28|16:19:09.156] Your new key was generated address=0x5e97870f263700f46aa00d967821199b9bc5a120
-WARN [10-28|16:19:09.306] Please backup your key file path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120
-WARN [10-28|16:19:09.306] Please remember your password!
-Generated account 0x5e97870f263700f46aa00d967821199b9bc5a120
+INFO [10-28|16:19:09.156] 新しい鍵が生成されました address=0x5e97870f263700f46aa00d967821199b9bc5a120
+WARN [10-28|16:19:09.306] 鍵ファイルをバックアップしてください path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120
+WARN [10-28|16:19:09.306] パスワードを忘れないでください!
+生成されたアカウント 0x5e97870f263700f46aa00d967821199b9bc5a120
```
-[GETHのドキュメント](https://geth.ethereum.org/docs)
+[Gethドキュメンテーション](https://geth.ethereum.org/docs)
-秘密鍵から新しい公開鍵を生成することは可能ですが、公開鍵から秘密鍵を生成することはできません。 秘密鍵を安全に保つことは非常に重要であり、その名の通り**秘密**にしておくべきです。
+秘密鍵から新しい公開鍵を生成することは可能ですが、公開鍵から秘密鍵を生成することはできません。 秘密鍵を安全に保管し、その名の通り**秘密**にしておくことが極めて重要です。
署名を出力するメッセージとトランザクションに署名するには秘密鍵が必要です。 他者はそのメッセージの発信者を証明するための署名を取り出すことができます。 アプリケーション内では、JavaScriptライブラリを使用してネットワークにトランザクションを送信できます。
@@ -100,19 +101,19 @@ Generated account 0x5e97870f263700f46aa00d967821199b9bc5a120
コントラクトアカウントも、 42文字の16進数のアドレスを持っています。
-例:
+例:
`0x06012c8cf97bead5deae237070f9587f8e7a266d`
通常、コントラクトアドレスは、コントラクトがイーサリアムブロックチェーンにデプロイされるときに与えられます。 アドレスは作成者のアドレスとそのアドレスから送信されたトランザクション数(nonce)から作られます。
-## バリデータ鍵 {#validators-keys}
+## バリデータキー {#validators-keys}
イーサリアムにはもう1種類の鍵があり、これはイーサリアムがプルーフ・オブ・ワークからプルーフ・オブ・ステークに基づくコンセンサスに切り替えた際に導入されたものです。 「BLS」鍵で、バリデータを識別するために使用されます。 これらの鍵は効率的に集約され、ネットワークがコンセンサスに至るまでに必要な帯域幅を削減できます。 この鍵集約がなければ、バリデータの最小ステーク額ははるかに高くなってしまいます。
-[バリデータ鍵の詳細](/developers/docs/consensus-mechanisms/pos/keys/)
+[バリデータキーの詳細](/developers/docs/consensus-mechanisms/pos/keys/)
-## ウォレットについて {#a-note-on-wallets}
+## ウォレットに関する注記 {#a-note-on-wallets}
アカウントはウォレットではありません。 ウォレットは、イーサリアムのアカウント(外部所有アカウントまたはコントラクトアカウント)とやり取りするためのインターフェースやアプリケーションです。
@@ -124,11 +125,11 @@ Generated account 0x5e97870f263700f46aa00d967821199b9bc5a120
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [イーサリアムアカウントについて理解する](https://info.etherscan.com/understanding-ethereum-accounts/) - etherscan
+- [イーサリアムアカウントの理解](https://info.etherscan.com/understanding-ethereum-accounts/) - Etherscan
-_役に立つコミュニティリソースをご存知の場合は、 ページを編集して追加してください。_
+_役に立つコミュニティリソースを知っていますか? Edit this page and add it!_
## 関連トピック {#related-topics}
diff --git a/public/content/translations/ja/developers/docs/apis/backend/index.md b/public/content/translations/ja/developers/docs/apis/backend/index.md
index 4183389e222..fd8a2ee761a 100644
--- a/public/content/translations/ja/developers/docs/apis/backend/index.md
+++ b/public/content/translations/ja/developers/docs/apis/backend/index.md
@@ -1,66 +1,71 @@
---
-title: バックエンドAPIライブラリ
-description: アプリケーションからブロックチェーンへやりとりできるイーサリアムクライアントAPIの紹介。
+title: "バックエンドAPIライブラリ"
+description: "アプリケーションからブロックチェーンへやりとりできるイーサリアムクライアントAPIの紹介。"
lang: ja
---
-ソフトウェアアプリケーションがイーサリアムブロックチェーンとやりとりを行うには (例: ブロックチェーンデータの読み込み、トランザクションの送信など) 、イーサリアムノードに接続する必要があります。
+ソフトウェアアプリケーションがイーサリアムブロックチェーンとやりとりを行うには(つまり、ブロックチェーンデータの読み込みやネットワークへのトランザクションの送信)、イーサリアムノードに接続する必要があります。
-この目的のために、すべてのイーサリアムクライアントは[JSON-RPC](/developers/docs/apis/json-rpc/)の仕様を実装しています。そのため、アプリケーションは統一された[メソッド](/developers/docs/apis/json-rpc/#json-rpc-methods)のセットを使用できます。
+この目的のために、すべてのイーサリアムクライアントは[JSON-RPC](/developers/docs/apis/json-rpc/)仕様を実装しているため、アプリケーションが信頼して利用できる統一された[メソッド](/developers/docs/apis/json-rpc/#json-rpc-methods)のセットが用意されています。
もし特定のプログラミング言語を使用してイーサリアムノードに接続したい場合には、独自のソリューションのほかに公開されている既存のライブライを使用することでより簡単に実装できます。 これらのライブラリにより、デベロッパーは直感的な1行のメソッドを作成するだけで、イーサリアムとやり取りするJSON-RPCリクエストを (内部的に) 初期化できるようになります。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-[イーサリアムスタック](/developers/docs/ethereum-stack/) と [イーサリアムクライアント](/developers/docs/nodes-and-clients/)も内容を理解するのに役立ちます。
+[イーサリアムスタック](/developers/docs/ethereum-stack/)と[イーサリアムクライアント](/developers/docs/nodes-and-clients/)を理解しておくと、役立つでしょう。
## ライブラリの利点 {#why-use-a-library}
-これらのライブラリは、イーサリアムノードと直接やり取りする複雑な大部分を抽象化します。 また、ユーティリティ関数 (ETHをGweiに変換する関数など) も提供されています。そのため、デベロッパーは複雑なイーサリアムクライアントの作業に費やす時間を削減でき、自身のアプリケーションの独自機能の開発作業に専念できます。
+これらのライブラリにより、イーサリアムノードと直接やり取りする際の複雑さが抽象化されます。 また、ユーティリティ関数(例: ETHからGweiへの変換)も提供されているため、開発者はイーサリアムクライアントの複雑な処理に費やす時間を減らし、アプリケーション独自の機能に集中できます。
## 利用可能なライブラリ {#available-libraries}
### インフラストラクチャとノードサービス {#infrastructure-and-node-services}
-**Alchemy -** **_イーサリアム開発プラットフォーム_**
+**Alchemy -** **_Ethereum開発プラットフォーム。_**
- [alchemy.com](https://www.alchemy.com/)
-- [ドキュメント](https://docs.alchemy.com/)
+- [ドキュメント](https://www.alchemy.com/docs/)
- [GitHub](https://github.com/alchemyplatform)
- [Discord](https://discord.com/invite/alchemyplatform)
-**All That Node -** **_ノード・アズ・ア・サービス_**
+**All That Node -** **_サービスとしてのノード。_**
- [All That Node.com](https://www.allthatnode.com/)
- [ドキュメント](https://docs.allthatnode.com)
- [Discord](https://discord.gg/GmcdVEUbJM)
-**Blast by Bware Labs -** **_イーサリアムメインネットとテストネットのための分散型API_**
+**Blast by Bware Labs -** **_イーサリアムメインネットおよびテストネット用の分散型API。_**
- [blastapi.io](https://blastapi.io/)
- [ドキュメント](https://docs.blastapi.io)
-- [Discord](https://discord.gg/bwarelabs)
+- [Discord](https://discord.gg/SaRqmRUjjQ)
-**BlockPi -** **_より効率的かつ高速なRPCサービスを提供_**
+**BlockPi -** **_より効率的で高速なRPCサービスを提供_**
- [blockpi.io](https://blockpi.io/)
- [ドキュメント](https://docs.blockpi.io/)
- [GitHub](https://github.com/BlockPILabs)
- [Discord](https://discord.com/invite/xTvGVrGVZv)
-**Cloudflareのイーサリアムゲートウェイ**
+**Cloudflareイーサリアムゲートウェイ。**
- [cloudflare-eth.com](https://www.cloudflare.com/application-services/products/web3/)
**Etherscan - ブロックエクスプローラーおよびトランザクションAPI**
+
- [ドキュメント](https://docs.etherscan.io/)
-**GetBlock-** **_Web3開発用のBlockchain-as-a-service_**
+**Blockscout - オープンソースブロックエクスプローラー**
+
+- [ドキュメント](https://docs.blockscout.com/)
+
+**GetBlock -** **_Web3開発向けのサービスとしてのブロックチェーン_**
- [GetBlock.io](https://getblock.io/)
-- [ドキュメント](https://getblock.io/docs/)
+- [ドキュメント](https://docs.getblock.io/)
-**Infura -** **_アズ・ア・サービス型のイーサリアムAPI_**
+**Infura -** **_サービスとしてのイーサリアムAPI。_**
- [infura.io](https://infura.io)
- [ドキュメント](https://docs.infura.io/api)
@@ -71,24 +76,24 @@ lang: ja
- [noderpc.xyz](https://www.noderpc.xyz/)
- [ドキュメント](https://docs.noderpc.xyz/node-rpc)
-**NOWNodes - _フルノードとブロックエクスプローラー_**
+**NOWNodes - _フルノードとブロックエクスプローラー。_**
- [NOWNodes.io](https://nownodes.io/)
-- [ドキュメント](https://documenter.getpostman.com/view/13630829/TVmFkLwy#intro)
+- [ドキュメント](https://nownodes.gitbook.io/documentation)
-**QuickNode -** **_アズ・ア・サービス型のブロックチェーンインフラストラクチャ_**
+**QuickNode -** **_サービスとしてのブロックチェーンインフラストラクチャ。_**
- [quicknode.com](https://quicknode.com)
- [ドキュメント](https://www.quicknode.com/docs/welcome)
- [Discord](https://discord.gg/quicknode)
-**Rivet -** **_オープンソースソフトウェアを搭載した、アズ・ア・サービス型のイーサリアムとイーサリアムクラシックのAPI_**
+**Rivet -** **_オープンソースソフトウェアを搭載した、サービスとしてのイーサリアムおよびイーサリアムクラシックAPI。_**
- [rivet.cloud](https://rivet.cloud)
- [ドキュメント](https://rivet.cloud/docs/)
- [GitHub](https://github.com/openrelayxyz/ethercattle-deployment)
-**Zmok -** **_JSON-RPC/WebSocket APIとしてのスピード重視のイーサリアムノード_**
+**Zmok -** **_速度を重視した、JSON-RPC/WebSockets APIとしてのイーサリアムノード。_**
- [zmok.io](https://zmok.io/)
- [GitHub](https://github.com/zmok-io)
@@ -97,32 +102,32 @@ lang: ja
### 開発ツール {#development-tools}
-**ethers-kt -** **_EVMベースのブロックチェーン用の非同期、ハイパフォーマンスのKotlin/Java/Androidライブラリ_**
+**ethers-kt -** **_EVMベースのブロックチェーン向けの、非同期で高性能なKotlin/Java/Androidライブラリ。_**
- [GitHub](https://github.com/Kr1ptal/ethers-kt)
-- [実例:](https://github.com/Kr1ptal/ethers-kt/tree/master/examples)
+- [サンプル](https://github.com/Kr1ptal/ethers-kt/tree/master/examples)
- [Discord](https://discord.gg/rx35NzQGSb)
-**Nethereum -** **_オープンソースのブロックチェーン用.NET統合ライブラリ_**
+**Nethereum -** **_ブロックチェーン向けのオープンソース.NET統合ライブラリ。_**
- [GitHub](https://github.com/Nethereum/Nethereum)
- [ドキュメント](http://docs.nethereum.com/en/latest/)
- [Discord](https://discord.com/invite/jQPrR58FxX)
-**Python Tooling -** **_Pythonでイーサリアムとやり取りするための各種ライブラリ_**
+**Python Tooling -** **_Pythonでイーサリアムと対話するための各種ライブラリ。_**
-- [py.ethereum.org](https://python.ethereum.org/)
+- [py.ethereum.org](https://snakecharmers.ethereum.org/)
- [web3.py GitHub](https://github.com/ethereum/web3.py)
-- [web3.pyチャット](https://gitter.im/ethereum/web3.py)
+- [web3.py Chat](https://gitter.im/ethereum/web3.py)
-**Tatum -** **_究極のブロックチェーン開発プラットフォーム_**
+**Tatum -** **_究極のブロックチェーン開発プラットフォーム。_**
- [Tatum](https://tatum.io/)
- [GitHub](https://github.com/tatumio/)
- [ドキュメント](https://docs.tatum.io/)
- [Discord](https://discord.gg/EDmW3kjTC9)
-**web3j -** **_イーサリアム用のJava/Android/Kotlin/Scalaの統合ライブラリ_**
+**web3j -** **_イーサリアム向けのJava/Android/Kotlin/Scala統合ライブラリ。_**
- [GitHub](https://github.com/web3j/web3j)
- [ドキュメント](https://docs.web3j.io/)
@@ -130,34 +135,34 @@ lang: ja
### ブロックチェーンサービス {#blockchain-services}
-**BlockCypher -** **_イーサリアム Web API_**
+**BlockCypher -** **_イーサリアムWeb API。_**
- [blockcypher.com](https://www.blockcypher.com/)
- [ドキュメント](https://www.blockcypher.com/dev/ethereum/)
-**Chainbase -** **_イーサリアム向けのオールインワンWeb3データインフラストラクチャ_**
+**Chainbase -** **_イーサリアム向けのオールインワンWeb3データインフラストラクチャ。_**
- [chainbase.com](https://chainbase.com/)
- [ドキュメント](https://docs.chainbase.com/)
- [Discord](https://discord.gg/Wx6qpqz4AF)
-**Chainstack -** **_柔軟性の高い、専用のアズ・ア・サービス型イーサリアムノード_**
+**Chainstack -** **_柔軟で専用の、サービスとしてのイーサリアムノード。_**
- [chainstack.com](https://chainstack.com)
-- [ドキュメンテーション](https://docs.chainbase.com/docs)
+- [ドキュメント](https://docs.chainstack.com/)
- [イーサリアムAPIリファレンス](https://docs.chainstack.com/reference/ethereum-getting-started)
-**Coinbase Cloud Node -** **_ブロックチェーンインフラストラクチャAPI_**
+**Coinbase Cloud Node -** **_ブロックチェーンインフラストラクチャAPI。_**
-- [Coinbase Cloud Node](https://www.coinbase.com/cloud)
-- [ドキュメンテーション](https://docs.cloud.coinbase.com/)
+- [Coinbase Cloud Node](https://www.coinbase.com/developer-platform)
+- [ドキュメント](https://docs.cdp.coinbase.com/)
-**Figment社が提供するDataHub -** **_イーサリアムプロトコル(メインネットとテストネット)を使用したWeb3 APIサービス_**
+**DataHub by Figment -** **_イーサリアムメインネットおよびテストネット対応のWeb3 APIサービス。_**
- [DataHub](https://www.figment.io/)
- [ドキュメント](https://docs.figment.io/)
-**Moralis -** **_エンタープライズグレードのEVM APIプロバイダ_**
+**Moralis -** **_エンタープライズグレードのEVM APIプロバイダー。_**
- [moralis.io](https://moralis.io)
- [ドキュメント](https://docs.moralis.io/)
@@ -165,43 +170,42 @@ lang: ja
- [Discord](https://moralis.io/joindiscord/)
- [フォーラム](https://forum.moralis.io/)
-**NFTPort -** **_イーサリアムデータとミントAPI_**
+**NFTPort -** **_イーサリアムのデータおよびミントAPI。_**
- [nftport.xyz](https://www.nftport.xyz/)
- [ドキュメント](https://docs.nftport.xyz/)
- [GitHub](https://github.com/nftport/)
- [Discord](https://discord.com/invite/K8nNrEgqhE)
-**Tokenview -** **_ジェネラルなマルチクリプトブロックチェーンAPIプラットフォーム_**
+**Tokenview -** **_汎用マルチクリプト・ブロックチェーンAPIプラットフォーム。_**
- [services.tokenview.io](https://services.tokenview.io/)
- [ドキュメント](https://services.tokenview.io/docs?type=api)
- [GitHub](https://github.com/Tokenview)
-**Watchdata -** **_イーサリアムブロックチェーンへのシンプルで信頼性の高いAPIアクセス_**
+**Watchdata -** **_イーサリアムブロックチェーンへの、シンプルで信頼性の高いAPIアクセスを提供。_**
- [Watchdata](https://watchdata.io/)
- [ドキュメント](https://docs.watchdata.io/)
- [Discord](https://discord.com/invite/TZRJbZ6bdn)
-**Covalent -** **_200以上のチェーンで使えるリッチなブロックチェーンAPI_**
+**Covalent -** **_200以上のチェーンに対応した、豊富なブロックチェーンAPI。_**
- [covalenthq.com](https://www.covalenthq.com/)
- [ドキュメント](https://www.covalenthq.com/docs/api/)
- [GitHub](https://github.com/covalenthq)
- [Discord](https://www.covalenthq.com/discord/)
+## 参考リンク {#further-reading}
-## 参考文献 {#further-reading}
-
-_役に立ったコミュニティリソースがあれば、 ぜひこのページに追加してください。_
+_役に立つコミュニティリソースを知っていますか? Edit this page and add it!_
## 関連トピック {#related-topics}
-- [ ノードとクライアント](/developers/docs/nodes-and-clients/)
+- [ノードとクライアント](/developers/docs/nodes-and-clients/)
- [開発フレームワーク](/developers/docs/frameworks/)
## 関連チュートリアル {#related-tutorials}
-- [Javascriptでイーサリアムブロックチェーンを使用するためのWeb3jsのセットアップ](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– プロジェクトでweb3.jsをセットアップするための手順。_
-- [JavaScriptからスマートコントラクトを呼び出す](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– DAIトークンを使って、JavaScriptからスマートコントラクトを呼び出す方法を確認する。_
+- [JavaScriptでイーサリアムブロックチェーンを使用するためのWeb3.jsのセットアップ](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– プロジェクトでweb3.jsをセットアップする手順。_
+- [JavaScriptからスマートコントラクトを呼び出す](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– DAIトークンを使用して、JavaScriptからコントラクト関数を呼び出す方法を説明します。_
diff --git a/public/content/translations/ja/developers/docs/apis/javascript/index.md b/public/content/translations/ja/developers/docs/apis/javascript/index.md
index 5c282bdc3db..e767afdc115 100644
--- a/public/content/translations/ja/developers/docs/apis/javascript/index.md
+++ b/public/content/translations/ja/developers/docs/apis/javascript/index.md
@@ -1,41 +1,43 @@
---
-title: JavaScript APIライブラリ
-description: アプリケーションからブロックチェーンへやり取りできるJavaScriptクライアントライブラリの紹介。
+title: "JavaScript APIライブラリ"
+description: "アプリケーションからブロックチェーンへやり取りできるJavaScriptクライアントライブラリの紹介。"
lang: ja
---
-Webアプリはイーサリアムブロックチェーンとやりとりを行うために(例えば、ブロックチェーンデータの読み込みやトランザクションの送信など) 、イーサリアムノードに接続する必要があります。
+ウェブアプリがEthereumブロックチェーンと対話する(すなわち、ブロックチェーンデータの読み取りやネットワークへのトランザクション送信)には、Ethereumノードに接続する必要があります。
-この目的のために、すべてのイーサリアムクライアントは[JSON-RPC](/developers/docs/apis/json-rpc/)の仕様を実装しています。そのため、アプリケーションは統一された[メソッド](/developers/docs/apis/json-rpc/#json-rpc-methods)のセットを使用できます。
+この目的のために、すべてのEthereumクライアントは[JSON-RPC](/developers/docs/apis/json-rpc/)仕様を実装しており、アプリケーションが利用できる統一された[メソッド](/developers/docs/apis/json-rpc/#json-rpc-methods)のセットが用意されています。
JavaScriptでイーサリアムノードに接続する場合、通常のJavaScriptを使用することは可能です。しかし、エコシステム内には、作業をより簡単にするいくつかの便利なライブラリがあります。 これらのライブラリにより、デベロッパーは直感的な1行のメソッドを作成するだけで、イーサリアムとやり取りするJSON-RPCリクエストを (内部的に) 初期化できるようになります。
-[マージ](/roadmap/merge/)以降は、ノードの実行には、実行クライアントとコンセンサスクライアントという2つのつながったイーサリアムソフトウェアが必要になることに注意してください。 必ず、ノードに実行クライアントとコンセンサスクライアントの両方が含まれるようにしてください。 ノードがローカルマシン上にない(ノードがAWSインスタンス上で動作しているなど)場合は、適宜、チュートリアルのIPアドレスをアップデートしてください。 詳細については、[ノードの実行](/developers/docs/nodes-and-clients/run-a-node/)ページをご覧ください。
+[マージ](/roadmap/merge/)以降は、ノードの実行には、実行クライアントとコンセンサスクライアントという2つの接続されたEthereumソフトウェアが必要になることに注意してください。 必ず、ノードに実行クライアントとコンセンサスクライアントの両方が含まれるようにしてください。 ご使用のノードがローカルマシン上にない場合(例:ノードがAWSインスタンス上で実行されている)、チュートリアルのIPアドレスを適宜更新してください。 詳細については、[ノードの実行](/developers/docs/nodes-and-clients/run-a-node/)に関するページをご覧ください。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-JavaScriptを理解している必要があります。また、[イーサリアムスタック](/developers/docs/ethereum-stack/)と[イーサリアムクライアント](/developers/docs/nodes-and-clients/)についても理解していることが推奨されます。
+JavaScriptを理解することに加えて、[Ethereumスタック](/developers/docs/ethereum-stack/)と[Ethereumクライアント](/developers/docs/nodes-and-clients/)を理解しておくと役立つでしょう。
## ライブラリの利点 {#why-use-a-library}
-これらのライブラリにより、イーサリアムノードと直接やり取りする際の複雑さが抽象化されます。 また、ユーティリティ関数 (ETHをGweiに変換する関数など) も提供されています。そのため、デベロッパーは複雑なイーサリアムクライアントの作業に費やす時間を削減でき、自身のアプリケーションの独自機能の開発作業に専念できます。
+これらのライブラリにより、イーサリアムノードと直接やり取りする際の複雑さが抽象化されます。 また、ユーティリティ関数(例: ETHからGweiへの変換)も提供されているため、開発者はイーサリアムクライアントの複雑な処理に費やす時間を減らし、アプリケーション独自の機能に集中できます。
## ライブラリの機能 {#library-features}
-### イーサリアムノードに接続 {#connect-to-ethereum-nodes}
+### Ethereumノードへの接続 {#connect-to-ethereum-nodes}
-providersライブラリを使用することで、JSON-RPC、INFURA、Etherscan、AlchemyまたはMetaMaskであっても、イーサリアムに接続してデータを読み取ることができます。
+providersライブラリを使用することで、JSON-RPC、INFURA、Etherscan、AlchemyまたはMetaMaskに関係なく、イーサリアムに接続してデータを読み取ることができます。
+
+> **警告:** Web3.jsは2025年3月4日にアーカイブされました。 [発表を読む](https://blog.chainsafe.io/web3-js-sunset/)。 新しいプロジェクトでは、[ethers.js](https://ethers.org)や[viem](https://viem.sh)のような代替ライブラリの使用を検討してください。
**Ethers.jsを使った例**
```js
-// A BrowserProvider wraps a standard Web3 provider, which is
-// what MetaMask injects as window.ethereum into each page
+// BrowserProviderは標準のWeb3プロバイダをラップしたもので、
+// MetaMaskが各ページにwindow.ethereumとしてインジェクトするものです
const provider = new ethers.BrowserProvider(window.ethereum)
-// The MetaMask plugin also allows signing transactions to
-// send ether and pay to change state within the blockchain.
-// For this, we need the account signer...
+// MetaMaskプラグインは、トランザクションに署名して
+// イーサを送信し、ブロックチェーン内の状態を変更するための支払いを行うこともできます。
+// そのためには、アカウントの署名者が必要です...
const signer = provider.getSigner()
```
@@ -68,41 +70,41 @@ var web3 = new Web3(
- ガスの推定値
- スマートコントラクトのイベント
- ネットワークID
-- その他
+- 等々。
-### ウォレットの機能 {#wallet-functionality}
+### ウォレット機能 {#wallet-functionality}
これらのライブラリは、ウォレットの作成、キーの管理、トランザクションへ署名を行います。
Ethers.jsを使った例
```js
-// Create a wallet instance from a mnemonic...
+// ニーモニックからウォレットインスタンスを作成...
mnemonic =
"announce room limb pattern dry unit scale effort smooth jazz weasel alcohol"
walletMnemonic = Wallet.fromPhrase(mnemonic)
-// ...or from a private key
+// ...または秘密鍵から
walletPrivateKey = new Wallet(walletMnemonic.privateKey)
walletMnemonic.address === walletPrivateKey.address
// true
-// The address as a Promise per the Signer API
+// Signer APIごとのPromiseとしてのアドレス
walletMnemonic.getAddress()
// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }
-// A Wallet address is also available synchronously
+// ウォレットアドレスは同期的に利用することもできます
walletMnemonic.address
// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'
-// The internal cryptographic components
+// 内部の暗号コンポーネント
walletMnemonic.privateKey
// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'
walletMnemonic.publicKey
// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'
-// The wallet mnemonic
+// ウォレットのニーモニック
walletMnemonic.mnemonic
// {
// locale: 'en',
@@ -110,12 +112,12 @@ walletMnemonic.mnemonic
// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol'
// }
-// Note: A wallet created with a private key does not
-// have a mnemonic (the derivation prevents it)
+// 注: 秘密鍵で作成されたウォレットには
+// ニーモニックがありません (派生によりこれが妨げられるため)
walletPrivateKey.mnemonic
// null
-// Signing a message
+// メッセージへの署名
walletMnemonic.signMessage("Hello World")
// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }
@@ -124,34 +126,34 @@ tx = {
value: utils.parseEther("1.0"),
}
-// Signing a transaction
+// トランザクションへの署名
walletMnemonic.signTransaction(tx)
// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }
-// The connect method returns a new instance of the
-// Wallet connected to a provider
+// connectメソッドは、プロバイダに接続された
+// ウォレットの新しいインスタンスを返します
wallet = walletMnemonic.connect(provider)
-// Querying the network
+// ネットワークへのクエリ
wallet.getBalance()
// { Promise: { BigNumber: "42" } }
wallet.getTransactionCount()
// { Promise: 0 }
-// Sending ether
+// イーサの送信
wallet.sendTransaction(tx)
```
-[全ドキュメントを読む](https://docs.ethers.io/v5/api/signer/#Wallet)
+[完全なドキュメントを読む](https://docs.ethers.io/v5/api/signer/#Wallet)
セットアップ後、以下が可能になります。
- アカウントの作成
- トランザクションの送信
- トランザクションへの署名
-- 等々...
+- 等々。
-### スマートコントラクト関数とのやり取り {#interact-with-smart-contract-functions}
+### スマートコントラクト関数との対話 {#interact-with-smart-contract-functions}
Javascriptクライアントライブラリを使用すると、コンパイルされたコントラクトのアプリケーションバイナリインタフェース (ABI) を読み取ることによって、アプリからスマートコントラクト関数を呼び出せるようになります。
@@ -164,7 +166,7 @@ contract Test {
uint a;
address d = 0x12345678901234567890123456789012;
- function Test(uint testInt) { a = testInt;}
+ constructor(uint testInt) { a = testInt;}
event Event(uint indexed b, bytes32 c);
@@ -211,13 +213,13 @@ contract Test {
- スマートコントラクトにトランザクションを送信し、メソッドを実行
- EVMでメソッド実行時にかかるガス代を見積もるためにコール
- コントラクトのデプロイ
-- 等々...
+- その他
### ユーティリティ関数 {#utility-functions}
ユーティリティ関数は、イーサリアムでの構築を少し簡単にする便利なショートカットです。
-ETHの値は、デフォルトでweiに設定されています。 1 ETHは、1,000,000,000,000,000,000,000,000,000,000,000,000 wei です。つまり、非常に巨大な数値を扱っているということです。 Etherは`web3.utils.toWei`によって、weiに変換されます。
+ETHの値は、デフォルトでweiに設定されています。 1 ETHは、1,000,000,000,000,000,000,000,000,000,000,000,000 wei です。つまり、非常に巨大な数値を扱っているということです。 `web3.utils.toWei`は、etherをWeiに変換します。
Ethers.jsで記述した場合は次のようになります:
@@ -232,59 +234,56 @@ ethers.utils.formatEther(balance)
// '2.337132817842795605'
```
-- [Web3jsのユーティリティ関数](https://docs.web3js.org/api/web3-utils)
-- [Ethersのユーティリティ関数](https://docs.ethers.io/v5/api/utils/)
+- [Web3jsユーティリティ関数](https://docs.web3js.org/api/web3-utils)
+- [Ethersユーティリティ関数](https://docs.ethers.org/v6/api/utils/)
## 利用可能なライブラリ {#available-libraries}
-**Web3.js -** **_イーサリアムのJavaScript API_**
+**Web3.js -** **_Ethereum JavaScript API_**
-- [ドキュメント](https://docs.web3js.org/)
-- [GitHub](https://github.com/ethereum/web3.js/)
+- [ドキュメンテーション](https://docs.web3js.org)
+- [GitHub](https://github.com/ethereum/web3.js)
-**Ethers.js -** **_JavaScriptとTypeScriptでの完全なイーサリアムウォレットの実装とユーティリティ_**
+**Ethers.js -** **_JavaScriptとTypeScriptにおける完全なEthereumウォレットの実装とユーティリティ。_**
-- [ドキュメント](https://docs.ethers.io/)
-- [GitHub](https://github.com/ethers-io/ethers.js/)
+- [Ethers.jsホーム](https://ethers.org/)
+- [ドキュメンテーション](https://docs.ethers.io)
+- [GitHub](https://github.com/ethers-io/ethers.js)
-**The Graph -** **_イーサリアムとIPFSのデータをインデックス化し、GraphQLを使用してクエリを実行するためのプロトコル_**
+**The Graph -** **_EthereumとIPFSのデータをインデックス化し、GraphQLを使用してクエリを実行するためのプロトコル。_**
-- [The Graph](https://thegraph.com/)
-- [Graph Explorer](https://thegraph.com/explorer/)
-- [ドキュメント](https://thegraph.com/docs/)
-- [GitHub](https://github.com/graphprotocol/)
+- [The Graph](https://thegraph.com)
+- [Graph Explorer](https://thegraph.com/explorer)
+- [ドキュメンテーション](https://thegraph.com/docs)
+- [GitHub](https://github.com/graphprotocol)
- [Discord](https://thegraph.com/discord)
-**light.js -** **_ライトクライアント向けに最適化された高位のリアクティブJSライブラリ_**
-
-- [GitHub](https://github.com/openethereum/js-libs/tree/master/packages/light.js)
+**Alchemy SDK -** **_強化されたAPIを備えたEthers.jsのラッパー。_**
-**Alchemyweb3 -** **_自動リトライと強化されたAPIを備えた、Web3.jsのラッパー_**
+- [ドキュメンテーション](https://www.alchemy.com/docs)
+- [GitHub](https://github.com/alchemyplatform/alchemy-sdk-js)
-- [ドキュメント](https://docs.alchemy.com/reference/api-overview)
-- [GitHub](https://github.com/alchemyplatform/alchemy-web3)
+**viem -** **_EthereumのためのTypeScriptインターフェース。_**
-**Alchemy NFT API -** **_所有権やメタデータ属性などのNFTデータを取得するためのAPI_**
-
-- [ドキュメント](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api)
-- [GitHub](https://github.com/alchemyplatform/alchemy-web3)
+- [ドキュメンテーション](https://viem.sh)
+- [GitHub](https://github.com/wagmi-dev/viem)
-**viem -** **_イーサリアム用のTypeScriptインターフェース。_**
+**Drift -** **_組み込みのキャッシュ、フック、テストモックを備えたTypeScriptメタライブラリ。_**
-- [ドキュメント](https://viem.sh)
-- [GitHub](https://github.com/wagmi-dev/viem)
+- [ドキュメンテーション](https://ryangoree.github.io/drift/)
+- [GitHub](https://github.com/ryangoree/drift/)
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-_役に立ったコミュニティリソースがあれば、 ぜひこのページに追加してください。_
+_役に立つコミュニティリソースを知っていますか? Edit this page and add it!_
## 関連トピック {#related-topics}
-- [ ノードとクライアント](/developers/docs/nodes-and-clients/)
+- [ノードとクライアント](/developers/docs/nodes-and-clients/)
- [開発フレームワーク](/developers/docs/frameworks/)
## 関連チュートリアル {#related-tutorials}
-- [Javascriptでイーサリアムブロックチェーンを使用するためのWeb3jsのセットアップ](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– プロジェクトでweb3.jsをセットアップするための手順。_
-- [JavaScriptからスマートコントラクトを呼び出す](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– DAIトークンを使って、JavaScriptからスマートコントラクトを呼び出す方法を確認する。_
-- [Web3とAlchemyを使用してトランザクションを送信する](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– バックエンドからトランザクションを送信するための段階的ガイド。_
+- [JavaScriptでイーサリアムブロックチェーンを使用するためのWeb3.jsのセットアップ](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– プロジェクトでweb3.jsをセットアップする手順。_
+- [JavaScriptからスマートコントラクトを呼び出す](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– DAIトークンを使用して、JavaScriptからコントラクト関数を呼び出す方法を説明します。_
+- [web3とAlchemyを使用したトランザクションの送信](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– バックエンドからトランザクションを送信するためのステップバイステップのウォークスルー。_
diff --git a/public/content/translations/ja/developers/docs/apis/json-rpc/index.md b/public/content/translations/ja/developers/docs/apis/json-rpc/index.md
index 54c178cd6a7..a91f6d1a06b 100644
--- a/public/content/translations/ja/developers/docs/apis/json-rpc/index.md
+++ b/public/content/translations/ja/developers/docs/apis/json-rpc/index.md
@@ -1,40 +1,40 @@
---
title: JSON-RPC API
-description: イーサリアムクライアント用のステートレスで軽量なリモートプロシージャコール(RPC)プロトコル。
+description: "イーサリアムクライアント用のステートレスで軽量なリモートプロシージャコール(RPC)プロトコル。"
lang: ja
---
ブロックチェーンデータの読み取りやネットワークへのトランザクションの送信など、ソフトウェアアプリケーションがイーサリアムブロックチェーンとやり取りするには、イーサリアムノードに接続する必要があります。
-そのため、すべての[イーサリアムクライアント](/developers/docs/nodes-and-clients/#execution-clients)は[JSON-RPC仕様](https://github.com/ethereum/execution-apis)を実装しており、ノードやクライアントの実装がどのようなものであっても、アプリケーションは統一されたメソッドのセットを使用できます。
+この目的のために、すべての[Ethereumクライアント](/developers/docs/nodes-and-clients/#execution-clients)は[JSON-RPC仕様](https://github.com/ethereum/execution-apis)を実装しているため、特定のノードやクライアントの実装に関係なく、アプリケーションが依拠できる統一されたメソッドセットが存在します。
[JSON-RPC](https://www.jsonrpc.org/specification)は、ステートレスで軽量なリモートプロシージャコール(RPC)プロトコルです。 いくつかのデータ構造とその処理に関するルールを定義しています。 トランスポートに依存しないため、同じプロセス内だけでなく、ソケット経由、HTTP経由など、さまざまなメッセージパッシング環境で利用できます。 データ形式としては、JSON(RFC 4627)を使用します。
-## クライアントの実装 {#client-implementations}
+## クライアント実装 {#client-implementations}
-各イーサリアムクライアントでは、JSON-RPC仕様を実装する際に異なるプログラミング言語を使用できます。 特定のプログラミング言語に関連する詳細については、各[クライアントのドキュメント](/developers/docs/nodes-and-clients/#execution-clients)を参照してください。 最新のAPIサポート情報についても、各クライアントのドキュメントを確認することをお勧めします。
+各イーサリアムクライアントでは、JSON-RPC仕様を実装する際に異なるプログラミング言語を使用できます。 特定のプログラミング言語に関する詳細については、個々の[クライアントのドキュメント](/developers/docs/nodes-and-clients/#execution-clients)を参照してください。 最新のAPIサポート情報についても、各クライアントのドキュメントを確認することをお勧めします。
## 便利なライブラリ {#convenience-libraries}
-JSON-RPC APIを介してイーサリアムクライアントと直接やり取りすることもできますが、dappデベロッパーの作業が多くの場合に簡単になるオプションもあります。 [JavaScript](/developers/docs/apis/javascript/#available-libraries)と[バックエンドAPI](/developers/docs/apis/backend/#available-libraries)には、JSON-RPC APIの上にラッパーを提供する多くのライブラリが存在します。 これらのライブラリを使用することで、デベロッパーは任意のプログラミング言語による直感的な1行のメソッドを作成するだけで、イーサリアムとやり取りするJSON-RPCリクエストを(内部的に)初期化できるようになります。
+JSON-RPC APIを介してイーサリアムクライアントと直接やり取りすることもできますが、dappデベロッパーの作業が多くの場合に簡単になるオプションもあります。 JSON-RPC API上にラッパーを提供する、多くの[JavaScript](/developers/docs/apis/javascript/#available-libraries)ライブラリや[バックエンドAPI](/developers/docs/apis/backend/#available-libraries)ライブラリが存在します。 これらのライブラリを使用することで、デベロッパーは任意のプログラミング言語による直感的な1行のメソッドを作成するだけで、イーサリアムとやり取りするJSON-RPCリクエストを(内部的に)初期化できるようになります。
## コンセンサスクライアントAPI {#consensus-clients}
-このページでは、主にイーサリアムの実行クライアントで使用されるJSON-RPC APIについて説明します。 しかし、コンセンサスクライアントには、ユーザーがノードについての情報のクエリを行えるRPC APIが用意されており、ビーコンブロック、ビーコンの状態、その他のコンセンサス関連の情報を直接ノードにリクエストできます。 このAPIについては 、[ビーコンAPIのウェブページ](https://ethereum.github.io/beacon-APIs/#/)に記載されています。
+このページでは、主にイーサリアムの実行クライアントで使用されるJSON-RPC APIについて説明します。 しかし、コンセンサスクライアントには、ユーザーがノードについての情報のクエリを行えるRPC APIが用意されており、ビーコンブロック、ビーコンの状態、その他のコンセンサス関連の情報を直接ノードにリクエストできます。 このAPIは[Beacon APIウェブページ](https://ethereum.github.io/beacon-APIs/#/)に文書化されています。
-内部APIは、ノード内のクライアント間通信にも使用されます。 つまり、コンセンサスクライアントと実行クライアントとの間のデータ交換を可能にします。 これは「Engine API」と呼ばれており、仕様は[Github](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md)で参照できます。
+内部APIは、ノード内のクライアント間通信にも使用されます。 つまり、コンセンサスクライアントと実行クライアントとの間のデータ交換を可能にします。 これは「エンジンAPI」と呼ばれ、仕様は[GitHub](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md)で入手できます。
-## 実行クライアントの仕様 {#spec}
+## 実行クライアント仕様 {#spec}
-[GitHub上でJSON-RPC APIの全仕様を確認しましょう](https://github.com/ethereum/execution-apis)。 このAPIは[Execution APIウェブページ](https://ethereum.github.io/execution-apis/api-documentation/)でドキュメント化されており、利用可能なすべてのメソッドを試すためのインスペクターも含まれています。
+[GitHubでJSON-RPC APIの全仕様を読む](https://github.com/ethereum/execution-apis)。 このAPIは、[Execution APIウェブページ](https://ethereum.github.io/execution-apis/)に文書化されており、利用可能なすべてのメソッドを試すためのインスペクターが含まれています。
-## 慣例 {#conventions}
+## 規約 {#conventions}
-### 16進数のエンコーディング {#hex-encoding}
+### 16進数値エンコーディング {#hex-encoding}
フォーマットされていないバイト配列とそのバイト数という、2つのキーデータ型がJSONで渡されます。 どちらも16進数エンコーディングで渡されますが、フォーマットの要件は異なります。
-#### バイト数 {#quantities-encoding}
+#### 数量 {#quantities-encoding}
バイト数(整数、数字)をエンコーディングする際は、接頭辞「0x」の16進数でエンコードするのが最も簡潔です。ただし、ゼロは「0x0」と表記する必要があります。
@@ -46,7 +46,7 @@ JSON-RPC APIを介してイーサリアムクライアントと直接やり取
- 誤り: 0x0400(先頭にゼロは入力できません)
- 誤り: ff(接頭辞は0xでなければなりません)
-### フォーマットされていないデータ {#unformatted-data-encoding}
+### 未フォーマットデータ {#unformatted-data-encoding}
フォーマットされていないデータ(バイト配列、アカウントアドレス、ハッシュ、バイトコード配列)をエンコードする場合、16進数としてエンコードし、接頭辞を「0x」とし、1バイトごとに2桁の16進数でエンコードします。
@@ -58,9 +58,9 @@ JSON-RPC APIを介してイーサリアムクライアントと直接やり取
- 誤り: 0xf0f0f(偶数でなければなりません)
- 誤り: 004200(接頭辞が0xでなければなりません)
-### デフォルトのブロックパラメータ {#default-block}
+### ブロックパラメータ {#block-parameter}
-以下のメソッドには、追加のデフォルトブロックパラメータがあります。
+以下のメソッドにはブロックパラメータがあります:
- [eth_getBalance](#eth_getbalance)
- [eth_getCode](#eth_getcode)
@@ -68,26 +68,26 @@ JSON-RPC APIを介してイーサリアムクライアントと直接やり取
- [eth_getStorageAt](#eth_getstorageat)
- [eth_call](#eth_call)
-イーサリアムの状態に作用するリクエストを行う場合は、最後のデフォルトブロックパラメータによってブロックの高さが決定します。
+Ethereumの状態を照会するリクエストが行われる際、指定されたブロックパラメータがブロックの高さを決定します。
-デフォルトブロックパラメータには、以下のオプションがあります。
+ブロックパラメータには、以下のオプションが使用できます:
- `HEX String` - 整数のブロック番号
-- `String "earliest"` - 最も古い/始まりのブロック
-- `String "latest"` - 最も新しい提案されたブロック
-- `String "safe"` - 最も新しい安全な先頭ブロック
-- `String "finalized"` - 最も新しい確定済みブロック
+- `String "earliest"` - 最古/ジェネシスブロック
+- `String "latest"` - 最新の提案されたブロック
+- `String "safe"` - 最新の安全なヘッドブロック
+- `String "finalized"` - 最新のファイナライズされたブロック
- `String "pending"` - 保留中の状態/トランザクション
-## 使用例
+## 実例:
-このページでは、コマンドラインツールである[curl](https://curl.se)を使用した、各JSON-RPC APIエンドポイントの使用方法の例を紹介します。 各エンドポイントの使用例は、[curlの使用例](#curl-examples)セクションで確認できます。 ページの下方には、Gethノード、JSON-RPC API、curlを使用したスマートコントラクトのコンパイルとデプロイの[エンドツーエンドの例](#usage-example)もあります。
+このページでは、コマンドラインツールである[curl](https://curl.se)を使用して、個々のJSON_RPC APIエンドポイントを使用する方法の例を示します。 これらの個々のエンドポイントの例は、以下の[Curlの例](#curl-examples)のセクションにあります。 さらにページの下部では、Gethノード、JSON_RPC API、curlを使用してスマートコントラクトをコンパイルし、デプロイするための[エンドツーエンドの例](#usage-example)も提供しています。
-## Curlの使用例 {#curl-examples}
+## Curlの例 {#curl-examples}
-以下に、[curl](https://curl.se)でイーサリアムノードへのリクエストを行うことによってJSON-RPC APIを使用する例をいくつか示します。 それぞれの例には、エンドポイントの説明、パラメータ、戻り値の型、使用方法の範例が含まれています。
+以下に、[curl](https://curl.se)を使用してEthereumノードにリクエストを行うことでJSON_RPC APIを使用する例を示します。 それぞれの例には、エンドポイントの説明、パラメータ、戻り値の型、使用方法の範例が含まれています。
-curlリクエストは、コンテンツタイプに関するエラーメッセージを返すことがあります。 この理由は、`--data`オプションによって、コンテンツタイプが`application/x-www-form-urlencoded`に設定されるためです。 これによってノードがエラーになる場合は、呼び出しの最初に、手動で`-H "Content-Type: application/json"`と記述してヘッダーを設定してください。 また、使用例には、curlで最後に指定する引数であるURL/IPとポートの組み合わせ(例: `127.0.0.1:8545`)が含まれていません 。 これらの追加データが含まれた完全なcurlリクエストは、次の形式になります。
+curlリクエストは、コンテンツタイプに関するエラーメッセージを返すことがあります。 これは、`--data`オプションがコンテントタイプを`application/x-www-form-urlencoded`に設定するためです。 もしノードがこれについて文句を言う場合は、呼び出しの最初に`-H "Content-Type: application/json"`を配置して、手動でヘッダーを設定してください。 また、この例には、curlに与える最後の引数でなければならないURL/IPとポートの組み合わせ(例: `127.0.0.1:8545`)は含まれていません。 これらの追加データが含まれた完全なcurlリクエストは、次の形式になります。
```shell
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545
@@ -95,7 +95,7 @@ curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","metho
## ゴシップ、状態、履歴 {#gossip-state-history}
-少数のコアJSON-RPCメソッドは、イーサリアムネットワークからのデータを必要とします。該当メソッドは、*ゴシップ、状態、履歴*という、3つの主要カテゴリーに明確に分類できます。 各メソッドは、セクションにあるリンクからジャンプするか、目次でメソッドの全リストを調べることで見つけられます。
+一部のコアJSON-RPCメソッドはEthereumネットワークからのデータを必要とし、_ゴシップ、状態、履歴_の3つの主要なカテゴリにきれいに分類されます。 各メソッドは、セクションにあるリンクからジャンプするか、目次でメソッドの全リストを調べることで見つけられます。
### ゴシップメソッド {#gossip-methods}
@@ -134,7 +134,7 @@ curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","metho
## JSON-RPC APIプレイグラウンド
-APIメソッドの発見と試用に[プレイグラウンドツール](https://ethereum-json-rpc.com)が使えます。 プレイグラウンドツールでは、さまざまなノードプロバイダーによってサポートされているメソッドとネットワークも表示されます。
+[プレイグラウンドツール](https://ethereum-json-rpc.com)を使用して、APIメソッドを発見し、試すことができます。 プレイグラウンドツールでは、さまざまなノードプロバイダーによってサポートされているメソッドとネットワークも表示されます。
## JSON-RPC APIメソッド {#json-rpc-methods}
@@ -148,7 +148,7 @@ APIメソッドの発見と試用に[プレイグラウンドツール](https://
**戻り値**
-`String` - 現在のクライアントのバージョン
+`String` - 現在のクライアントバージョン
**例**
@@ -165,7 +165,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],
### web3_sha3 {#web3_sha3}
-標準のSHA3-256ではなく、指定されたデータのKeccak-256__を返します。
+指定されたデータのKeccak-256 (標準化されたSHA3-256では_ない_)を返します。
**パラメータ**
@@ -177,14 +177,14 @@ params: ["0x68656c6c6f20776f726c64"]
**戻り値**
-`DATA` - 指定された文字列のSHA3結果
+`DATA` - 指定された文字列のSHA3結果。
**例**
```js
-// Request
+// リクエスト
curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}'
-// Result
+// 結果
{
"id":64,
"jsonrpc": "2.0",
@@ -202,20 +202,20 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c
**戻り値**
-`String` - 現在のネットワークID
+`String` - 現在のネットワークID。
現在のネットワークIDの全リストは、[chainlist.org](https://chainlist.org)で入手できます。 よく使われるネットワークIDは、以下の通りです。
-- `1`: イーサリアムメインネット
+- `1`: Ethereumメインネット
- `11155111`: Sepoliaテストネット
-- `17000`: Hoodiテストネット
+- `560048` : Hoodiテストネット
**例**
```js
-// Request
+// リクエスト
curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}'
-// Result
+// 結果
{
"id":67,
"jsonrpc": "2.0",
@@ -225,7 +225,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67
### net_listening {#net_listening}
-クライアントのネットワーク接続のリッスンがアクティブな場合に、`true`を返します。
+クライアントがネットワーク接続をアクティブにリッスンしている場合は`true`を返します。
**パラメータ**
@@ -233,14 +233,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67
**戻り値**
-`Boolean` - リッスンしている場合は`true`、その他の場合は`false`
+`Boolean` - リッスンしている場合は`true`、それ以外は`false`。
**例**
```js
-// Request
+// リクエスト
curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}'
-// Result
+// 結果
{
"id":67,
"jsonrpc":"2.0",
@@ -258,14 +258,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":
**戻り値**
-`QUANTITY` - 接続されているピア数(整数)。
+`QUANTITY` - 接続されているピアの数の整数。
**例**
```js
-// Request
+// リクエスト
curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}'
-// Result
+// 結果
{
"id":74,
"jsonrpc": "2.0",
@@ -275,7 +275,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":
### eth_protocolVersion {#eth_protocolversion}
-現在のイーサリアムプロトコルのバージョンを返します。 このメソッドは、[Gethでは利用できないこと](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924)に注意してください。
+現在のイーサリアムプロトコルのバージョンを返します。 このメソッドは[Gethでは利用できない](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924)ことに注意してください。
**パラメータ**
@@ -283,14 +283,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":
**戻り値**
-`String` - 現在のイーサリアムプロトコルのバージョン
+`String` - 現在のEthereumプロトコルバージョン
**例**
```js
-// Request
+// リクエスト
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}'
-// Result
+// 結果
{
"id":67,
"jsonrpc": "2.0",
@@ -300,7 +300,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[]
### eth_syncing {#eth_syncing}
-同期ステータスに関するデータを含むオブジェクトか、`false`を返します。
+同期ステータスに関するデータを含むオブジェクト、または`false`を返します。
+
+
+ プレイグラウンドでエンドポイントを試す
+
**パラメータ**
@@ -308,13 +312,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[]
**戻り値**
-クライアント実装によって、厳密にはリターンデータが異なります。 ノードが同期していない場合、すべてのクライアントは`False`を返します。また、すべてのクライアントは次のフィールドを返します。
+クライアント実装によって、厳密にはリターンデータが異なります。 すべてのクライアントは、ノードが同期していない場合に`False`を返し、すべてのクライアントが以下のフィールドを返します。
-`Object|Boolean` - 同期ステータスデータを含むオブジェクト、または同期していない場合は`FALSE`
+`Object|Boolean`、同期ステータスデータを含むオブジェクト、または同期していない場合は`FALSE`:
-- `startingBlock`: `QUANTITY` - インポートを開始したブロック(同期がブロックの先頭に達したときのみリセットされる)
-- `currentBlock`: `QUANTITY` - 現在のブロックであり、eth_blockNumberと同一
-- `highestBlock`: `QUANTITY` - 最大ブロック高の推定値
+- `startingBlock`: `QUANTITY` - インポートが開始されたブロック(同期がヘッドに達した後にのみリセットされます)
+- `currentBlock`: `QUANTITY` - 現在のブロック、eth_blockNumberと同じ
+- `highestBlock`: `QUANTITY` - 推定される最も高いブロック
ただし、クライアントによっては、追加のデータを提供する場合もあります。 例えば、Gethでは以下のデータを返します。
@@ -386,6 +390,12 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}
クライアントのコインベースアドレスを返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
+> **注:** このメソッドは**v1.14.0**で廃止され、サポートされなくなりました。 このメソッドを使用しようとすると、「メソッドはサポートされていません」というエラーが発生します。
+
**パラメータ**
なし
@@ -411,13 +421,17 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":6
リプレイ保護されたトランザクションの署名に使われるチェーンIDを返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
なし
**戻り値**
-`chainId`、16進数の文字列で表された現在のチェーンIDの整数値。
+`chainId`、現在のチェーンIDの整数を表す16進値の文字列。
**例**
@@ -434,7 +448,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67
### eth_mining {#eth_mining}
-クライアントの新規ブロックのマイニングがアクティブな場合に、`true`を返します。 プルーフ・オブ・ワークのネットワークに対してのみ `true`を返します。[マージ](/roadmap/merge/)以降、一部のクライアントでは使用できない場合があります。
+クライアントが新しいブロックをアクティブにマイニングしている場合は`true`を返します。 これはプルーフオブワークのネットワークに対してのみtrueを返し、[マージ](/roadmap/merge/)以降、一部のクライアントでは利用できない場合があります。
+
+
+ プレイグラウンドでエンドポイントを試す
+
**パラメータ**
@@ -442,7 +460,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67
**戻り値**
-`Boolean` - クライアントがマイニングしている場合は`true`、その他の場合は`false`
+`Boolean` - クライアントがマイニングしている場合は`true`、それ以外は`false`を返します。
**例**
@@ -459,7 +477,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}
### eth_hashrate {#eth_hashrate}
-ノードがマイニングしている1秒あたりのハッシュの数を返します。 プルーフ・オブ・ワークのネットワークに対してのみ `true`を返します。[マージ](/roadmap/merge/)以降、一部のクライアントでは使用できない場合があります。
+ノードがマイニングしている1秒あたりのハッシュの数を返します。 これはプルーフオブワークのネットワークに対してのみtrueを返し、[マージ](/roadmap/merge/)以降、一部のクライアントでは利用できない場合があります。
+
+
+ プレイグラウンドでエンドポイントを試す
+
**パラメータ**
@@ -467,7 +489,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}
**戻り値**
-`QUANTITY` - 1秒あたりのハッシュの数
+`QUANTITY` - 1秒あたりのハッシュ数。
**例**
@@ -486,13 +508,17 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":7
現在のガス価格の見積りをweiで返します。 例えば、Besuクライアントではデフォルトで、最新の100ブロックを検査し、ガスのユニット価格における中央値を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
なし
**戻り値**
-`QUANTITY` - 現在のガス価格(wei単位の整数)
+`QUANTITY` - wei単位での現在のガス価格の整数。
**例**
@@ -511,13 +537,17 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":7
クライアントが所有するアドレスのリストを返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
なし
**戻り値**
-`DATA配列`、20バイト - クライアントが所有するアドレス
+`Array of DATA`、20バイト - クライアントが所有するアドレス。
**例**
@@ -534,7 +564,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1
### eth_blockNumber {#eth_blocknumber}
-最も新しいブロックの番号を返します。
+最新のブロック番号を返します。
+
+
+ プレイグラウンドでエンドポイントを試す
+
**パラメータ**
@@ -542,7 +576,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1
**戻り値**
-`QUANTITY` - クライアントの現在のブロックの番号(整数)
+`QUANTITY` - クライアントが現在いるブロック番号の整数。
**例**
@@ -561,10 +595,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id
指定されたアドレスのアカウントの残高を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `DATA`、20バイト - 残高を確認するアドレス
-2. `QUANTITY|TAG` - ブロックの番号(整数)、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください
+1. `DATA`、20バイト - 残高を確認するアドレス。
+2. `QUANTITY|TAG` - 整数のブロック番号、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、または`"finalized"`。詳細は[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照
```js
params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]
@@ -572,7 +610,7 @@ params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"]
**戻り値**
-`QUANTITY` - 現在の残高(wei単位の整数)
+`QUANTITY` - wei単位の現在の残高の整数。
**例**
@@ -591,30 +629,35 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407
指定されたアドレスのストレージの位置の値を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `DATA`、20バイト - ストレージのアドレス
-2. `QUANTITY` - ストレージの位置(整数)
-3. `QUANTITY|TAG` - ブロックの番号(整数)、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください
+1. `DATA`、20バイト - ストレージのアドレス。
+2. `QUANTITY` - ストレージ内の位置の整数。
+3. `QUANTITY|TAG` - 整数のブロック番号、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`。詳細は[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照
**戻り値**
-`DATA` - このストレージの位置の値
+`DATA` - このストレージ位置の値。
-**例: ** 正確な位置計算は、取得するストレージによって変わります。 ここでは、アドレス`0x391694e7e0b0cce554cb130d723a9d27458f9298`で、`0x295a70b2de5e3953354a6a8344e616ed314d7251`にデプロイされているコントラクトについて考えます。
+**例**
+正しい位置の計算は、取得するストレージによって異なります。 アドレス`0x391694e7e0b0cce554cb130d723a9d27458f9298`によって、`0x295a70b2de5e3953354a6a8344e616ed314d7251`にデプロイされた以下のコントラクトについて考えてみましょう。
```
contract Storage {
uint pos0;
mapping(address => uint) pos1;
- function Storage() {
+ constructor() {
pos0 = 1234;
pos1[msg.sender] = 5678;
}
}
```
-pos0の値の取得は簡単です。
+pos0の値の取得は簡単です:
```js
curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545
@@ -656,12 +699,16 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [
### eth_getTransactionCount {#eth_gettransactioncount}
-アドレスから_送信_されたトランザクションの数を返します。
+アドレスから_送信された_トランザクションの数を返します。
+
+
+ プレイグラウンドでエンドポイントを試す
+
**パラメータ**
-1. `DATA`、20バイト - アドレス
-2. `QUANTITY|TAG` - ブロックの番号(整数)、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください
+1. `DATA`、20バイト - アドレス。
+2. `QUANTITY|TAG` - 整数のブロック番号、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`または`"finalized"`。詳細は[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照
```js
params: [
@@ -672,7 +719,7 @@ params: [
**戻り値**
-`QUANTITY` - このアドレスから送信されたトランザクションの数(整数)
+`QUANTITY` - このアドレスから送信されたトランザクションの数の整数。
**例**
@@ -691,9 +738,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params
指定されたブロックハッシュに一致するブロック内のトランザクションの数を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `DATA`、32バイト - ブロックハッシュ
+1. `DATA`、32バイト - ブロックのハッシュ
```js
params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"]
@@ -701,7 +752,7 @@ params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"]
**戻り値**
-`QUANTITY` - このブロック内のトランザクションの数(整数)
+`QUANTITY` - このブロック内のトランザクションの数の整数。
**例**
@@ -720,9 +771,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHa
指定されたブロック番号に一致するブロックのトランザクションの数を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `QUANTITY|TAG` - ブロックの番号(整数)、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください
+1. `QUANTITY|TAG` - ブロック番号の整数、または文字列`"earliest"`、`"latest"`、`"pending"`、`"safe"`または`"finalized"`。[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照。
```js
params: [
@@ -732,7 +787,7 @@ params: [
**戻り値**
-`QUANTITY` - このブロック内のトランザクションの数(整数)
+`QUANTITY` - このブロック内のトランザクションの数の整数。
**例**
@@ -751,9 +806,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNu
指定されたブロックハッシュに一致するブロックのアンクルの数を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `DATA`、32バイト - ブロックハッシュ
+1. `DATA`、32バイト - ブロックのハッシュ
```js
params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"]
@@ -761,7 +820,7 @@ params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"]
**戻り値**
-`QUANTITY` - このブロック内のアンクルの数(整数)
+`QUANTITY` - このブロック内のアンクルの数の整数。
**例**
@@ -780,9 +839,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","p
指定されたブロック番号に一致するブロック内のアンクルの数を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `QUANTITY|TAG` - ブロックの番号(整数)、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください
+1. `QUANTITY|TAG` - 整数のブロック番号、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`。詳細は[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照
```js
params: [
@@ -792,7 +855,7 @@ params: [
**戻り値**
-`QUANTITY` - このブロック内のアンクルの数(整数)
+`QUANTITY` - このブロック内のアンクルの数の整数。
**例**
@@ -811,10 +874,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber",
指定されたアドレスのコードを返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
1. `DATA`、20バイト - アドレス
-2. `QUANTITY|TAG` - ブロックの番号(整数)、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください
+2. `QUANTITY|TAG` - 整数のブロック番号、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`または`"finalized"`。詳細は[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照
```js
params: [
@@ -825,7 +892,7 @@ params: [
**戻り値**
-`DATA` - 指定されたアドレスからのコード
+`DATA` - 指定されたアドレスからのコード。
**例**
@@ -842,9 +909,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA
### eth_sign {#eth_sign}
-この署名メソッドは、イーサリアム固有の署名を次のように計算します。`sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`。
+署名メソッドは、`sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`で、Ethereum固有の署名を計算します。
-メッセージに接頭辞を追加することで、計算された署名がイーサリアム固有の署名として認識されるようになります。 これにより、悪意のあるdappによって任意のデータ(トランザクションなど)が署名され、被害者のなりすましに悪用される被害を防ぐことができます。
+メッセージに接頭辞を追加することで、計算された署名がイーサリアム固有の署名として認識されるようになります。 これにより、悪意のあるdappが任意のデータ(トランザクションなど)に署名し、その署名を利用して被害者になりすますといった不正使用を防ぎます。
注: 署名するアドレスのロックを解除する必要があります。
@@ -872,24 +939,24 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d37
### eth_signTransaction {#eth_signtransaction}
-[eth_sendRawTransaction](#eth_sendrawtransaction)を使用して、ネットワークに後から送信可能なトランザクションに署名します。
+[eth_sendRawTransaction](#eth_sendrawtransaction)を使用して、後でネットワークに送信できるトランザクションに署名します。
**パラメータ**
1. `Object` - トランザクションオブジェクト
- `type`:
-- `from`: `DATA`、20バイト - トランザクションの送信元アドレス
-- `to`: `DATA`、20バイト - (新規コントラクトの作成時はオプション)トランザクションの宛先アドレス
-- `gas`: `QUANTITY` - (オプション、デフォルトは90000)トランザクションを実行するために提供されているガス(整数)で、 使用されなかったガスは返却される
-- `gasPrice`: `QUANTITY` - (オプション、デフォルトは未確定)ガスごとに支払われるガス価格(wei単位の整数)
-- `value`: `QUANTITY` - (オプション)このトランザクションで送信された値(wei単位の整数)
-- `data`: `DATA` - コンパイルされたコントラクトのコード。または呼び出されたメソッドの署名とエンコードされたパラメータのハッシュ
-- `nonce`: `QUANTITY` - (オプション)ノンス(nonce)の整数で、 同じノンス(nonce)を使用している保留中のトランザクションを上書きできる
+- `from`: `DATA`、20バイト - トランザクションの送信元アドレス。
+- `to`: `DATA`、20バイト - (新規コントラクトの作成時はオプション)トランザクションの宛先アドレス。
+- `gas`: `QUANTITY` - (オプション、デフォルト: 90000)トランザクションの実行に提供されるガスの整数。 使用されなかったガスは返却される
+- `gasPrice`: `QUANTITY` - (オプション、デフォルト: 未確定)支払われるガスごとに使用されるgasPriceの整数(Wei単位)。
+- `value`: `QUANTITY` - (オプション)このトランザクションで送信される値の整数(Wei単位)。
+- `data`: `DATA` - コントラクトのコンパイル済みコード、または呼び出されたメソッド署名のハッシュとエンコードされたパラメータ。
+- `nonce`: `QUANTITY` - (オプション)ノンスの整数。 同じノンス(nonce)を使用している保留中のトランザクションを上書きできる
**戻り値**
-`DATA`、特定のアカウントによって署名され、RLPエンコードされたトランザクションオブジェクト。
+`DATA`、指定されたアカウントによって署名された、RLPエンコードされたトランザクションオブジェクト。
**例**
@@ -906,19 +973,19 @@ curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction","
### eth_sendTransaction {#eth_sendtransaction}
-データフィールドにコードが含まれている場合は、新しいメッセージコールトランザクションまたはコントラクト作成を行います。また、`from`で指定されたアカウントを使ってデータフィールドに署名します。
+データフィールドにコードが含まれている場合は、新しいメッセージコールトランザクションまたはコントラクト作成を行い、`from`で指定されたアカウントを使ってそれに署名します。
**パラメータ**
1. `Object` - トランザクションオブジェクト
-- `from`: `DATA`、20バイト - トランザクションの送信元アドレス
-- `to`: `DATA`、20バイト - (新規コントラクトの作成時はオプション)トランザクションの宛先アドレス
-- `gas`: `QUANTITY` - (オプション、デフォルトは90000)トランザクションを実行するために提供されているガス(整数)で、 使用されなかったガスは返却される
-- `gasPrice`: `QUANTITY` - (オプション、デフォルトは未確定)ガスの支払いに適用されたガス価格(整数)
-- `value`: `QUANTITY` - (オプション)このトランザクションで送信された値(整数)
-- `input`: `DATA` - コンパイルされたコントラクトのコード。または呼び出されたメソッドの署名とエンコードされたパラメータのハッシュ
-- `nonce`: `QUANTITY` - (オプション)ノンス(nonce)の整数で、 同じノンス(nonce)を使用している保留中のトランザクションを上書きできる
+- `from`: `DATA`、20バイト - トランザクションの送信元アドレス。
+- `to`: `DATA`、20バイト - (新規コントラクトの作成時はオプション)トランザクションの宛先アドレス。
+- `gas`: `QUANTITY` - (オプション、デフォルト: 90000)トランザクションの実行に提供されるガスの整数。 使用されなかったガスは返却される
+- `gasPrice`: `QUANTITY` - (オプション、デフォルト: 未確定)ガスの支払いに適用されるgasPriceの整数。
+- `value`: `QUANTITY` - (オプション)このトランザクションで送信された値の整数。
+- `input`: `DATA` - コントラクトのコンパイル済みコード、または呼び出されたメソッド署名のハッシュとエンコードされたパラメータ。
+- `nonce`: `QUANTITY` - (オプション)ノンスの整数。 同じノンス(nonce)を使用している保留中のトランザクションを上書きできる
```js
params: [
@@ -936,9 +1003,9 @@ params: [
**戻り値**
-`DATA`、32バイト - トランザクションのハッシュ、またはトランザクションがまだ使用可能でない場合はゼロハッシュ
+`DATA`、32バイト - トランザクションハッシュ、またはトランザクションがまだ利用できない場合はゼロハッシュ。
-コントラクトを作成した際、トランザクションがブロックに提案された後、[eth_getTransactionReceipt](#eth_gettransactionreceipt)を使用してコントラクトアドレスを取得します。
+コントラクトを作成した場合、トランザクションがブロックに提案された後、[eth_getTransactionReceipt](#eth_gettransactionreceipt)を使用してコントラクトアドレスを取得します。
**例**
@@ -959,7 +1026,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{
**パラメータ**
-1. `DATA` - 署名されたトランザクションのデータ
+1. `DATA`、署名されたトランザクションデータ。
```js
params: [
@@ -969,9 +1036,9 @@ params: [
**戻り値**
-`DATA`、32バイト - トランザクションのハッシュ、またはトランザクションがまだ使用可能でない場合はゼロハッシュ
+`DATA`、32バイト - トランザクションハッシュ、またはトランザクションがまだ利用できない場合はゼロハッシュ。
-コントラクトを作成した際、トランザクションがブロックに提案された後、[eth_getTransactionReceipt](#eth_gettransactionreceipt)を使用してコントラクトアドレスを取得します。
+コントラクトを作成した場合、トランザクションがブロックに提案された後、[eth_getTransactionReceipt](#eth_gettransactionreceipt)を使用してコントラクトアドレスを取得します。
**例**
@@ -988,24 +1055,28 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params"
### eth_call {#eth_call}
-ブロックチェーン上にトランザクションを作成せずに、即座に新規メッセージ呼び出しを実行できます。 読み取り専用のスマートコントラクト関数を実行するために頻繁に使われます(例えば、ERC-20 コントラクトの`balanceOf`など)。
+ブロックチェーン上にトランザクションを作成せずに、新しいメッセージコールを即座に実行します。 ERC-20コントラクトの`balanceOf`など、読み取り専用のスマートコントラクト関数を実行するためによく使用されます。
+
+
+ プレイグラウンドでエンドポイントを試す
+
**パラメータ**
-1. `Object` - トランザクションの呼び出しオブジェクト
+1. `Object` - トランザクションコールオブジェクト
-- `from`: `DATA`、20バイト - (オプション)トランザクションの送信元アドレス
-- `to`: `DATA`、20バイト - トランザクションの宛先アドレス
-- `gas`: `QUANTITY` - (オプション)トランザクションを実行するために提供されているガス(整数) 。 eth_callはガスを消費しませんが、一部の実行ではこのパラメータが必要になる場合があります。
-- `gasPrice`: `QUANTITY` - (オプション)ガスの支払いに適用されるガス価格(整数)
-- `value`: `QUANTITY` - (オプション)このトランザクションで送信された値(整数)
-- `input`: `DATA` - (オプション)メソッド署名とエンコードされたパラメータのハッシュ。 詳細については、[SolidityのドキュメントのイーサリアムコントラクトABI](https://docs.soliditylang.org/en/latest/abi-spec.html)を参照してください。
+- `from`: `DATA`、20バイト - (オプション)トランザクションの送信元アドレス。
+- `to`: `DATA`、20バイト - トランザクションの宛先アドレス。
+- `gas`: `QUANTITY` - (オプション)トランザクションの実行に提供されるガスの整数。 eth_callはガスを消費しませんが、一部の実行ではこのパラメータが必要になる場合があります。
+- `gasPrice`: `QUANTITY` - (オプション)支払われるガスごとに使用されるgasPriceの整数
+- `value`: `QUANTITY` - (オプション)このトランザクションで送信される値の整数
+- `input`: `DATA` - (オプション)メソッド署名とエンコードされたパラメータのハッシュ。 詳細については、[SolidityドキュメントのEthereum Contract ABI](https://docs.soliditylang.org/en/latest/abi-spec.html)を参照してください。
-2. `QUANTITY|TAG` - ブロックの番号(整数)、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください
+2. `QUANTITY|TAG` - 整数のブロック番号、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`または`"finalized"`。詳細は[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照
**戻り値**
-`DATA` - 実行されたコントラクトの戻り値
+`DATA` - 実行されたコントラクトの戻り値。
**例**
@@ -1024,13 +1095,17 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}]
トランザクションの完了に必要なガスの推定値を計算して返します。 このトランザクションはブロックチェーンに追加されません。 推定値は、EVMの仕組みやノードのパフォーマンスなどのさまざまな理由により、トランザクションによって実際に使われるガス量を大幅に上回る可能性があることに注意してください。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-[eth_call](#eth_call)パラメータを参照してください。ただし、すべてのプロパティはオプションです。 ガスリミットが指定されていない場合、Gethでは保留中のブロックのガスリミットが上限値として使用されます。 その結果、保留中のブロックのガスリミットよりガス量が多い場合には、返される推定値の量では、呼び出し/トランザクションを実行するには十分でないことがあります。
+[eth_call](#eth_call)パラメータを参照してください。ただし、すべてのプロパティはオプションです。 ガスリミットが指定されていない場合、Gethでは保留中のブロックのガスリミットが上限値として使用されます。 その結果、ガス量が保留中のブロックのガスリミットより高い場合、返された推定値ではコール/トランザクションの実行に十分でない可能性があります。
**戻り値**
-`QUANTITY` - ガス使用量
+`QUANTITY` - 使用されたガス量。
**例**
@@ -1049,10 +1124,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see
ハッシュを使用して、ブロックに関する情報を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `DATA`、32バイト - ブロックのハッシュ
-2. `Boolean` - `true`の場合は、完全なトランザクションオブジェクトを返します。 `false`の場合は、トランザクションのハッシュのみを返します
+1. `DATA`、32バイト - ブロックのハッシュ。
+2. `Boolean` - `true`の場合は完全なトランザクションオブジェクトを返し、`false`の場合はトランザクションのハッシュのみを返します。
```js
params: [
@@ -1063,39 +1142,38 @@ params: [
**戻り値**
-`Object` - ブロックオブジェクト、またはブロックが見つからなかった場合は`null`
-
-- `number`: `QUANTITY` - ブロック番号。 保留中のブロックの場合は`null`
-- `hash`: `DATA`、32バイト - ブロックのハッシュ。 保留中のブロックの場合は`null`
-- `parentHash`: `DATA`、32バイト - 親ブロックのハッシュ
-- `nonce`: `DATA`、8バイト - 生成されたプルーフ・オブ・ワークのハッシュ。 保留中のブロックの場合は`null`
-- `sha3Uncles`: `DATA`、32バイト - ブロックのアンクルデータのSHA3
-- `logsBloom`: `DATA`、256バイト - ブロックのログのブルームフィルタ。 保留中のブロックの場合は`null`
-- `transactionsRoot`: `DATA`、32バイト - ブロックのトランザクションツリーのルート
-- `stateRoot`: `DATA`、32バイト - ブロックの最終状態ツリーのルート
-- `receiptsRoot`: `DATA`、32バイト - ブロックのレシートツリーのルート
-- `miner`: `DATA`、20バイト - マイニング報酬が支払われる受益者のアドレス
-- `difficulty`: `QUANTITY` - このブロックの難易度(整数)
-- `totalDifficulty`: `QUANTITY` - このブロックまでのチェーンの合計難易度(整数)
-- `extraData`: `DATA` - このブロックの「追加データ」フィールド
-- `size`: `QUANTITY` - このブロックのサイズのバイト数(整数)
-- `gasLimit`: `QUANTITY` - このブロックで許可されているガスの最大量
-- `gasUsed`: `QUANTITY` - このブロックのすべてのトランザクションで使用されたガスの合計量
-- `timestamp`: `QUANTITY` - ブロックが照合されたときのUNIXタイムスタンプ
-- `transactions`: `Array` - 最後に指定したパラメータに応じて、トランザクションオブジェクトの配列、または32バイトのトランザクションハッシュ
-- `uncles`: `Array` - アンクルハッシュの配列
+`Object` - ブロックオブジェクト、またはブロックが見つからなかった場合は`null`:
+
+- `number`: `QUANTITY` - ブロック番号。 保留中のブロックの場合はnull。
+- `hash`: `DATA`、32バイト - ブロックのハッシュ。 保留中のブロックの場合はnull。
+- `parentHash`: `DATA`、32バイト - 親ブロックのハッシュ。
+- `nonce`: `DATA`、8バイト - 生成されたプルーフオブワークのハッシュ。 保留中のブロックの場合は`null`、プルーフオブステークのブロックの場合は`0x0` (マージ以降)
+- `sha3Uncles`: `DATA`、32バイト - ブロック内のアンクルデータのSHA3。
+- `logsBloom`: `DATA`、256バイト - ブロックのログのブルームフィルタ。 保留中のブロックの場合はnull。
+- `transactionsRoot`: `DATA`、32バイト - ブロックのトランザクションツリーのルート。
+- `stateRoot`: `DATA`、32バイト - ブロックの最終状態ツリーのルート。
+- `receiptsRoot`: `DATA`、32バイト - ブロックのレシートツリーのルート。
+- `miner`: `DATA`、20バイト - ブロック報酬が与えられた受益者のアドレス。
+- `difficulty`: `QUANTITY` - このブロックの難易度の整数。
+- `totalDifficulty`: `QUANTITY` - このブロックまでのチェーンの合計難易度の整数。
+- `extraData`: `DATA` - このブロックの「追加データ」フィールド。
+- `size`: `QUANTITY` - このブロックのサイズ(バイト単位)の整数。
+- `gasLimit`: `QUANTITY` - このブロックで許可されているガスの最大量。
+- `gasUsed`: `QUANTITY` - このブロック内のすべてのトランザクションによって使用されたガスの合計量。
+- `timestamp`: `QUANTITY` - ブロックが照合されたときのUNIXタイムスタンプ。
+- `transactions`: `Array` - 最後に与えられたパラメータに応じて、トランザクションオブジェクトの配列、または32バイトのトランザクションハッシュ。
+- `uncles`: `Array` - アンクルハッシュの配列。
**例**
```js
-// Request
+// リクエスト
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}'
-// Result
-{
+// 結果
{
-"jsonrpc": "2.0",
-"id": 1,
-"result": {
+ "jsonrpc": "2.0",
+ "id": 1,
+ "result": {
"difficulty": "0x4ea3f27bc",
"extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32",
"gasLimit": "0x1388",
@@ -1118,7 +1196,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncles": [
]
-}
+ }
}
```
@@ -1126,10 +1204,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0
ブロック番号を使用して、ブロックに関する情報を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `QUANTITY|TAG` - ブロックの番号(整数)、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください
-2. `Boolean` - `true`の場合は、完全なトランザクションオブジェクトを返します。 `false`の場合は、トランザクションのハッシュのみを返します
+1. `QUANTITY|TAG` - ブロック番号の整数、または文字列`"earliest"`、`"latest"`、`"pending"`、`"safe"`または`"finalized"`。[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照。
+2. `Boolean` - `true`の場合は完全なトランザクションオブジェクトを返し、`false`の場合はトランザクションのハッシュのみを返します。
```js
params: [
@@ -1138,7 +1220,8 @@ params: [
]
```
-**戻り値**については、[eth_getBlockByHash](#eth_getblockbyhash)を参照してください。
+**戻り値**
+[eth_getBlockByHash](#eth_getblockbyhash)を参照
**例**
@@ -1147,12 +1230,16 @@ params: [
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}'
```
-結果については、[eth_getBlockByHash](#eth_getblockbyhash)を参照してください。
+結果は[eth_getBlockByHash](#eth_getblockbyhash)を参照
### eth_getTransactionByHash {#eth_gettransactionbyhash}
トランザクションハッシュを使用して、リクエストされたトランザクションに関する情報を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
1. `DATA`、32バイト - トランザクションのハッシュ
@@ -1163,20 +1250,20 @@ params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"]
**戻り値**
-`Object` - トランザクションオブジェクト、またはトランザクションが見つからなかった場合は`null`
-
-- `blockHash`: `DATA`、32バイト - このトランザクションが組み込まれていたブロックのハッシュ。 保留中の場合は`null`
-- `blockNumber`: `QUANTITY` - このトランザクションが組み込まれていたブロックの番号 保留中の場合は`null`
-- `from`: `DATA`、20バイト - 送信者のアドレス
-- `gas`: `QUANTITY` - 送信者が提供するガス
-- `gasPrice`: `QUANTITY` - 送信者が指定したガス価格(wei単位)
-- `hash`: `DATA`、32バイト - トランザクションのハッシュ
-- `input`: `DATA` - トランザクションと共に送信されるデータ
-- `nonce`: `QUANTITY` - 送信者がこのトランザクションより前に送信したトランザクションの数
-- `to`: `DATA`、20バイト - 受信者のアドレス。 コントラクト作成時のトランザクションは`null`
-- `transactionIndex`: `QUANTITY` - ブロック内のトランザクションのインデックスの位置(整数)。 保留中の場合は`null`
-- `value`: `QUANTITY` - 送金された価値(wei単位)
-- `v`: `QUANTITY` - ECDSAのリカバリID
+`Object` - トランザクションオブジェクト、またはトランザクションが見つからなかった場合は`null`:
+
+- `blockHash`: `DATA`、32バイト - このトランザクションが含まれていたブロックのハッシュ。 保留中の場合はnull。
+- `blockNumber`: `QUANTITY` - このトランザクションが含まれていたブロック番号。 保留中の場合はnull。
+- `from`: `DATA`、20バイト - 送信者のアドレス。
+- `gas`: `QUANTITY` - 送信者によって提供されたガス。
+- `gasPrice`: `QUANTITY` - 送信者によって提供されたガス価格(Wei単位)。
+- `hash`: `DATA`、32バイト - トランザクションのハッシュ。
+- `input`: `DATA` - トランザクションと共に送信されるデータ。
+- `nonce`: `QUANTITY` - これより前に送信者によって行われたトランザクションの数。
+- `to`: `DATA`、20バイト - 受信者のアドレス。 コントラクト作成トランザクションの場合は`null`。
+- `transactionIndex`: `QUANTITY` - ブロック内でのトランザクションのインデックス位置の整数。 保留中の場合はnull。
+- `value`: `QUANTITY` - Wei単位で転送された値。
+- `v`: `QUANTITY` - ECDSAリカバリID
- `r`: `QUANTITY` - ECDSA署名r
- `s`: `QUANTITY` - ECDSA署名s
@@ -1212,10 +1299,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","param
ブロックのハッシュとトランザクションのインデックスの位置を使用して、トランザクションに関する情報を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `DATA`、32バイト - ブロックのハッシュ
-2. `QUANTITY` - トランザクションのインデックスの位置(整数)
+1. `DATA`、32バイト - ブロックのハッシュ。
+2. `QUANTITY` - トランザクションのインデックス位置の整数。
```js
params: [
@@ -1224,7 +1315,8 @@ params: [
]
```
-**戻り値**については、[eth_getTransactionByHash](#eth_gettransactionbyhash)を参照してください。
+**戻り値**
+[eth_getTransactionByHash](#eth_gettransactionbyhash)を参照
**例**
@@ -1233,16 +1325,20 @@ params: [
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'
```
-結果については、[eth_getTransactionByHash](#eth_gettransactionbyhash)を参照してください。
+結果は[eth_getTransactionByHash](#eth_gettransactionbyhash)を参照
### eth_getTransactionByBlockNumberAndIndex {#eth_gettransactionbyblocknumberandindex}
ブロック番号とトランザクションのインデックスの位置を使用して、トランザクションに関する情報を返します。
+
+ プレイグラウンドでエンドポイントを試す
+
+
**パラメータ**
-1. `QUANTITY|TAG` - ブロックの番号、または文字列`"latest"`、`"earliest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください
-2. `QUANTITY` - トランザクションのインデックスの位置
+1. `QUANTITY|TAG` - ブロック番号、または文字列`"earliest"`、`"latest"`、`"pending"`、`"safe"`または`"finalized"`。[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照。
+2. `QUANTITY` - トランザクションのインデックス位置。
```js
params: [
@@ -1251,22 +1347,23 @@ params: [
]
```
-**戻り値**については、[eth_getTransactionByHash](#eth_gettransactionbyhash)を参照してください。
+**戻り値**
+[eth_getTransactionByHash](#eth_gettransactionbyhash)を参照
**例**
```js
-// Request
+// リクエスト
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}'
```
-結果については、[eth_getTransactionByHash](#eth_gettransactionbyhash)を参照してください。
+結果は[eth_getTransactionByHash](#eth_gettransactionbyhash)を参照
### eth_getTransactionReceipt {#eth_gettransactionreceipt}
トランザクションのハッシュを使用して、トランザクションのレシートを返します。
-**注** : 保留中のトランザクションでは、レシートは取得できません。
+**注** 保留中のトランザクションではレシートは利用できません。
**パラメータ**
@@ -1276,26 +1373,27 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberA
params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"]
```
-**戻り値** `Object` - トランザクションレシートのオブジェクト、またはレシートが見つからなかった場合は`null`
+**戻り値**
+`Object` - トランザクションレシートオブジェクト、またはレシートが見つからない場合は`null`:
-- `transactionHash`: `DATA`、32バイト - トランザクションのハッシュ
-- `transactionIndex`: `QUANTITY` - ブロック内のトランザクションのインデックスの位置(整数)。
-- `blockHash`: `DATA`、32バイト - このトランザクションが組み込まれていたブロックのハッシュ。
-- `blockNumber`: `QUANTITY` - このトランザクションが組み込まれていたブロックの番号
-- `from`: `DATA`、20バイト - 送信者のアドレス
+- `transactionHash `: `DATA`、32バイト - トランザクションのハッシュ。
+- `transactionIndex`: `QUANTITY` - ブロック内でのトランザクションのインデックス位置の整数。
+- `blockHash`: `DATA`、32バイト - このトランザクションが含まれていたブロックのハッシュ。
+- `blockNumber`: `QUANTITY` - このトランザクションが含まれていたブロック番号。
+- `from`: `DATA`、20バイト - 送信者のアドレス。
- `to`: `DATA`、20バイト - 受信者のアドレス。 コントラクト作成時のトランザクションはnull
-- `cumulativeGasUsed`: `QUANTITY` - ブロック内でこのトランザクションの実行時に使用されたガスの総量
-- `effectiveGasPrice` : `QUANTITY` - ガスユニットごとに支払われるベースフィーとチップの合計
-- `gasUsed`: `QUANTITY` - この特定のトランザクションのみで使用されたガスの量
-- `contractAddress`: `DATA`、20バイト - コントラクト作成のトランザクションの場合は、作成されたコントラクトのアドレス、その他の場合は`null`
-- `logs`: `Array` - このトランザクションが生成したログオブジェクトの配列
-- `logsBloom`: `DATA`、256バイト - 関連ログを迅速に取得するためのライトクライアント用のブルームフィルター。
-- `type`: `QUANTITY` - トランザクションタイプの整数、`0x0`でレガシートランザクション、 `0x1`でアクセスリストタイプ、`0x2`で動的フィー。
+- `cumulativeGasUsed` : `QUANTITY ` - このトランザクションがブロック内で実行された際に使用されたガスの総量。
+- `effectiveGasPrice` : `QUANTITY` - ガスユニットごとに支払われるベースフィーとチップの合計。
+- `gasUsed `: `QUANTITY ` - この特定のトランザクションだけで使用されたガスの量。
+- `contractAddress `: `DATA`、20バイト - トランザクションがコントラクト作成だった場合に作成されたコントラクトアドレス、それ以外は`null`。
+- `logs`: `Array` - このトランザクションが生成したログオブジェクトの配列。
+- `logsBloom`: `DATA`、256バイト - ライトクライアントが関連ログを迅速に取得するためのブルームフィルター。
+- `type`: `QUANTITY` - トランザクションタイプの整数、`0x0`はレガシートランザクション、`0x1`はアクセスリストタイプ、`0x2`は動的フィー。
-また、以下のうち_いずれか_を返します。
+また、以下のいずれかを返します。
-- `root` : `DATA`、32バイト - トランザクション後の状態ルート(ビザンチウム以前)
-- `status`: `QUANTITY` - `1`(成功)、または`0`(失敗)
+- `root` : `DATA` トランザクション後の状態ルートの32バイト(ビザンチウム以前)
+- `status`: `QUANTITY` `1` (成功) または `0` (失敗) のいずれか
**例**
@@ -1331,12 +1429,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","para
### eth_getUncleByBlockHashAndIndex {#eth_getunclebyblockhashandindex}
-ハッシュとアンクルインデックスの位置を使用して、ブロックのアンクルに関する情報を返します。
+ハッシュとアンクルインデックス位置によって、ブロックのアンクルに関する情報を返します。
+
+
+ プレイグラウンドでエンドポイントを試す
+
**パラメータ**
-1. `DATA`、32バイト - ブロックのハッシュ
-2. `QUANTITY` - アンクルのインデックスの位置
+1. `DATA`、32バイト - ブロックのハッシュ。
+2. `QUANTITY` - アンクルのインデックス位置。
```js
params: [
@@ -1345,7 +1447,8 @@ params: [
]
```
-**戻り値**については、[eth_getBlockByHash](#eth_getblockbyhash)を参照してください。
+**戻り値**
+[eth_getBlockByHash](#eth_getblockbyhash)を参照
**例**
@@ -1354,18 +1457,22 @@ params: [
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}'
```
-結果については、[eth_getBlockByHash](#eth_getblockbyhash)を参照してください。
+結果は[eth_getBlockByHash](#eth_getblockbyhash)を参照
-**注**: アンクルには、個々のトランザクションは含まれていません。
+**注**: アンクルには個別のトランザクションは含まれません。
### eth_getUncleByBlockNumberAndIndex {#eth_getunclebyblocknumberandindex}
-ブロック番号とアンクルのインデックスの位置を使用して、ブロックのアンクルに関する情報を返します。
+ブロック番号とアンクルインデックス位置によって、ブロックのアンクルに関する情報を返します。
+
+
+ プレイグラウンドでエンドポイントを試す
+
**パラメータ**
-1. `QUANTITY|TAG` - ブロックの番号、または文字列`"earliest"`、`"latest"`、`"pending"`、`"safe"`、`"finalized"`のいずれか。[デフォルトのブロックパラメータ](/developers/docs/apis/json-rpc/#default-block)を参照してください。
-2. `QUANTITY` - アンクルのインデックスの位置
+1. `QUANTITY|TAG` - ブロック番号、または文字列`"earliest"`、`"latest"`、`"pending"`、`"safe"`、`"finalized"`。[ブロックパラメータ](/developers/docs/apis/json-rpc/#block-parameter)を参照。
+2. `QUANTITY` - アンクルのインデックス位置。
```js
params: [
@@ -1374,9 +1481,10 @@ params: [
]
```
-**戻り値**については、[eth_getBlockByHash](#eth_getblockbyhash)を参照してください。
+**戻り値**
+[eth_getBlockByHash](#eth_getblockbyhash)を参照
-**注**: アンクルには、個々のトランザクションは含まれていません。
+**注**: アンクルには個別のトランザクションは含まれません。
**例**
@@ -1385,27 +1493,29 @@ params: [
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}'
```
-結果については、[eth_getBlockByHash](#eth_getblockbyhash)を参照してください。
+結果は[eth_getBlockByHash](#eth_getblockbyhash)を参照
### eth_newFilter {#eth_newfilter}
-(ログの)状態変更を通知するために、フィルターオプションに基づいてフィルターオブジェクトを作成します。 状態変更を確認するには、[eth_getFilterChanges](#eth_getfilterchanges)を呼び出します。
+(ログの)状態変更を通知するために、フィルターオプションに基づいてフィルターオブジェクトを作成します。
+状態が変更されたかを確認するには、[eth_getFilterChanges](#eth_getfilterchanges)を呼び出します。
-**トピックフィルターを指定する際の注:** トピックは順序に依存します。 トピック [A, B] を持つログのトランザクションは、下記のトピックフィルターによってマッチングされます。
+**トピックフィルター指定に関する注意:**
+トピックは順序に依存します。 トピック [A, B] を持つログのトランザクションは、下記のトピックフィルターによってマッチングされます。
-- `[]` 「条件なし」
-- `[A]` 「最初の位置がA(その後の位置については条件なし) 」
-- `[null, B]`「最初の位置は条件なし、かつ2番目の位置がB(その後の位置については条件なし) 」
-- `[A, B]`「最初の位置がA、かつ2番目の位置がB(その後の位置については条件なし) 」
-- `[[A, B], [A, B]]`「最初の位置が(AまたはB)、かつ2番目の位置が(AまたはB)(その後の位置については条件なし) 」
+- `[]`「すべて」
+- `[A]`「最初の位置がA(それ以降はすべて)」
+- `[null, B]`「最初の位置はすべて、かつ2番目の位置がB(それ以降はすべて)」
+- `[A, B]`「最初の位置がA、かつ2番目の位置がB(それ以降はすべて)」
+- `[[A, B], [A, B]]`「最初の位置が(AまたはB)、かつ2番目の位置が(AまたはB)(それ以降はすべて)」
- **パラメータ**
-1. `Object` - フィルターオプション
+1. `Object` - フィルターオプション:
-- `fromBlock`: `QUANTITY|TAG` - (オプション、デフォルトは`"latest"`) 整数のブロック番号、または最後に提案されたブロックを表す`"latest"`、最新の安全なブロックを表す`"safe"`、最新のファイナライズされたブロックを表す`"finalized"`、またはブロックにまだ含まれていないトランザクションを表す`"pending"`、`"earliest"`を指定できます。
-- `toBlock`: `QUANTITY|TAG` - (オプション、デフォルトは`"latest"`) 整数のブロック番号、または最後に提案されたブロックを表す`"latest"`、最新の安全なブロックを表す`"safe"`、最新のファイナライズされたブロックを表す`"finalized"`、またはブロックにまだ含まれていないトランザクションを表す`"pending"`、`"earliest"`を指定できます。
-- `address`: `DATA|Array`、20バイト - (オプション)ログの生成元となるコントラクトアドレス、またはアドレスのリスト
-- `topics`: `Array of DATA`、- (オプション)32バイトの`DATA`トピックの配列。 トピックは順序に依存します。 各トピックは「or」オプションのDATA配列にすることも可能
+- `fromBlock`: `QUANTITY|TAG` - (オプション、デフォルト: `"latest"`) 整数のブロック番号、または最後の提案されたブロックを表す`"latest"`、最新の安全なブロックを表す`"safe"`、最新のファイナライズされたブロックを表す`"finalized"`、またはまだブロックに含まれていないトランザクションを表す`"pending"`、`"earliest"`。
+- `toBlock`: `QUANTITY|TAG` - (オプション、デフォルト: `"latest"`) 整数のブロック番号、または最後の提案されたブロックを表す`"latest"`、最新の安全なブロックを表す`"safe"`、最新のファイナライズされたブロックを表す`"finalized"`、またはまだブロックに含まれていないトランザクションを表す`"pending"`、`"earliest"`。
+- `address`: `DATA|Array`、20バイト - (オプション)ログの生成元となるコントラクトアドレスまたはアドレスのリスト。
+- `topics`: `Array of DATA` - (オプション)32バイトの`DATA`トピックの配列。 トピックは順序に依存します。 各トピックは「or」オプションのDATA配列にすることも可能
```js
params: [
@@ -1425,7 +1535,8 @@ params: [
]
```
-**戻り値** `QUANTITY` - フィルターID
+**戻り値**
+`QUANTITY` - フィルターID。
**例**
@@ -1442,11 +1553,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topic
### eth_newBlockFilter {#eth_newblockfilter}
-新しいブロックの到着を通知するために、ノードにフィルターを作成します。 状態変更を確認するには、[eth_getFilterChanges](#eth_getfilterchanges)を呼び出します。
+新しいブロックの到着を通知するために、ノードにフィルターを作成します。
+状態が変更されたかを確認するには、[eth_getFilterChanges](#eth_getfilterchanges)を呼び出します。
-**パラメータ** なし
+**パラメータ**
+なし
-**戻り値** `QUANTITY` - フィルターID
+**戻り値**
+`QUANTITY` - フィルターID。
**例**
@@ -1463,11 +1577,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],
### eth_newPendingTransactionFilter {#eth_newpendingtransactionfilter}
-新しい保留中のトランザクションの到着を通知するために、ノードにフィルターを作成します。 状態変更を確認するには、[eth_getFilterChanges](#eth_getfilterchanges)を呼び出します。
+新しい保留中のトランザクションの到着を通知するために、ノードにフィルターを作成します。
+状態が変更されたかを確認するには、[eth_getFilterChanges](#eth_getfilterchanges)を呼び出します。
-**パラメータ** なし
+**パラメータ**
+なし
-**戻り値** `QUANTITY` - フィルターID
+**戻り値**
+`QUANTITY` - フィルターID。
**例**
@@ -1484,11 +1601,12 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter"
### eth_uninstallFilter {#eth_uninstallfilter}
-指定されたIDを使用して、フィルターをアンインストールします。 ウォッチが不要になったら、必ず呼び出す必要があります。 また、フィルターは一定期間、[eth_getFilterChanges](#eth_getfilterchanges)を使用してリクエストされなければタイムアウトします。
+指定されたIDを使用して、フィルターをアンインストールします。 ウォッチが不要になったら、必ず呼び出す必要があります。
+また、フィルターは一定期間[eth_getFilterChanges](#eth_getfilterchanges)でリクエストされないとタイムアウトします。
**パラメータ**
-1. `QUANTITY` - フィルターID
+1. `QUANTITY` - フィルターID。
```js
params: [
@@ -1496,7 +1614,8 @@ params: [
]
```
-**戻り値** `Boolean` - フィルターのアンインストールに成功した場合は`true`、その他の場合は`false`
+**戻り値**
+`Boolean` - フィルターが正常にアンインストールされた場合は`true`、それ以外は`false`。
**例**
@@ -1517,7 +1636,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["
**パラメータ**
-1. `QUANTITY` - フィルターID
+1. `QUANTITY` - フィルターID。
```js
params: [
@@ -1525,26 +1644,30 @@ params: [
]
```
-**戻り値** `Array` - ログオブジェクトの配列、または最後のポーリングから変化がない場合は空の配列
-
-- `eth_newBlockFilter`で作成したフィルターでは、ブロックハッシュ(`DATA`、32バイト)が返されます(例: `["0x3454645634534..."]`)
-- `eth_newPendingTransactionFilter`で作成したフィルターでは、トランザクションハッシュ(`DATA`、32バイト)が返されます(例: `["0x6345343454645..."]`)
-- `eth_newFilter`で作成されたフィルターでは、ログは下記のパラメータを持つオブジェクトになります
- - `removed`: `TAG` - チェーンの再編成によってログが削除された場合は`true`。 ログが有効な場合は`false`
- - `logIndex`: `QUANTITY` - ブロック内のログインデックスの位置(整数)。 保留中のログの場合は`null`
- - `transactionIndex`: `QUANTITY` - ログの作成元のトランザクションのインデックスの位置(整数) 。 保留中のログの場合は`null`
- - `transactionHash`: `DATA`、32バイト - このログが作成されたトランザクションのハッシュ。 保留中のログの場合は`null`
- - `blockHash`: `DATA`、32バイト - このログが存在したブロックのハッシュ。 保留中の場合は`null` 保留中のログの場合は`null`
- - `blockNumber`: `QUANTITY` - このログが存在したブロックの番号。 保留中の場合は`null` 保留中のログの場合は`null`
- - `address`: `DATA`、20バイト - このログの作成元のアドレス
- - `data`: `DATA` - ゼロまたは32バイト以上のインデックス付けがされていないログの引数を含む
- - `topics`: `Array of DATA` - 0から4つの32バイトのインデックス付けされたログの引数の`DATA`配列。 (_Solidity_の場合: 最初のトピックはイベント(例: `Deposit(address,bytes32,uint256)`)の署名の_ハッシュ_。ただし、`anonymous`指定子でイベントを宣言した場合を除く)
+**戻り値**
+`Array` - ログオブジェクトの配列、または最後のポーリング以降に変更がない場合は空の配列。
+
+- `eth_newBlockFilter`で作成されたフィルターの場合、戻り値はブロックハッシュ(`DATA`、32バイト)です(例: `["0x3454645634534..."]`)。
+
+- `eth_newPendingTransactionFilter`で作成されたフィルターの場合、戻り値はトランザクションハッシュ(`DATA`、32バイト)です(例: `["0x6345343454645..."]`)。
+
+- `eth_newFilter`で作成されたフィルターの場合、ログは以下のパラメータを持つオブジェクトです:
+ - `removed`: `TAG` - チェーンの再編成によりログが削除された場合は`true`。 有効なログの場合は`false`。
+ - `logIndex`: `QUANTITY` - ブロック内のログインデックス位置の整数。 保留中のログの場合はnull。
+ - `transactionIndex`: `QUANTITY` - ログが作成されたトランザクションのインデックス位置の整数。 保留中のログの場合はnull。
+ - `transactionHash`: `DATA`、32バイト - このログが作成されたトランザクションのハッシュ。 保留中のログの場合はnull。
+ - `blockHash`: `DATA`、32バイト - このログが含まれていたブロックのハッシュ。 保留中の場合はnull。 保留中のログの場合はnull。
+ - `blockNumber`: `QUANTITY` - このログが含まれていたブロック番号。 保留中の場合はnull。 保留中のログの場合はnull。
+ - `address`: `DATA`、20バイト - このログの生成元のアドレス。
+ - `data`: `DATA` - 可変長のインデックスなしログデータ。 (_Solidity_の場合: 0個以上の32バイトのインデックスなしログ引数。)
+ - `topics`: `Array of DATA` - 0から4つの32バイト`DATA`からなる、インデックス付けされたログ引数の配列。 (_Solidity_の場合: 最初のトピックは、イベントの署名の_ハッシュ_です(例: `Deposit(address,bytes32,uint256)`)。ただし、`anonymous`指定子でイベントを宣言した場合を除きます。)
+
- **例**
```js
-// Request
+// リクエスト
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}'
-// Result
+// 結果
{
"id":1,
"jsonrpc":"2.0",
@@ -1569,7 +1692,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":[
**パラメータ**
-1. `QUANTITY` - フィルターID
+1. `QUANTITY` - フィルターID。
```js
params: [
@@ -1577,7 +1700,8 @@ params: [
]
```
-**戻り値**については、 [eth_getFilterChanges](#eth_getfilterchanges)を参照してください。
+**戻り値**
+[eth_getFilterChanges](#eth_getfilterchanges)を参照
**例**
@@ -1586,7 +1710,7 @@ params: [
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}'
```
-結果については、[eth_getFilterChanges](#eth_getfilterchanges)を参照してください。
+結果は[eth_getFilterChanges](#eth_getfilterchanges)を参照
### eth_getLogs {#eth_getlogs}
@@ -1594,13 +1718,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x
**パラメータ**
-1. `Object` - フィルターオプション
+1. `Object` - フィルターオプション:
-- `fromBlock`: `QUANTITY|TAG` - (オプション、デフォルトは`"latest"`) 整数のブロック番号、または最後に提案されたブロックを表す`"latest"`、最新の安全なブロックを表す`"safe"`、最新のファイナライズされたブロックを表す`"finalized"`、またはブロックにまだ含まれていないトランザクションを表す`"pending"`、`"earliest"`を指定できます。
-- `toBlock`: `QUANTITY|TAG` - (オプション、デフォルトは`"latest"`) 整数のブロック番号、または最後に提案されたブロックを表す`"latest"`、最新の安全なブロックを表す`"safe"`、最新のファイナライズされたブロックを表す`"finalized"`、またはブロックにまだ含まれていないトランザクションを表す`"pending"`、`"earliest"`を指定できます。
-- `address`: `DATA|Array`、20バイト - (オプション)ログの生成元となるコントラクトアドレス、またはアドレスのリスト
-- `topics`: `Array of DATA`、- (オプション)32バイトの`DATA`トピックの配列。 トピックは順序に依存します。 各トピックは「or」オプションのDATA配列にすることも可能
-- `blockhash`: `DATA`、32バイト - (オプション、**実装予定**) EIP-234が追加されたことにより、`blockHash`が新たなフィルターオプションになります。これは、返されるログを32バイトのハッシュ`blockHash`を持つ単一のブロックに制限します。 `blockHash`を使用することは、`fromBlock`と`toBlock`に`blockHash`のハッシュのブロック番号を指定することと同等です。 `blockHash`がフィルター条件にある場合、`fromBlock`と`toBlock`は使用できません。
+- `fromBlock`: `QUANTITY|TAG` - (オプション、デフォルト: `"latest"`) 整数のブロック番号、または最後の提案されたブロックを表す`"latest"`、最新の安全なブロックを表す`"safe"`、最新のファイナライズされたブロックを表す`"finalized"`、またはまだブロックに含まれていないトランザクションを表す`"pending"`、`"earliest"`。
+- `toBlock`: `QUANTITY|TAG` - (オプション、デフォルト: `"latest"`) 整数のブロック番号、または最後の提案されたブロックを表す`"latest"`、最新の安全なブロックを表す`"safe"`、最新のファイナライズされたブロックを表す`"finalized"`、またはまだブロックに含まれていないトランザクションを表す`"pending"`、`"earliest"`。
+- `address`: `DATA|Array`、20バイト - (オプション)ログの生成元となるコントラクトアドレスまたはアドレスのリスト。
+- `topics`: `Array of DATA` - (オプション)32バイトの`DATA`トピックの配列。 トピックは順序に依存します。 各トピックは「or」オプションのDATA配列にすることも可能
+- `blockHash`: `DATA`、32バイト - (オプション、**将来**)EIP-234の追加により、`blockHash`は新しいフィルターオプションとなり、返されるログを32バイトハッシュ`blockHash`を持つ単一ブロックに制限します。 `blockHash`を使用することは、`fromBlock` = `toBlock` = ハッシュ`blockHash`を持つブロック番号と等価です。 フィルター条件に`blockHash`が存在する場合、`fromBlock`も`toBlock`も許可されません。
```js
params: [
@@ -1612,7 +1736,8 @@ params: [
]
```
-**戻り値**については、 [eth_getFilterChanges](#eth_getfilterchanges)を参照してください。
+**戻り値**
+[eth_getFilterChanges](#eth_getfilterchanges)を参照
**例**
@@ -1621,15 +1746,15 @@ params: [
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}'
```
-結果については、[eth_getFilterChanges](#eth_getfilterchanges)を参照してください。
+結果は[eth_getFilterChanges](#eth_getfilterchanges)を参照
## 使用例 {#usage-example}
-### JSON_RPCを使用してコントラクトをデプロイする {#deploying-contract}
+### JSON_RPCを使用したコントラクトのデプロイ {#deploying-contract}
-このセクションでは、RPCインターフェースのみを使用してコントラクトをデプロイする方法について、実例を交えて説明します。 コントラクトをデプロイする際には、複雑さを抽象化できる別の方法があります。例えば、RPCインターフェースを基盤としたライブラリ([web3.js](https://web3js.readthedocs.io/)、[web3.py](https://github.com/ethereum/web3.py)など)を使用できます。 通常、抽象化すると簡単に理解できるようになり、エラーも起こりにくくなります。それでも、内部の仕組みを知っておくことで、理解を深めることができます。
+このセクションでは、RPCインターフェースのみを使用してコントラクトをデプロイする方法について、実例を交えて説明します。 この複雑さが抽象化されている、コントラクトをデプロイするための代替ルートがあります。例えば、[web3.js](https://web3js.readthedocs.io/)や[web3.py](https://github.com/ethereum/web3.py)など、RPCインターフェース上に構築されたライブラリを使用する方法です。 通常、抽象化すると簡単に理解できるようになり、エラーも起こりにくくなります。それでも、内部の仕組みを知っておくことで、理解を深めることができます。
-以下は、JSON-RPCインターフェースを使用してイーサリアムノードにデプロイされる、`Multiply7`と呼ばれる簡単なスマートコントラクトです。 このチュートリアルは、読者がすでにGethノードを実行していることを前提としています。 ノードとクライアントの詳細については、[こちら](/developers/docs/nodes-and-clients/run-a-node)をご覧ください。 また、Gethクライアント以外のHTTP JSON-RPCを起動する方法については、それぞれの[クライアント](/developers/docs/nodes-and-clients/)のドキュメントを参照してください。 ほとんどのクライアントは、デフォルトでは`localhost:8545`で動作します。
+以下は、`Multiply7`という単純なスマートコントラクトで、JSON-RPCインターフェースを使用してEthereumノードにデプロイされます。 このチュートリアルは、読者がすでにGethノードを実行していることを前提としています。 ノードとクライアントに関する詳細情報は、[こちら](/developers/docs/nodes-and-clients/run-a-node)で入手できます。 Geth以外のクライアントでHTTP JSON-RPCを開始する方法については、個々の[クライアント](/developers/docs/nodes-and-clients/)のドキュメントを参照してください。 ほとんどのクライアントは、デフォルトで`localhost:8545`でサービスを提供します。
```javascript
contract Multiply7 {
@@ -1641,18 +1766,18 @@ contract Multiply7 {
}
```
-まず、HTTP RPCインターフェースが有効になっていることを確認します。 つまり、Gethの起動時に`--http`フラグを設定します。 この例では、プライベート開発チェーン上のGethノードを使用します。 このアプローチを使用する際には、本物のネットワーク上のEtherは必要ありません。
+まず、HTTP RPCインターフェースが有効になっていることを確認します。 これは、起動時にGethに`--http`フラグを供給することを意味します。 この例では、プライベート開発チェーン上のGethノードを使用します。 このアプローチを使用する際には、本物のネットワーク上のEtherは必要ありません。
```bash
geth --http --dev console 2>>geth.log
```
-これにより、HTTP RPCインターフェースが`http://localhost:8545`で開始します。
+これにより、HTTP RPCインターフェースが`http://localhost:8545`で開始されます。
-[curl](https://curl.se)を使用してCoinbaseアドレスと残高を取得することにより、インターフェースが実行されていることを確認できます。 例で示されているデータは、ローカルノードによって異なりますのでご注意ください。 これらのコマンドを試す場合は、2番目のcurlリクエストのrequestパラメータの値を、1番目のcurlリクエストから返されたresultパラメータに置き換えてください。
+[curl](https://curl.se)を使用して、コインベースアドレス(アカウントの配列から最初のアドレスを取得)と残高を取得することで、インターフェースが実行中であることを確認できます。 例で示されているデータは、ローカルノードによって異なりますのでご注意ください。 これらのコマンドを試す場合は、2番目のcurlリクエストのrequestパラメータの値を、1番目のcurlリクエストから返されたresultパラメータに置き換えてください。
```bash
-curl --data '{"jsonrpc":"2.0","method":"eth_coinbase", "id":1}' -H "Content-Type: application/json" localhost:8545
+curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":1}' -H "Content-Type: application/json" localhost:8545
{"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]}
curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545
@@ -1666,9 +1791,9 @@ web3.fromWei("0x1639e49bba16280000", "ether")
// "410"
```
-これで、プライベート開発チェーンにEtherが存在するようになったため、コントラクトをデプロイできるようになりました。 最初のステップは、Multiply7コントラクトをEVMに送信できるバイトコードにコンパイルすることです。 Solidityのコンパイラであるsolcをインストールするには、[Solidityドキュメント](https://docs.soliditylang.org/en/latest/installing-solidity.html)を参照してください ([この例で使用しているコンパイラのバージョン](https://github.com/ethereum/solidity/releases/tag/v0.4.20)に適合するように、古い`solc`リリースを使用することをお勧めします)。
+これで、プライベート開発チェーンにEtherが存在するようになったため、コントラクトをデプロイできるようになりました。 最初のステップは、Multiply7コントラクトをEVMに送信できるバイトコードにコンパイルすることです。 Solidityコンパイラであるsolcをインストールするには、[Solidityドキュメント](https://docs.soliditylang.org/en/latest/installing-solidity.html)に従ってください。 (この例で使用されているコンパイラのバージョンに合わせるために、古い`solc`リリース([v0.4.20](https://github.com/ethereum/solidity/releases/tag/v0.4.20)など)を使用することをお勧めします。)
-次のステップでは、Multiply7コントラクトを、EVMに送信できるバイトコードにコンパイルします。
+次のステップは、Multiply7コントラクトを、EVMに送信できるバイトコードにコンパイルすることです。
```bash
echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin
@@ -1678,7 +1803,7 @@ Binary:
6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029
```
-これで、コードがコンパイルされました。次に、デプロイに必要なガスの量を特定する必要があります。 RPCインターフェースには、推定値を取得するための`eth_estimateGas`メソッドがあります。
+これで、コードがコンパイルされました。次に、デプロイに必要なガスの量を特定する必要があります。 RPCインターフェースには、推定値を提供する`eth_estimateGas`メソッドがあります。
```bash
curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 5}' -H "Content-Type: application/json" localhost:8545
@@ -1692,20 +1817,21 @@ curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from
{"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"}
```
-トランザクションがノードによって受け入れられると、トランザクションのハッシュが返されます。 このハッシュはトランザクションの追跡に使用されます。 次のステップは、コントラクトがデプロイされているアドレスを特定することです。 実行された各トランザクションによって、レシートが作成されます。 このレシートには、トランザクションが含まれていたブロックや、EVMによって使用されたガスの量など、トランザクションに関するさまざまな情報が含まれています。 トランザクション でコントラクトが作成される場合は、コントラクトのアドレスも含まれています。 レシートは、`eth_getTransactionReceipt`RPCメソッドで取得できます。
+トランザクションがノードによって受け入れられると、トランザクションのハッシュが返されます。 このハッシュはトランザクションの追跡に使用されます。 次のステップは、コントラクトがデプロイされているアドレスを特定することです。 実行された各トランザクションによって、レシートが作成されます。 このレシートには、トランザクションが含まれていたブロックや、EVMによって使用されたガスの量など、トランザクションに関するさまざまな情報が含まれています。 トランザクション
+でコントラクトが作成される場合は、コントラクトのアドレスも含まれています。 `eth_getTransactionReceipt`RPCメソッドでレシートを取得できます。
```bash
curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"], "id": 7}' -H "Content-Type: application/json" localhost:8545
{"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}}
```
-これで、コントラクトが`0x4d03d617d700cf81935d7f797f4e2ae719648262`に作成されました。 レシートの代わりにnullが返された場合、それはトランザクションがまだブロックに含まれていないことを意味します。 少し待ってから、コンセンサスクライアントが正常に動作しているか確認し、再試行してください。
+コントラクトは`0x4d03d617d700cf81935d7f797f4e2ae719648262`に作成されました。 レシートの代わりにnullが返された場合、それはトランザクションがまだブロックに含まれていないことを意味します。 少し待ってから、コンセンサスクライアントが正常に動作しているか確認し、再試行してください。
-#### スマートコントラクトとのやりとり {#interacting-with-smart-contract}
+#### スマートコントラクトとの対話 {#interacting-with-smart-contract}
この例では、`eth_sendTransaction`を使用して、コントラクトの`multiply`メソッドにトランザクションを送信します。
-`eth_sendTransaction`にはいくつかの引数、具体的には`from`、`to`、`data`が必要です。 `from`は、アカウントの公開アドレスで、`to`はコントラクトアドレスです。 引数`data`には、どのメソッドがどの引数で呼び出されるのかが定義されたペイロードが含まれています。 ここで、[ABI(アプリケーション・バイナリー・インターフェース)](https://docs.soliditylang.org/en/latest/abi-spec.html)を使用します。 ABIは、EVMのためにデータの定義とエンコードの方法を明示したJSONファイルです。
+`eth_sendTransaction`には、`from`、`to`、`data`など、いくつかの引数が必要です。 `From`は私たちのアカウントの公開アドレスで、`to`はコントラクトアドレスです。 `data`引数には、どのメソッドをどの引数で呼び出すかを定義するペイロードが含まれています。 ここで[ABI (アプリケーションバイナリインターフェース)](https://docs.soliditylang.org/en/latest/abi-spec.html)が関係してきます。 ABIは、EVMのためにデータの定義とエンコードの方法を明示したJSONファイルです。
ペイロードのバイトによって、コントラクトのどのメソッドが呼び出されるかが定義されています。 これは、関数名とその引数の型を16進数でエンコードしたKeccakハッシュの最初の4バイトです。 multiply関数はuint256のエイリアスであるuintを受け取ります。 そのため、以下のようになります。
@@ -1716,11 +1842,11 @@ web3.sha3("multiply(uint256)").substring(0, 10)
次のステップでは、引数をエンコードします。 uint256は1つのみです。この例では6とします。 ABIには、uint256型のエンコード方法を指定するセクションがあります。
-`int: enc(X)`は、Xのビッグエンディアンの2の補数表現でのエンコーディングです。長さが32バイトの倍数になるように、Xが負の場合は0xffを使用して、正の場合は0>バイトを使用して左詰めされます。
+`int: enc(X)`は、Xのビッグエンディアン2の補数エンコーディングで、長さが32バイトの倍数になるように、負のXの場合は上位(左)側が0xffで、正のXの場合はゼロバイトでパディングされます。
-これにより、`00000000000000000000000000000000000000000000006`とエンコードされます。
+これは`0000000000000000000000000000000000000000000000000000000000000006`にエンコードされます。
-関数セレクターとエンコードされた引数を組み合わせると、データは `0xc6888fa10000000000000000000000000000000000000000000000000000000000000006`になります。
+関数セレクタとエンコードされた引数を組み合わせると、データは`0xc6888fa10000000000000000000000000000000000000000000000000000000000000006`になります。
これを、以下のようにノードに送信します。
@@ -1753,7 +1879,7 @@ curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from
}
```
-レシートには、ログが含まれています。 このログは、EVMによってトランザクションの実行時に生成され、レシートに含まれます。 `multiply`関数によって、`Print`イベントが入力の7倍で発生したことが示されています。 `Print`イベントの引数はuint256であるため、ABIルールに従ってデコードできます。これにより、期待される10進数である42が得られます。 このデータのほかに、トピックを使用することでどのイベントによってログが作成されたかを把握することもできます。
+レシートには、ログが含まれています。 このログは、EVMによってトランザクションの実行時に生成され、レシートに含まれます。 `multiply`関数は、`Print`イベントが入力の7倍で発生したことを示しています。 `Print`イベントの引数はuint256であったため、ABIルールに従ってデコードできます。これにより、期待される10進数である42が得られます。 このデータのほかに、トピックを使用することでどのイベントによってログが作成されたかを把握することもできます。
```javascript
web3.sha3("Print(uint256)")
@@ -1764,8 +1890,8 @@ web3.sha3("Print(uint256)")
## 関連トピック {#related-topics}
-- [JSON-RPCの仕様](http://www.jsonrpc.org/specification)
-- [ ノードとクライアント](/developers/docs/nodes-and-clients/)
-- [JavaScript APIs](/developers/docs/apis/javascript/)
+- [JSON-RPC仕様](http://www.jsonrpc.org/specification)
+- [ノードとクライアント](/developers/docs/nodes-and-clients/)
+- [JavaScript API](/developers/docs/apis/javascript/)
- [バックエンドAPI](/developers/docs/apis/backend/)
- [実行クライアント](/developers/docs/nodes-and-clients/#execution-clients)
diff --git a/public/content/translations/ja/developers/docs/blocks/index.md b/public/content/translations/ja/developers/docs/blocks/index.md
index c0a1bfd96db..aacbf459e06 100644
--- a/public/content/translations/ja/developers/docs/blocks/index.md
+++ b/public/content/translations/ja/developers/docs/blocks/index.md
@@ -1,20 +1,21 @@
---
-title: ブロック
-description: イーサリアムブロックチェーンの概要 - データ構造、データ構造の背景と構成
+title: "ブロック"
+description: "イーサリアムブロックチェーンの概要 - データ構造、データ構造の背景と構成"
lang: ja
---
ブロックとは、チェーンの1つ前のハッシュとトランザクションのバッチのことです。 ハッシュはブロックデータから暗号的に生成されるため、チェーンのブロックはお互いに繋がっています。 前のブロックのハッシュを用いるため、どれかのブロックが改ざんされるとデータの整合性が取れなくなるため、ブロックチェーンを実行しているすべての人が改ざんに気づくことになります。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-この記事は初心者向けに記載していますが、 より理解を深めるために、まず[アカウント](/developers/docs/accounts/)、[トランザクション](/developers/docs/transactions/)そして[イーサリアムの導入](/developers/docs/intro-to-ethereum/)を読むことをお勧めします。
+この記事は初心者向けに記載していますが、 ただし、このページをより深く理解するために、最初に[アカウント](/developers/docs/accounts/)、[トランザクション](/developers/docs/transactions/)、そして[イーサリアムの紹介](/developers/docs/intro-to-ethereum/)をお読みになることをお勧めします。
## ブロックを使用する背景 {#why-blocks}
ブロックはすべてのイーサリアムネットワークへの参加者が同期された状態を維持し、トランザクションの正確な履歴に同意できるように、複数のトランザクションをブロックにバッチとして格納します。 これは、何十件(もしくは数百) ものトランザクションが一度にコミット、合意、同期されることを意味します。
- _ [イーサリアムEVM](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)からの図解_
+
+_図は[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)を参考に作成_
コミットの間隔をあけ、すべてのネットワーク参加者がコンセンサスに至るまでの十分な時間を確保しています。たとえトランザクション要求が毎秒数十回発生したとしても、ブロックはイーサリアム上で12秒に1回生成され、コミットされます。
@@ -24,68 +25,68 @@ lang: ja
ランダムに選ばれたバリデータがブロックをまとめると、そのブロックは残りの他のネットワークに伝播されます。すべてのノードはこのブロックをブロックチェーンの最後尾に追加します。そして、新しいバリデータが選ばれ、次のブロックを生成します。 このブロック生成とコミットメント/コンセンサスプロセスは、現在イーサリアム「プルーフ・オブ・ステーク (PoS) 」プロトコルによって定義されています。
-## プルーフ・オブ・ステーク(PoS)プロトコル {#proof-of-work-protocol}
+## プルーフ・オブ・ステークのプロトコル {#proof-of-stake-protocol}
プルーフ・オブ・ステークとは、以下のことを意味します。
- 検証を行うノードは、不正行為をしない担保として、デポジットコントラクトに32 ETHのステーキングが必要。 明らかに不誠実な行為を行うと、担保のステーキングの一部またはすべてが失うことになるため、ネットワークの保護を目的としている。
- すべてのスロット(12秒間隔)において、ランダムに1つのバリデータがブロックの提案者として選出される。 選ばれたバリデータが、トランザクションを1つにまとめ、実行し新たな「状態」を決定し、 この情報をブロックに格納し、他のバリデータに渡す。
-- 新しいブロックに関する情報を受け取った他のバリデータは、トランザクションを再実行し、グローバル状態への変更提案について同意することを確認する。 ブロックが有効であった場合、それを自分のデータベースに追加する。
+- 新しいブロックに関する情報を受け取った他のバリデータは、トランザクションを再実行し、グローバル状態への変更提案について同意することを確認します。 ブロックが有効であると判断した場合、それを自分のデータベースに追加します。
- バリデータが同一スロットで2つの競合するブロックの情報を受け取った場合は、フォーク・チョイス・アルゴリズムを使用して、最も多額のETHステーキングにより支持されている方を選択する。
-[プルーフ・オブ・ステーク(PoS)の詳細](/developers/docs/consensus-mechanisms/pos)
+[プルーフ・オブ・ステークの詳細](/developers/docs/consensus-mechanisms/pos)
## ブロックが保持するパラメータ {#block-anatomy}
ブロックにはたくさんの情報が含まれており、 大まかには、以下のようなフィールドがあります。
| フィールド | 説明 |
-|:---------------- |:------------------------------- |
-| `スロット (slot)` | ブロックが所属するスロット |
+| :--------------- | :------------------------------ |
+| `slot` | ブロックが所属するスロット |
| `proposer_index` | ブロックを提案するバリデータのID |
| `parent_root` | 先行ブロックのハッシュ値 |
| `state_root` | 状態オブジェクトのルートハッシュ |
| `規格の概要` | 以下に定義されているように、複数のフィールドを含むオブジェクト |
-ブロックの`body`には独自のフィールドがいくつかあります。
+ブロックの`body`には、独自のフィールドがいくつか含まれています。
| フィールド | 説明 |
-|:-------------------- |:------------------------------ |
+| :------------------- | :----------------------------- |
| `randao_reveal` | 次のブロック提案者の選択に使用される値 |
| `eth1_data` | デポジットコントラクトの情報 |
-| `グラフィティ` | ブロックのタグ付けに使われる任意のデータ |
+| `graffiti` | ブロックのタグ付けに使われる任意のデータ |
| `proposer_slashings` | スラッシュされるバリデータのリスト |
| `attester_slashings` | スラッシュされる証明者のリスト |
-| `アテステーション` | 現在のブロックに賛成しているアテステーションのリスト |
+| `アテステーション` | 以前のスロットに対して行われたアテステーションのリスト |
| `入金` | デポジットコントラクトに対する新しい入金のリスト |
| `voluntary_exits` | ネットワークに存在するバリデータのリスト |
| `sync_aggregate` | ライトクライアントへの提供に使用されるバリデータのサブセット |
| `execution_payload` | 実行クライアントから渡されるトランザクション |
-`attestations`フィールドには、ブロック内のすべてのアテステーションのリストが含まれます。 アテステーションは、複数のデータを含むそれぞれの独自のデータ型があり、 それぞれのアテステーションには以下が含まれています。
+`attestations`フィールドには、ブロック内のすべてのアテステーションのリストが含まれています。 アテステーションは、複数のデータを含むそれぞれの独自のデータ型があり、 それぞれのアテステーションには以下が含まれています。
| フィールド | 説明 |
-|:------------------ |:-------------------------- |
+| :----------------- | :------------------------- |
| `aggregation_bits` | このアテステーションに参加しているバリデータのリスト |
| `データ` | 複数のサブフィールドを持つコンテナ |
-| `署名` | 証明する全バリデータによる署名の集約 |
+| `署名` | `data`部分に対するバリデータのセットの集約署名 |
`attestation`の`data`フィールドには、以下が含まれます。
-| フィールド | 説明 |
-|:------------------- |:--------------------------- |
-| `スロット (slot)` | アテステーションに関連するスロット |
-| `インデックス` | 証明するバリデータのインデックス |
-| `beacon_block_root` | このオブジェクトを含むビーコンブロックのルートハッシュ |
-| `情報源` | 最後に正当化されたチェックポイント |
-| `target` | 最新のエポック境界ブロック |
+| フィールド | 説明 |
+| :------------------ | :----------------------------- |
+| `slot` | アテステーションに関連するスロット |
+| `インデックス` | 証明するバリデータのインデックス |
+| `beacon_block_root` | チェーンのヘッドと見なされるビーコンブロックのルートハッシュ |
+| `情報源` | 最後に正当化されたチェックポイント |
+| `target` | 最新のエポック境界ブロック |
-`execution_payload`のトランザクションを実行すると、グローバル状態が更新されます。 すべてのクライアントは「新しい状態」が「新しいブロック」の`state_root`フィールドの状態と一致することを確認するために、`execution_payload`のトランザクションを再実行します。 このようにして、クライアントは「新しいブロック」が有効であり、ブロックチェーンに追加しても安全であることを判断します。 `execution payload`自体は、いくつかのフィールドを持つオブジェクトです。 実行データに関する重要な要約情報を含む`execution_payload_header`もあります。 これらのデータ構造は、以下のように構成されています。
+`execution_payload`内のトランザクションを実行すると、グローバル状態が更新されます。 すべてのクライアントは、新しい状態が新しいブロックの`state_root`フィールドの状態と一致することを確認するために、`execution_payload`内のトランザクションを再実行します。 このようにして、クライアントは「新しいブロック」が有効であり、ブロックチェーンに追加しても安全であることを判断します。 `execution payload`自体は、いくつかのフィールドを持つオブジェクトです。 実行データに関する重要な要約情報を含む`execution_payload_header`もあります。 これらのデータ構造は、以下のように構成されています。
`execution_payload_header`には、以下のフィールドが含まれます。
| フィールド | 説明 |
-|:------------------- |:------------------------------------ |
+| :------------------ | :----------------------------------- |
| `parent_hash` | 親ブロックのハッシュ |
| `fee_recipient` | トランザクションフィーの支払先アカウントアドレス |
| `state_root` | このブロックに変更を適用した後のグローバルステートに対するルートハッシュ |
@@ -95,17 +96,17 @@ lang: ja
| `block_number` | 現在のブロック番号 |
| `gas_limit` | このブロックで許可されているガスの最大値 |
| `gas_used` | このブロックで実際に使われたガスの量 |
-| `タイムスタンプ` | ブロックタイム |
+| `timestamp` | ブロックタイム |
| `extra_data` | 生バイトで表される任意の追加データ |
| `base_fee_per_gas` | ベースフィーの値 |
| `block_hash` | 実行ブロックのハッシュ |
| `transactions_root` | ペイロードに含まれるトランザクションのルートハッシュ |
| `withdrawal_root` | ペイロードに含まれる引き出しのルートハッシュ |
-`execution_payload`自体には、以下のものが含まれます(注:トランザクションのルートハッシュの代わりに実際のトランザクションリストと引き出し情報を含んでいることを除けば、ヘッダーと同じ)。
+`execution_payload`自体には、以下のものが含まれます(注:トランザクションのルートハッシュの代わりに実際のトランザクションリストと引き出し情報を含んでいることを除けば、ヘッダーと同じです)。
| フィールド | 説明 |
-|:------------------ |:------------------------------------ |
+| :----------------- | :----------------------------------- |
| `parent_hash` | 親ブロックのハッシュ |
| `fee_recipient` | トランザクションフィーの支払先アカウントアドレス |
| `state_root` | このブロックに変更を適用した後のグローバルステートに対するルートハッシュ |
@@ -115,18 +116,18 @@ lang: ja
| `block_number` | 現在のブロック番号 |
| `gas_limit` | このブロックで許可されているガスの最大値 |
| `gas_used` | このブロックで実際に使われたガスの量 |
-| `タイムスタンプ` | ブロックタイム |
+| `timestamp` | ブロックタイム |
| `extra_data` | 生バイトで表される任意の追加データ |
| `base_fee_per_gas` | ベースフィーの値 |
| `block_hash` | 実行ブロックのハッシュ |
-| `処理` | 実行されるトランザクションのリスト |
-| `引き出し` | 引き出しオブジェクトのリスト |
+| `トランザクション` | 実行されるトランザクションのリスト |
+| `出金` | 引き出しオブジェクトのリスト |
-`withdrawals`リストには、次のように構造化された`withdrawals`オブジェクトが含まれています。
+`withdrawals`リストには、次のように構造化された`withdrawal`オブジェクトが含まれています。
| フィールド | 説明 |
-|:---------------- |:--------------- |
-| `address` | 引き出されたアカウントアドレス |
+| :--------------- | :-------------- |
+| `アドレス` | 引き出されたアカウントアドレス |
| `金額` | 引き出し金額 |
| `インデックス` | 引き出しのインデックス値 |
| `validatorIndex` | バリデータのインデックス値 |
@@ -135,15 +136,15 @@ lang: ja
ブロックタイムとは、ブロックの生成間隔のことです。 イーサリアムでは、12秒単位で時間を分割し、その単位を「スロット」と呼びます。 各スロットでは、1人のバリデータが選ばれ、ブロックを提案します。 すべてのバリデータがオンラインで完全に稼働している場合、すべてのスロットにブロックが1つ生成され、ブロックタイムは12秒となります。 しかし、バリデータがブロックを提案するタイミングでオフラインになっていることがあり、その場合、スロットが空になることがあります。
-この実装は、ブロックタイムが不規則であり、プロトコルがターゲットとして定めるマイニングの難易度によって調整されるプルーフ・オブ・ワークを基としたシステムとは異なります。 イーサリアムの[平均ブロックタイム](https://etherscan.io/chart/blocktime)は、12秒という新しいブロックタイムで安定しており、これは、プルーフ・オブ・ワークからプルーフ・オブ・ステークへの移行が明確に示される最も良い例です。
+この実装は、ブロックタイムが不規則であり、プロトコルがターゲットとして定めるマイニングの難易度によって調整されるプルーフ・オブ・ワークを基としたシステムとは異なります。 イーサリアムの[平均ブロックタイム](https://etherscan.io/chart/blocktime)は、新しい12秒のブロックタイムの一貫性に基づき、プルーフ・オブ・ワークからプルーフ・オブ・ステークへの移行が明確に推測できる完璧な例です。
## ブロックサイズ {#block-size}
-最後に重要なのは、ブロックのサイズには制限があるということです。 各ブロックの目標サイズは3,000万ガスですが、ネットワークの需要に合わせて、ブロックの上限である6,000万ガス(目標ブロックサイズの2倍)まで増減します。 ブロックのガスリミットは、前のブロックのガスリミットから1/1024の割合で上下に調整することができます。 したがって、バリデータはコンセンサスによってブロックのガスリミットを変更することができます。 ブロックの全トランザクションで消費されたガスの総量は、ブロックのガスリミットを超えてはいけません。 ブロックが勝手に大きくなりすぎるのを防ぐという点で、この制限は重要です。 ブロックサイズが大きすぎると、スペースと速度の要件により、パフォーマンスの低いフルノードはネットワークに追いつけなくなり、 次のスロットに間に合うように処理するために必要な計算能力も高くなります。 これが中央集権的な力につながってしまうことから、ブロックサイズに上限を設けています。
+最後に重要なのは、ブロックのサイズには制限があるということです。 各ブロックの目標サイズは3000万ガスですが、ネットワークの需要に応じて、ブロックの上限である6000万ガス(目標ブロックサイズの2倍)まで増減します。 ブロックのガスリミットは、前のブロックのガスリミットから1/1024の割合で上下に調整することができます。 したがって、バリデータはコンセンサスによってブロックのガスリミットを変更することができます。 ブロックの全トランザクションで消費されたガスの総量は、ブロックのガスリミットを超えてはいけません。 ブロックが勝手に大きくなりすぎるのを防ぐという点で、この制限は重要です。 ブロックサイズが大きすぎると、スペースと速度の要件により、パフォーマンスの低いフルノードはネットワークに追いつけなくなり、 次のスロットに間に合うように処理するために必要な計算能力も高くなります。 これが中央集権的な力につながってしまうことから、ブロックサイズに上限を設けています。
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-_役に立ったコミュニティリソースがあれば、 ぜひこのページに追加してください。_
+_役に立つコミュニティリソースを知っていますか? Edit this page and add it!_
## 関連トピック {#related-topics}
diff --git a/public/content/translations/ja/developers/docs/bridges/index.md b/public/content/translations/ja/developers/docs/bridges/index.md
index e42e20e7088..96ce2dbfd18 100644
--- a/public/content/translations/ja/developers/docs/bridges/index.md
+++ b/public/content/translations/ja/developers/docs/bridges/index.md
@@ -1,20 +1,20 @@
---
-title: ブリッジ
-description: デベロッパー向けのブリッジ概要
+title: "ブリッジ"
+description: "デベロッパー向けのブリッジ概要"
lang: ja
---
-L1のブロックチェーンおよびL2の[スケーリング](/developers/docs/scaling/)ソリューションが一般化し、ますます多くの分散型アプリケーションがクロスチェーンで運用されつつある現在、複数のチェーン間における通信および資産移動を実現する機能がネットワークインフラにおける不可欠な要素となっています。 この機能を提供するために、さまざまな種類のブリッジが開発されています。
+L1ブロックチェーンとL2[スケーリング](/developers/docs/scaling/)ソリューションが普及し、クロスチェーン化する分散型アプリケーションが増え続ける中、チェーンをまたいだ通信と資産移動は、ネットワークインフラに不可欠な要素となっています。 この機能を提供するために、さまざまな種類のブリッジが開発されています。
-## ブリッジがなぜ必要か? {#need-for-bridges}
+## ブリッジの必要性 {#need-for-bridges}
ブリッジは、複数のブロックチェーンネットワークを接続するために開発されました。 これにより、複数のブロックチェーンが接続され、相互運用が可能になります。
ブロックチェーンはサイロ化された環境で存在するため、あるブロックチェーンがそれ自体で他のブロックチェーンと取引したり通信したりすることはできません。 このため、特定のエコシステムにおいて活発なアクティビティやイノベーションが発生していたとしても、他のエコシステムとの接続性や相互運用性が存在しないために、当該エコシステム自体の限界を越えることができません。
-ブリッジは、相互に隔離されているブロックチェーン環境を接続する手段を提供します。 複数のブロックチェーン間における転送ルートを提供することで、トークン、メッセージ、任意のデータ、および[スマートコントラクト](/developers/docs/smart-contracts/)の呼び出しさえも、あるブロックチェーンから他のブロックチェーンに転送することが可能になります。
+ブリッジは、相互に隔離されているブロックチェーン環境を接続する手段を提供します。 ブリッジはブロックチェーン間に転送ルートを確立し、トークン、メッセージ、任意のデータ、さらには[スマートコントラクト](/developers/docs/smart-contracts/)の呼び出しまでもが、あるチェーンから別のチェーンへと転送できるようになります。
-## ブリッジの利点 {#benefits-of-bridges}
+## ブリッジのメリット {#benefits-of-bridges}
ブリッジの有用性は、複数のブロックチェーン間におけるデータの交換や資産の移動を可能にすることで、数多くの新たなユースケースを生み出す可能性を持つ点にあります。
@@ -30,106 +30,109 @@ L1のブロックチェーンおよびL2の[スケーリング](/developers/docs
## ブリッジはどのように機能するのか? {#how-do-bridges-work}
-[ブリッジの設計](https://li.fi/knowledge-hub/blockchain-bridges-and-classification/)には多くの種類がありますが、特に、クロスチェーンで資産を移転する以下の3つの方法が重要です。
+ブリッジの設計には多くの[種類](https://li.fi/knowledge-hub/blockchain-bridges-and-classification/)がありますが、資産のクロスチェーン転送を可能にする方法として、以下の3つが際立っています。
-- **ロックとミント** - ソースチェーン上のアセットをロックした上で、宛先チェーン上でアセットをミントする方式。
-- **バーンとミント** - ソースチェーン上のトークンをバーンした上で、宛先チェーン上で新たにトークンをミントする方式。
-- **アトミックスワップ** - ソースチェーン上の資産と、他のユーザーの宛先チェーン上の資産を直接交換する方式。
+- **ロック・アンド・ミント –** ソースチェーンで資産をロックし、宛先チェーンで資産をミントします。
+- **バーン・アンド・ミント –** ソースチェーンで資産をバーンし、宛先チェーンで資産をミントします。
+- **アトミックスワップ –** 他の当事者と、ソースチェーン上の資産を宛先チェーン上の資産と交換します。
## ブリッジの種類 {#bridge-types}
ブリッジは通常、以下のカテゴリーに分類されます:
-- **ネイティブブリッジ** - 通常、特定のブロックチェーンにおいて流動性を自動供給するための構築されたブリッジであり、当該エコシステムに対する資金の転送を容易にするものです。 例えば、[ Arbitrumブリッジ](https://bridge.arbitrum.io/)は、イーサリアムからArbitrumへの資金転送を容易にするために開発されたブリッジです。 この種類のブリッジとしては、Polygon PoSブリッジや[Optimismゲートウェイ](https://app.optimism.io/bridge)等があります。
-- **バリデータ/オラクルベースのブリッジ** - クロスチェーン間の転送につき、外部のバリデータ群またはオラクルによる検証に依存するブリッジです。 MultichainやAcrossが含まれます。
-- **一般的なメッセージの受け渡しを伴うブリッジ** - チェーン間の資産転送につき、メッセージおよび任意のデータと共に実行するもの。 例: Axelar、LayerZero、Nomad。
-- **流動性ネットワーク** - 主に、アトミック・スワップによるチェーン間の資産転送に焦点をあてたブリッジです。 通常、この種類のブリッジはチェーン間のメッセージの受け渡しには対応しません。 ConextやHopが含まれます。
+- **ネイティブブリッジ –** 通常、特定のブロックチェーンの流動性をブートストラップするために構築され、ユーザーがエコシステムに資金を移動しやすくするためのブリッジです。 例えば、[Arbitrum Bridge](https://bridge.arbitrum.io/)は、ユーザーがイーサリアムメインネットからArbitrumにブリッジするのを便利にするために構築されています。 その他の同様のブリッジには、Polygon PoSブリッジ、[Optimism Gateway](https://app.optimism.io/bridge)などがあります。
+- **バリデータまたはオラクルベースのブリッジ –** これらのブリッジは、クロスチェーン転送を検証するために、外部のバリデータセットまたはオラクルに依存します。 MultichainやAcrossが含まれます。
+- **汎用メッセージパッシングブリッジ –** これらのブリッジは、資産だけでなく、メッセージや任意のデータもチェーン間で転送できます。 例: Axelar、LayerZero、Nomad。
+- **流動性ネットワーク –** これらのブリッジは、主にアトミックスワップを介して、あるチェーンから別のチェーンへ資産を転送することに焦点を当てています。 通常、この種類のブリッジはチェーン間のメッセージの受け渡しには対応しません。 ConextやHopが含まれます。
## 考慮すべきトレードオフ {#trade-offs}
どのブリッジも、完璧なソリューションとは言えません。 むしろ、各ブリッジは特定の目的を実現する一方で、トレードオフがあると考えるべきです。 デベロッパーおよびユーザーは、以下の特性に基づいて各ブリッジを評価するとよいでしょう:
-- **セキュリティ** - システムの検証を誰が担うか? 一般に、外部のバリデータによりセキュリティを保証するブリッジは、当該ブロックチェーンのバリデータがローカル/ネイティブにセキュリティを保証する場合よりもセキュリティが低くなります。
-- **利便性** - トランザクションの実行にかかる時間と、ユーザーが署名する必要があるトランザクションの数はどの程度か? デベロッパーにとっては、ブリッジを組み込むプロセスの時間や複雑さを検討する必要があります。
-- **接続性** - 様々な宛先チェーン(ロールアップ、サイドチェーン、他のL1ブロックチェーン等)にどれだけ接続でき、新規ブロックチェーンとの統合がどの程度難しいかについて検討が必要です。
-- **複雑なデータの伝達能力** - チェーン間におけるメッセージやより複雑な任意データの転送が可能か、あるいは、チェーン間の資産移転のみに対応しているかが問題になります。
-- **コスト効率** - ブリッジによるチェーン間の資産転送において、どの程度コストが発生するかです。 ブリッジは一般に、固定の手数料またはガス代および特定の転送レートの流動性に基づく変動料金を請求します。 さらに、セキュリティを確保するのにどれだけの手数料が必要になるかに基づき、特定のブリッジにおけるコスト効率を評価することが非常に重要です。
+- **セキュリティ –** システムの検証を誰が担うか? 一般に、外部のバリデータによりセキュリティを保証するブリッジは、当該ブロックチェーンのバリデータがローカル/ネイティブにセキュリティを保証する場合よりもセキュリティが低くなります。
+- **利便性 –** トランザクションの完了にかかる時間と、ユーザーが署名する必要があるトランザクションの数はどのくらいか? デベロッパーにとっては、ブリッジを組み込むプロセスの時間や複雑さを検討する必要があります。
+- **接続性 –** ブリッジが接続できる宛先チェーンの種類 (ロールアップ、サイドチェーン、他のレイヤー1ブロックチェーンなど) は何か、また新しいブロックチェーンを統合するのはどれくらい難しいか?
+- **より複雑なデータの転送能力 –** ブリッジは、メッセージやより複雑な任意のデータをチェーン間で転送できるか、それともクロスチェーンの資産転送のみをサポートしているか?
+- **コスト効率 –** ブリッジを介してチェーン間で資産を転送するのに、どれくらいのコストがかかるか? ブリッジは一般に、固定の手数料またはガス代および特定の転送レートの流動性に基づく変動料金を請求します。 さらに、セキュリティを確保するのにどれだけの手数料が必要になるかに基づき、特定のブリッジにおけるコスト効率を評価することが非常に重要です。
より大まかに見れば、ブリッジはトラステッドとトラストレスの2種類に分類できます。
-- **トラステッド** - トラステッドのブリッジとは、外部による検証に依存するブリッジです。 つまり、チェーン間のデータ送信につき、外部の検証者セット(マルチシグによるフェデレーション、マルチパーティの計算システム、オラクルネットワーク)が介在するブリッジを指します。 これにより、接続性に優れ、完全に汎用化されたメッセージをチェーン間でやりとりすることができます。 さらに、速度やコスト効率の面からも優れている場合が多いです。 ただし、ユーザーはブリッジ自体のセキュリティに依存するため、セキュリティが損なわれる可能性があります。
-- **トラストレス** - これらのブリッジは、接続するブロックチェーンならびに転送するメッセージやトークンに対するバリデータに依存しています。 これらのブリッジが「トラストレス」と呼ばれるのは、(ブロックチェーン自体で想定するものを除き)、新たな信頼想定を追加しないためです。 これにより、トラステッドのブリッジと比較してセキュリティが高いと評価されます。
+- **トラステッド –** トラステッドブリッジは外部で検証されます。 つまり、チェーン間のデータ送信につき、外部の検証者セット(マルチシグによるフェデレーション、マルチパーティの計算システム、オラクルネットワーク)が介在するブリッジを指します。 これにより、接続性に優れ、完全に汎用化されたメッセージをチェーン間でやりとりすることができます。 さらに、速度やコスト効率の面からも優れている場合が多いです。 ただし、ユーザーはブリッジ自体のセキュリティに依存するため、セキュリティが損なわれる可能性があります。
+- **トラストレス –** これらのブリッジは、接続しているブロックチェーンとそのバリデータに依存して、メッセージとトークンを転送します。 これらのブリッジが「トラストレス」と呼ばれるのは、(ブロックチェーン自体で想定するものを除き)、新たな信頼想定を追加しないためです。 これにより、トラステッドのブリッジと比較してセキュリティが高いと評価されます。
トラストレスのブリッジを他の要素で評価する場合、汎用型メッセージの受け渡しが可能なブリッジと、流動性ネットワークのブリッジに分けて考える必要があります。
-- **汎用型メッセージを受け渡すブリッジ** - この種類のブリッジは、チェーン間において、より複雑なデータを安全に転送するのに有用です。 また、多くの場合コスト効率性も優れています。 ただし、これらの強みを持つ一方で、ライトクライアントのブリッジ(例: IBC)に接続できない点や、オプティミスティック・ブリッジ(例: Nomad)の場合に速度が低下するなどの欠点があります。
-- **流動性ネットワーク** - この種類のブリッジは、アトミックスワップを用いて資産を転送するもので、ローカルで検証されるシステムです(つまり、トランザクションを検証するために、裏付けとなるブロックチェーンのバリデータを用います)。 このため、セキュリティと実行速度の両方が優れています。 さらに、コスト効率性や接続性も比較的優れていると考えられています。 ただし、チェーン間におけるメッセージの受け渡しが不可能であるため、より複雑なデータを扱えないという大きな欠点があります。
+- **汎用メッセージパッシングブリッジ –** これらのブリッジは、セキュリティと、より複雑なデータをチェーン間で転送する能力に優れています。 また、多くの場合コスト効率性も優れています。 ただし、これらの強みを持つ一方で、ライトクライアントのブリッジ(例: IBC)に接続できない点や、オプティミスティック・ブリッジ(例: Nomad)の場合に速度が低下するなどの欠点があります。
+- **流動性ネットワーク –** これらのブリッジは、資産の転送にアトミックスワップを使用し、ローカルで検証されるシステムです (つまり、トランザクションを検証するために基盤となるブロックチェーンのバリデータを使用します)。 このため、セキュリティと実行速度の両方が優れています。 さらに、コスト効率性や接続性も比較的優れていると考えられています。 ただし、チェーン間におけるメッセージの受け渡しが不可能であるため、より複雑なデータを扱えないという大きな欠点があります。
-## ブリッジに伴うリスク {#risk-with-bridges}
+## ブリッジのリスク {#risk-with-bridges}
-ブリッジは、[DeFiにおける最悪のハッキング事例](https://rekt.news/leaderboard/)上位3位における原因となっており、現在も開発途上の技術です。 ブリッジの利用は、以下のようなリスクを伴います:
+ブリッジは、[DeFiにおける最大のハッキング](https://rekt.news/leaderboard/)のトップ3を占めており、まだ開発の初期段階にあります。 ブリッジの利用は、以下のようなリスクを伴います:
-- **スマートコントラクトのリスク** - 多くのブリッジは監査に合格しているものの、スマートコントラクトに欠陥がひとつでも含まれていれば、資産に対するハッキング攻撃が可能になります(例: [Solanaのワームホールブリッジ](https://rekt.news/wormhole-rekt/))。
-- **システミックな財務リスク** - 多くのブリッジでは、原資産の正規バージョンを新規チェーンでミントするためにラップ資産を用います。 ラップされたトークンが悪用された事例はすでに発生しており、エコシステム全体にシステミックリスクをもたらします。
-- **カウンターパーティリスク** - 一部のブリッジでは、複数のバリデータが共謀してユーザーの資金を奪い取ろうと考えることはないという信頼の想定をユーザーに要求する、信頼ベースの設計を採用しています。 ユーザーは、これらのサードパーティアクターを信頼しなければならないため、ラグプル、検閲、およびその他の悪意の行為が発生するリスクにさらされています。
-- **未解決の問題** - 現在でもブリッジは開発の初期段階にあるため、様々な市場環境(ネットワーク混雑時や、ネットワーク全体への攻撃やステートのロールバックといった予見できないイベントの発生時)においてブリッジがどのように機能するかについては、未確認の事項が多く残っています。 この不確実性は様々なリスクをもたらすものですが、その影響の度合いはまだ不明です。
+- **スマートコントラクトのリスク –** 多くのブリッジは監査に合格していますが、スマートコントラクトに1つの欠陥があるだけで、資産がハッキングにさらされる可能性があります (例: [SolanaのWormholeブリッジ](https://rekt.news/wormhole-rekt/))。
+- **システミックな金融リスク** – 多くのブリッジは、新しいチェーンで元の資産のカノニカルバージョンをミントするために、ラップされた資産を使用します。 ラップされたトークンが悪用された事例はすでに発生しており、エコシステム全体にシステミックリスクをもたらします。
+- **カウンターパーティリスク –** 一部のブリッジは、バリデータが共謀してユーザーの資金を盗むことはないという仮定にユーザーが依存することを要求する、トラステッドな設計を利用しています。 ユーザーは、これらのサードパーティアクターを信頼しなければならないため、ラグプル、検閲、およびその他の悪意の行為が発生するリスクにさらされています。
+- **未解決の問題 –** ブリッジは開発の初期段階にあるため、ネットワークの混雑時や、ネットワークレベルの攻撃やステートのロールバックなどの予期せぬイベントの発生時といった、さまざまな市場状況でブリッジがどのように機能するかについては、多くの未解決の疑問があります。 この不確実性は様々なリスクをもたらすものですが、その影響の度合いはまだ不明です。
## Dappでブリッジを利用する方法 {#how-can-dapps-use-bridges}
以下では、デベロッパがブリッジを活用してDappのクロスチェーン化を検討する際の実践的な応用例について紹介します:
-### ブリッジとの統合 {#integrating-bridges}
+### ブリッジの統合 {#integrating-bridges}
開発中のDappをブリッジに対応させるには、多くの方法が存在します:
-1. **独自のブリッジを構築する** - 安全で信頼性が高いブリッジの開発は、特にトラストレスのアプローチを採用した場合、容易ではありません。 さらに、スケーラビリティや相互運用性に関する豊富な経験や技術的な知識が必要です。 また、ブリッジを管理し、実務上要求される十分な流動性を維持するためには常駐チームが必要です。
+1. **独自のブリッジを構築する –** 安全で信頼性の高いブリッジを構築するのは容易ではありません。特に、より信頼を最小化するアプローチをとる場合はなおさらです。 さらに、スケーラビリティや相互運用性に関する豊富な経験や技術的な知識が必要です。 また、ブリッジを管理し、実務上要求される十分な流動性を維持するためには常駐チームが必要です。
-2. **ユーザーが様々なブリッジから選択できるようにする** - 多くの[Dapp](/developers/docs/dapps/)では、ユーザーに対してネイティブトークンでのやりとりを要求しています。 ユーザーが所有するトークンを利用できるようにするために、Dappのウェブサイトでは様々なブリッジのオプションを提供しています。 しかしこの方法は、自社のDappのインターフェイスだけでプロセスを完結できず、他のDappやブリッジとのやりとりが必要になるため、その場しのぎの対策と言わざるを得ません。 また、ユーザーのオンボーディングが複雑になり、ミスが発生する可能性も高まります。
+2. **ユーザーに複数のブリッジオプションを提示する –** 多くの[dapps](/developers/docs/dapps/)では、それらと対話するためにユーザーがネイティブトークンを持っている必要があります。 ユーザーが所有するトークンを利用できるようにするために、Dappのウェブサイトでは様々なブリッジのオプションを提供しています。 しかしこの方法は、自社のDappのインターフェイスだけでプロセスを完結できず、他のDappやブリッジとのやりとりが必要になるため、その場しのぎの対策と言わざるを得ません。 また、ユーザーのオンボーディングが複雑になり、ミスが発生する可能性も高まります。
-3. **Dapp内にブリッジを組み込む** - このアプローチでは、ユーザーは外部のブリッジやDEXインターフェイスとやりとりする必要がなくなります。 このため、ユーザーのオンボーディング体験が向上します。 しかし、このアプローチにも以下のような制限があります:
+3. **ブリッジを統合する –** このソリューションでは、dappがユーザーを外部のブリッジやDEXインターフェイスに送る必要はありません。 このため、ユーザーのオンボーディング体験が向上します。 しかし、このアプローチにも以下のような制限があります:
- ブリッジに対する評価やメンテナンスは、手間や時間がかかる。
- ひとつのブリッジを選択することで、単一障害点や依存関係が発生する。
- 当該ブリッジの機能により、Dappのサービスが制限される。
- ブリッジだけでは対応できない機能が必要になる場合がある。 チェーン間のスワップなどの機能を追加するには、DEXを含める必要がある場合がある。
-4. **複数のブリッジを組み込む** - このアプローチは、ひとつのブリッジを統合する場合の多くの問題を解消できます。 一方で、複数のブリッジとの統合は多くのリソースを消費し、暗号資産の分野において最も希少性が高いリソースであるデベロッパーにとって、技術面およびコミュニケーション面での負担が増加してしまいます。
+4. **複数のブリッジを統合する –** このソリューションは、単一のブリッジの統合に関連する多くの問題を解決します。 一方で、複数のブリッジとの統合は多くのリソースを消費し、暗号資産の分野において最も希少性が高いリソースであるデベロッパーにとって、技術面およびコミュニケーション面での負担が増加してしまいます。
-5. **ブリッジアグリゲーターを導入する** - 複数のブリッジにアクセスできる、ブリッジアグリゲーションを活用するのもひとつの方法です。 ブリッジアグリゲーターはすべてのブリッジの強みを継承するため、各ブリッジが提供する機能のみに制限されなくなります。 特に、通常はブリッジアグリゲーターがDappとブリッジとの統合を管理するため、Dappのデベロッパー側はブリッジとの統合における技術的/運用的な側面を管理する作業から解放されます。
+5. **ブリッジアグリゲーターを統合する –** dappsのもう一つの選択肢は、複数のブリッジへのアクセスを提供するブリッジアグリゲーションソリューションを統合することです。 ブリッジアグリゲーターはすべてのブリッジの強みを継承するため、各ブリッジが提供する機能のみに制限されなくなります。 特に、通常はブリッジアグリゲーターがDappとブリッジとの統合を管理するため、Dappのデベロッパー側はブリッジとの統合における技術的/運用的な側面を管理する作業から解放されます。
ブリッジアグリゲーターは、このような利点を持つ一方で、欠点もあります。 例えば、より多くのブリッジを活用するオプションを提供することは事実ですが、特定のアグリゲーターのプラットフォームが提供するブリッジよりもさらに多くのブリッジが市場で提供されています。 さらに、ブリッジの場合と同じように、ブリッジアグリゲーターもスマートコントラクトやテクノロジーに由来するリスクにさらされています(対応するコントラクトが多くなれば、リスクも拡大します)。
Dappにブリッジやブリッジアグリゲーターを組み込む場合、統合の度合いに応じて様々なオプションが考えられます。 例えば、ユーザーにおけるオンボーディング体験の向上を目的とするフロントエンドのみの統合では、ウィジェットを搭載すればよいでしょう。 しかし、ステーキングやイールドファーミング等のより複雑なチェーン間のやりとりを実現するには、SDKやAPIを統合する必要があります。
-### 複数のチェーン上でDappをデプロイする {#deploying-a-dapp-on-multiple-chains}
+### 複数のチェーンにdappをデプロイする {#deploying-a-dapp-on-multiple-chains}
-To deploy a dapp on multiple chains, developers can use development platforms like [Alchemy](https://www.alchemy.com/), [Hardhat](https://hardhat.org/), [Moralis](https://moralis.io/), etc. 一般にこれらのプラットフォームには、Dappのクロスチェーン化を実現するコンポーザブルなプラグインが含まれています。 例えば、 [hardhat-deploy plugin](https://github.com/wighawag/hardhat-deploy)で提供される決定論的なデプロイ用プロキシを活用することができます。
+複数のチェーンにdappをデプロイするために、開発者は[Alchemy](https://www.alchemy.com/)、[Hardhat](https://hardhat.org/)、[Moralis](https://moralis.io/)などの開発プラットフォームを利用できます。 一般にこれらのプラットフォームには、Dappのクロスチェーン化を実現するコンポーザブルなプラグインが含まれています。 例えば、開発者は[hardhat-deployプラグイン](https://github.com/wighawag/hardhat-deploy)によって提供される決定論的デプロイメントプロキシを使用できます。
-#### 例:
+#### 例:
-- [クロスチェーン対応のDappを開発する方法](https://moralis.io/how-to-build-cross-chain-dapps/)
-- [クロスチェーン対応のNFTマーケットプレイスを開発する方法](https://youtu.be/WZWCzsB1xUE)
-- [Moralis: クロスチェーン対応のDAppsを開発する](https://www.youtube.com/watch?v=ehv70kE1QYo)
+- [クロスチェーンdappsの構築方法](https://moralis.io/how-to-build-cross-chain-dapps/)
+- [クロスチェーンNFTマーケットプレイスの構築](https://youtu.be/WZWCzsB1xUE)
+- [Moralis: クロスチェーンNFT dappsの構築](https://www.youtube.com/watch?v=ehv70kE1QYo)
-### コントラクトにおけるチェーン間のやりとりを監視する {#monitoring-contract-activity-across-chains}
+### チェーンをまたいだコントラクトアクティビティの監視 {#monitoring-contract-activity-across-chains}
-コントラクトにおけるチェーン間のやりとりを監視するには、サブグラフや、Tenderly等の開発プラットフォームを用いて、スマートコントラクトの状態をリアルタイムで観察することができます。 これらのプラットフォームにはさらに、[コントラクトが発行したイベント](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events)をチェックするなど、チェーン間のやりとりを対象としてより充実したデータ監視機能を実現できるツールが含まれています。
+コントラクトにおけるチェーン間のやりとりを監視するには、サブグラフや、Tenderly等の開発プラットフォームを用いて、スマートコントラクトの状態をリアルタイムで観察することができます。 このようなプラットフォームには、[コントラクトによって発行されたイベント](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events)のチェックなど、クロスチェーンアクティビティのためのより高度なデータ監視機能を提供するツールも含まれています。
#### ツール
- [The Graph](https://thegraph.com/en/)
- [Tenderly](https://tenderly.co/)
-## さらに学びたい方へ {#further-reading}
+## 参考リンク {#further-reading}
-- [ブロックチェーンにおけるブリッジ](/bridges/) - ethereum.org
-- [ブロックチェーンにおけるブリッジ: クリプトネットワークのネットワーク構築](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) 2021年9月8日、ドミトリー・ベレンゾン作成。
-- [相互運用性のトリレンマ](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) 2021年10月1日、アルジュン・ブプタニ作成。
-- [クラスタ: 信頼ベースおよび信頼最小化のブリッジは、マルチチェーン環境をどのように変化させるか](https://blog.celestia.org/clusters/) 2021年10月4日、ムスタファ・アル=バッサム作成。
-- [LI.FI: ブリッジの信頼依存度は様々に異なる](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) 2022年4月28日 、アルジュン・チャンド作成。
+- [ブロックチェーンブリッジ](/bridges/) – ethereum.org
+- [L2Beatブリッジリスクフレームワーク](https://l2beat.com/bridges/summary)
+- [ブロックチェーンブリッジ: 暗号ネットワークのネットワークを構築する](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) - 2021年9月8日 – Dmitriy Berenzon
+- [相互運用性のトリレンマ](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) - 2021年10月1日 – Arjun Bhuptani
+- [クラスター: トラステッドブリッジとトラストミニマイズドブリッジがマルチチェーンのランドスケープをどのように形成するか](https://blog.celestia.org/clusters/) - 2021年10月4日 – Mustafa Al-Bassam
+- [LI.FI: ブリッジにおいて、信頼はスペクトラムである](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) - 2022年4月28日 – Arjun Chand
+- [ロールアップの相互運用性ソリューションの現状](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) - 2024年6月20日 – Alex Hook
+- [安全なクロスチェーン相互運用性のための共有セキュリティの活用: ラグランジュステート委員会とその先](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) - 2024年6月12日 – Emmanuel Awosika
-ブリッジについてさらに理解を深めたい方は、 [ジェイムズ・プレストウィッチ](https://twitter.com/_prestwich)による洞察溢れる講演をご覧ください:
+さらに、ブリッジへの理解を深めるのに役立つ、[James Prestwich](https://twitter.com/_prestwich)による洞察に満ちたプレゼンテーションをいくつか紹介します。
-- [塀に囲まれたガーデンではなく、ブリッジを構築する](https://youtu.be/ZQJWMiX4hT0)
-- [ブリッジを破壊する](https://youtu.be/b0mC-ZqN8Oo)
-- [ブリッジはなぜ燃えているのか](https://youtu.be/c7cm2kd20j8)
+- [壁に囲まれた庭ではなく、ブリッジを築く](https://youtu.be/ZQJWMiX4hT0)
+- [ブリッジの徹底解説](https://youtu.be/b0mC-ZqN8Oo)
+- [なぜブリッジは燃えているのか](https://youtu.be/c7cm2kd20j8)
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/index.md
index 9c86bda817f..1c4de03f3c0 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/index.md
@@ -1,14 +1,14 @@
---
-title: 合意メカニズム
-description: 分散システムにおける合意形成プロトコルと、イーサリアムにおける合意形成プロトコルの役割についての解説
+title: "合意メカニズム"
+description: "分散システムにおける合意形成プロトコルと、イーサリアムにおける合意形成プロトコルの役割についての解説"
lang: ja
---
-合意メカニズムという用語は、「プルーフ・オブ・ステーク」、「プルーフ・オブ・ワーク」、「プルーフ・オブ・オーソリティ」といったプロトコルを指すのに使われることがあります。 しかし、これらはあくまで[シビル攻撃](/glossary/#sybil-attack)に対抗するための合意メカニズムの一部に過ぎません。 合意メカニズムは、分散された一連のノードがブロックチェーンの状態に合意できるようにする考え方、プロトコル、およびインセンティブを完全にまとめたメカニズムです。
+合意メカニズムという用語は、「プルーフ・オブ・ステーク」、「プルーフ・オブ・ワーク」、「プルーフ・オブ・オーソリティ」といったプロトコルを指すのに使われることがあります。 しかし、これらは[シビル攻撃](/glossary/#sybil-attack)を防ぐ合意メカニズムの構成要素に過ぎません。 合意メカニズムは、分散された一連のノードがブロックチェーンの状態に合意できるようにする考え方、プロトコル、およびインセンティブを完全にまとめたメカニズムです。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-このページの理解を深めるために、まずは[イーサリアム入門](/developers/docs/intro-to-ethereum/)を読むことをお勧めします。
+このページをより深く理解するために、まずは[イーサリアム入門](/developers/docs/intro-to-ethereum/)を読むことをお勧めします。
## コンセンサス(合意)とは {#what-is-consensus}
@@ -28,9 +28,9 @@ lang: ja
これらの構成要素が一体となって合意メカニズムを形成しています。
-## 合意形成アルゴリズムの種類 {#types-of-consensus-mechanisms}
+## 合意メカニズムの種類 {#types-of-consensus-mechanisms}
-### プルーフ・オブ・ワーク方式 {#proof-of-work}
+### プルーフ・オブ・ワークベース {#proof-of-work}
ビットコインと同様に、イーサリアムもかつては**プルーフ・オブ・ワーク(PoW)**に基づいたコンセンサスプロトコルを使用していました。
@@ -44,7 +44,7 @@ lang: ja
[プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow/)の詳細
-### プルーフ・オブ・ステーク方式 {#proof-of-stake}
+### プルーフ・オブ・ステークベース {#proof-of-stake}
イーサリアムは現在、**プルーフ・オブ・ステーク(PoS)**に基づいたコンセンサスプロトコルを使用しています。
@@ -56,7 +56,7 @@ lang: ja
仮にプルーフ・オブ・ステーク・システムでチェーンを支配しようとすると、攻撃者は大量のETHを破壊しなければならないため、暗号経済的に安全性が保たれています。 報酬システムがステーカーに対して、誠実な行動を取るようにインセンティブを与える一方、ペナルティは悪意のある行動を抑制しています。
-[プルーフ・オブ・ステーク ](/developers/docs/consensus-mechanisms/pos/)の詳細
+[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)の詳細
### ビジュアルガイド {#types-of-consensus-video}
@@ -68,21 +68,21 @@ lang: ja
プルーフ・オブ・ワークとプルーフ・オブ・ステークは、それ自体はコンセンサスプロトコルではありませんが、分かりやすくするためにそのように呼ばれることがよくあります。 これらは実際にはシビル耐性メカニズムであり、誰が最新のブロックを作成するかを決めるものです。 もう一つの重要なコンポーネントは、チェーン・チョイス(別名:フォーク選択)アルゴリズムです。これはチェーンの先頭に複数のブロックが存在する場合、正しいブロックをノードが1つ選択するアルゴリズムです。
-**シビル耐性**はシビル攻撃に対するプロトコルの性能を測るものです。 この種の攻撃への耐性は、分散型ブロックチェーンには不可欠であり、この耐性があることにより、投入されたリソースに応じてマイナーとバリデータが平等に報酬を得ることができます。 プルーフ・オブ・ワークやプルーフ・オブ・ステークは、ユーザーに多くのエネルギーを消費させたり、多くの担保を入れさせることで、この問題を解決します。 これらは、シビル攻撃に対する経済的な抑止力となります。
+**シビル耐性**は、プロトコルがシビル攻撃に対してどの程度有効かを測るものです。 この種の攻撃への耐性は、分散型ブロックチェーンには不可欠であり、この耐性があることにより、投入されたリソースに応じてマイナーとバリデータが平等に報酬を得ることができます。 プルーフ・オブ・ワークやプルーフ・オブ・ステークは、ユーザーに多くのエネルギーを消費させたり、多くの担保を入れさせることで、この問題を解決します。 これらは、シビル攻撃に対する経済的な抑止力となります。
-**チェーン・セレクション・ルール**は、どのチェーンが「正しい」チェーンであるかを決定するルールです。 イーサリアムとビットコインは、ブロックチェーンの長さが長い方を、他のノードが有効なものとして受け入れるという「最長のチェーン」ルールを採用しています。 プルーフ・オブ・ワークチェーンの場合、最長のチェーンはチェーンの累積プルーフ・オブ・ワーク難易度によって決定されます。 イーサリアムも以前は「最長チェーン」ルールを採用していましたが、現在のイーサリアムはプルーフ・オブ・ステークで実行されており、チェーンの「重み」を測定する最新のフォーク・チョイス・アルゴリズムを採用しています。 この重みは、バリデータの投票の累計をバリデータがステーキングしたイーサ残高により加重されて決まります。
+**チェーン選択ルール**は、どのチェーンが「正しい」チェーンであるかを決定するために使用されます。 イーサリアムとビットコインは、ブロックチェーンの長さが長い方を、他のノードが有効なものとして受け入れるという「最長のチェーン」ルールを採用しています。 プルーフ・オブ・ワークチェーンの場合、最長のチェーンはチェーンの累積プルーフ・オブ・ワーク難易度によって決定されます。 イーサリアムも以前は「最長チェーン」ルールを採用していました。しかし、現在のイーサリアムはプルーフ・オブ・ステークで実行されており、チェーンの「重み」を測定する最新のフォーク選択アルゴリズムを採用しています。 この重みは、バリデータの投票の累計をバリデータがステーキングしたイーサ残高により加重されて決まります。
-イーサリアムでは、[Casper FFGプルーフ・オブ・ステーク](https://arxiv.org/abs/1710.09437)と[GHOSTフォーク・チョイスルール](https://arxiv.org/abs/2003.03052)を組み合わせた[Gasper](/developers/docs/consensus-mechanisms/pos/gasper/)と呼ばれる合意メカニズムが採用されています。
+イーサリアムは、[Casper FFG プルーフ・オブ・ステーク](https://arxiv.org/abs/1710.09437)と[GHOSTフォークチョイスルール](https://arxiv.org/abs/2003.03052)を組み合わせた、[Gasper](/developers/docs/consensus-mechanisms/pos/gasper/)として知られる合意メカニズムを使用しています。
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [ブロックチェーンの合意アルゴリズムとは](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm)
-- [ナカモトコンセンサスとは 初心者向け完全ガイド](https://blockonomi.com/nakamoto-consensus/)
-- [Casperの仕組み](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d)
-- [プルーフ・オブ・ワーク・ブロックチェーンのセキュリティと性能について](https://eprint.iacr.org/2016/555.pdf)
+- [ブロックチェーンのコンセンサスアルゴリズムとは?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm)
+- [ナカモトコンセンサスとは? 完全初心者向けガイド](https://blockonomi.com/nakamoto-consensus/)
+- [Casperはどのように機能するのか?](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d)
+- [プルーフ・オブ・ワーク・ブロックチェーンのセキュリティとパフォーマンスについて](https://eprint.iacr.org/2016/555.pdf)
- [ビザンチン障害](https://en.wikipedia.org/wiki/Byzantine_fault)
-_役に立つコミュニティリソースをご存知の場合は、 ページを編集して追加してください。_
+_役に立つコミュニティリソースを知っていますか? Edit this page and add it!_
## 関連トピック {#related-topics}
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/poa/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/poa/index.md
index 964fa0274fc..c5d372b4101 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/poa/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/poa/index.md
@@ -1,12 +1,12 @@
---
-title: プルーフ・オブ・オーソリティ(PoA)
-description: ブロックチェーンエコシステムにおけるプルーフ・オブ・オーソリティのコンセンサスプロトコルとその役割について
+title: "プルーフ・オブ・オーソリティ(PoA)"
+description: "ブロックチェーンエコシステムにおけるプルーフ・オブ・オーソリティのコンセンサスプロトコルとその役割について"
lang: ja
---
**プルーフ・オブ・オーソリティ(PoA)** は、評判ベースのコンセンサスアルゴリズムで[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)を変更したバージョンです。 主にプライベートチェーン、テストネット、ローカル開発用ネットワークで使われています。 評判ベースのコンセンサスアルゴリズムであるプルーフ・オブ・オーソリティは、ブロックを生成するために、認証された署名者達のセットを信頼することを求めます。この点でステーキングベースのメカニズムであるプルーフ・オブ・ステークと違います。
-## 前提条件{#prerequisites}
+## 前提条件 {#prerequisites}
このページについて深く理解するには、事前に[トランザクション](/developers/docs/transactions/)、[ブロック](/developers/docs/blocks/)、[コンセンサスメカニズム](/developers/docs/consensus-mechanisms/)について読むことをお勧めします。
@@ -18,7 +18,7 @@ lang: ja
プルーフ・オブ・オーソリティには、複数の実装がありますが、イーサリアムの実装の標準は、**Clique**です。これは、[EIP-225](https://eips.ethereum.org/EIPS/eip-225)を実装しています。 Cliqueは、デベロッパーフレンドリーで、簡単に実装できる標準であり、クライアントの同期タイプのすべてをサポートしています。 他の実装としては、[IBFT 2.0](https://besu.hyperledger.org/private-networks/concepts/poa) や[Aura](https://openethereum.github.io/Chain-specification)などがあります。
-## 仕組みの説明{#how-it-works}
+## 仕組みの説明 {#how-it-works}
プルーフ・オブ・オーソリティでは、新しいブロックを作るために、認証された署名者達のセットが選ばれます。 署名者達は、評判ベースで選ばれ、これらの署名者達のみが新しいブロックを作成することを許されます。 ラウンドロビン方式で署名者達が選ばれます。選ばれた各署名者は、特定の時間枠内でブロックを作成することが許されます。 このブロック作成時間は固定されており、署名者達は時間枠内にブロックを作成しなければなりません。
@@ -28,36 +28,36 @@ lang: ja
小さなフォークが起こる状況があり得えます。ブロックの難易度は、署名が順序か順序外かによって違います。 「順序」のブロックの難易度は2、「順序外」のブロックの難易度は1です。 小さなフォークが発生した場合、「順序」ブロックにシールした多数の署名者を持つチェーンに最も多い難易度が累積し、勝利します。
-## 攻撃ベクトル{#attack-vectors}
+## 攻撃ベクトル {#attack-vectors}
-### 悪意のある署名者達{#malicious-signers}
+### 悪意のある署名者達 {#malicious-signers}
署名者リストに悪意のあるユーザーが追加されたり、署名鍵およびマシンが侵害されたりする可能性があります。 このようなシナリオにおいて、プロトコルには、再編成やスパムに対して防御する能力が必要になります。 提案された解決策では、N人の認証された署名者のリストが与えられた場合、各署名者はK回ごとに1つのブロックしかミントできません。これにより、被害が限定され、残りのバリデータが悪意のあるユーザーを排除するための投票を行うことが可能になります。
-### 検閲{#censorship-attack}
+### 検閲 {#censorship-attack}
もう1つの興味深い攻撃ベクトルは、署名者(あるいは署名者のグループ)が、認証者リストからそれらの署名者を削除することに投票したブロックを検閲しようとする場合です。 これに対処する方法は、署名者に許可されるミントの頻度をN/2の中から1に制限することです。 これにより、悪意のある署名者達は、署名するアカウントの最低51%をコントロールする必要があります。51%に達すれば、チェーンの新たな信頼できる情報源になることができます。
-### スパム{#spam-attack}
+### スパム {#spam-attack}
他の小さな攻撃ベクトルは、悪意のある署名者達がミントする各ブロック内において新たな投票提案をすることです。 ノードは、実際の認証された署名者のリストを作成するために、投票のすべてを集計する必要があるため、常に投票のすべてを記録しなければなりません。 投票枠に制限を設けないと、投票はゆっくりと、しかし無制限に増える可能性があります。 これに対する解決策は、Wブロックの _移動_ 枠を設けて、そのWブロック後の投票が古いと見なすことです。 _妥当な枠は1~2エポックでしょう。_
-### 同時発生ブロック{#concurrent-blocks}
+### 同時発生ブロック {#concurrent-blocks}
PoAネットワークでは、N人の認証された署名者がいる場合、各署名者はK回ごとに1つのブロックをミントすることが許可されています。つまり、任意の時点でN-K+1人のバリデータがブロックをミントできることになります。 これらのバリデーターがブロックを競って生成するのを防ぐために、各署名者は新しいブロックをリリースする時間に小さなランダムな「オフセット」を追加する必要があります。 このプロセスにより、小規模なフォークが発生する可能性は低くなりますが、それでも時折フォークが発生することがあります。これはメインネットと同様です。 署名者が権限を悪用したり混乱を引き起こしたりした場合、他の署名者達は投票により排除することができます。
例えば、10人の認証された署名者がいて、各署名者が20回ごとに1つのブロックを作成できる場合、任意の時点で11人のバリデータがブロックを作成できることになります。 マイナー同士のブロック作成の競争を防ぐために、各署名者は
新しいブロックをリリースする時間に、小さなランダムな「オフセット」を追加します。 これにより、小さなフォークの発生を減らすことが出来ますが、イーサリアムのメインネットで見られるように、場合によってはフォークが発生する可能性があります。 署名者が権限を悪用したり、混乱を引き起こした場合、投票によりネットワークから排除することができます。
-## メリットとデメリット{#pros-and-cons}
+## メリットとデメリット {#pros-and-cons}
-| メリット | デメリット |
+| 長所 | 短所 |
| ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------- |
| ブロック署名者の数を制限することをベースとしているため、他の一般的なメカニズムであるプルーフ・オブ・ステークやプルーフ・オブ・ワークなどよりもスケーラブル。 | プルーフ・オブ・オーソリティのネットワークでは、検証ノードの数が比較的少ない。 これにより、プルーフ・オブ・オーソリティのネットワークは、より集中化する。 |
| プルーフ・オブ・オーソリティは、実行と維持が安価。 | ブロックチェーンは評判の確立したエンティティを要求するため、一般的な人は通常、認証された署名者になることができない。 |
| トランザクションの承認が非常に速い。新しいブロックの検証に必要な署名者の数が限られているため、1秒未満で達成可能。 | 悪意のある署名者達が、ネットワークにおいて再編成、二重支払い、トランザクションの検閲をする可能性がある。これらの攻撃を軽減することはできるが、完全に防止はできない。 |
-## 参考リンク{#further-reading}
+## 参考リンク {#further-reading}
- [EIP-225](https://eips.ethereum.org/EIPS/eip-225) _Clique標準_
- [プルーフ・オブ・オーソリティの研究](https://github.com/cryptoeconomics-study/website/blob/master/docs/sync/2.4-lecture.md) _Cryptoeconomics_
@@ -74,7 +74,8 @@ PoAネットワークでは、N人の認証された署名者がいる場合、
-## 関連トピック{#related-topics}
+## 関連トピック {#related-topics}
- [プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow/)
- [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)
+
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md
index 6674abbc459..25f756ed887 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md
@@ -1,12 +1,12 @@
---
-title: イーサリアムのプルーフ・オブ・ステークにおける攻撃および防御
-description: イーサリアムのプルーフ・オブ・ステークに対する既知の攻撃ベクトルについて知り、防御方法について学ぶ
+title: "イーサリアムのプルーフ・オブ・ステークにおける攻撃および防御"
+description: "イーサリアムのプルーフ・オブ・ステークに対する既知の攻撃ベクトルについて知り、防御方法について学ぶ"
lang: ja
---
イーサリアムのクライアントソフトウェアは、常に窃盗や破壊行為の脅威にさらされています。 このページでは、イーサリアムのコンセンサスレイヤーに対する既知の攻撃ベクトルについて概説し、これらの攻撃をどのように防ぐべきかについて説明します。 このページの内容は、[こちらの長文バージョン](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs)を要約したものです。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)の基本的な知識が必要です。 また、イーサリアムの[インセンティブレイヤー](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties)とフォーク選択アルゴリズム、[LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper)について基礎的に理解しておくとよいでしょう。
@@ -14,7 +14,7 @@ lang: ja
イーサリアムに対する攻撃については、攻撃が成功した場合に新規のイーサを生成したり、ランダムに選んだアカウントからイーサを盗み取ることが可能だ、と誤解している人が多いです。 実際にはこれらは不可能です。なぜなら、イーサリアムにおけるすべてのトランザクションは、イーサリアム・ネットワークに含まれるすべての実行クライアントにより実行されるからです。 トランザクションが有効であるためには基本的な条件を満たす必要があり(送信者の秘密鍵を使って署名されており、送信者の残高が十分であるなど)、これらの条件を満たさない場合には、トランザクションを実行する前の状態に復元されます。 このため、攻撃者が現実的に望みうるのは、再編成、二重ファイナリティ、またはファイナリティの遅延という3つの結果だけです。
-**「再編成」**とは、ブロックの順番が変更されるようにシャッフルすることであり、正規チェーンに新たなブロックを追加したり、既存のブロックが削除される場合が多いです。 悪意に基づく再編成は特定のブロックを追加/削除することを目的とする場合があり、トランザクションをフロントランニング/バックランニングすることで、二重支出や価値の抜き取りが可能になります。 再編成はまた、特定のトランザクションが正規チェーンに追加されないようにするために用いられる場合もあり、これは一種の検閲を目指すものだと言えます。 再編成攻撃のうち最も極端なものは「ファイナリティの取消」であり、すでにファイナライズされたブロックを除去/置換するものです。 この攻撃では、攻撃者はステーキングされたイーサの合計のうち3分の1以上を破壊しなければなりません。この保証を「経済的なファイナリティ」と呼びますが、詳細については以下で説明します。
+「再編成」とは、ブロックの順番が変更されるようにシャッフルすることであり、正規チェーンに新たなブロックを追加したり、既存のブロックが削除される場合が多いです。 悪意に基づく再編成は特定のブロックを追加/削除することを目的とする場合があり、トランザクションをフロントランニング/バックランニングすることで、二重支出や価値の抜き取りが可能になります。 再編成はまた、特定のトランザクションが正規チェーンに追加されないようにするために用いられる場合もあり、これは一種の検閲を目指すものだと言えます。 再編成攻撃のうち最も極端なものは「ファイナリティの取消」であり、すでにファイナライズされたブロックを除去/置換するものです。 この攻撃では、攻撃者はステーキングされたイーサの合計のうち3分の1以上を破壊しなければなりません。この保証を「経済的なファイナリティ」と呼びますが、詳細については以下で説明します。
**二重ファイナリティ**とは、2つのフォークが同時にファイナライズ可能な状態に置かれ、チェーンに永続的な亀裂が生じるもので、発生確率は低いですが非常に深刻な状況だと言えます。 理論的には、攻撃者がステーキングされたETH全体の34%を失っても構わないと考える場合にこの状態が発生可能になります。 ユーザーコミュニティは、オフチェーンでの議論を通じてどのチェーンに従うかを決定することを迫られますので、ソーシャルレイヤーの強じんさが求められます。
@@ -22,7 +22,7 @@ lang: ja
ソーシャルレイヤーに対する攻撃は、イーサリアムに対する世間の信頼を毀損するため、イーサの価値や利用度を引き下げるため、あるいは、イーサリアム・コミュニティを弱体化させることにより、帯域外の連携を妨害することを目的とするかもしれません。
-以上が、攻撃者がイーサリアムを攻撃する理由として考えられるものです。以下のセクションでは、これらの攻撃を_どのように実行するか_について検討します。
+以上が、攻撃者がイーサリアムを攻撃する理由として考えられるものです。以下のセクションでは、これらの攻撃を _どのように_ 実行するかについて検討します。
## さまざまな攻撃手段 {#methods-of-attack}
@@ -31,10 +31,13 @@ lang: ja
まず、イーサリアム・ネットワークへの積極的な関与(クライアント・ソフトウェアを実行すること)を行わない攻撃者は、ソーシャルレイヤー(レイヤー0)を標的とする攻撃を行う可能性があります。 レイヤー0は、イーサリアム・ネットワークを構築するための土台であり、攻撃対象となった場合はその影響がスタックの他の部分に波及しかねません。 具体的には、以下のような攻撃が考えられます:
- 虚偽情報を流布するキャンペーンを行うことで、ユーザーコミュニティにおけるイーサリアムのロードマップ、開発者チーム、アプリ等に対する信頼を失わせる攻撃。 この攻撃は、イーサリアム・ネットワークのセキュリティを維持するために参加するユーザーの数を減少させることで、分散化および暗号経済的なセキュリティを低下させる意図を持ちます。
+
- 開発者コミュニティに対する標的を絞った攻撃および/または脅迫。 この攻撃により、開発者が自発的にコミュニティから退去し、イーサリアムの開発速度が遅れる可能性があります。
- 必要以上に規制を厳しくすることも、イーサリアムへの参加者数や利用度を大きく引き下げる可能性を持つため、レイヤー0に対する攻撃と見なすことが可能です。
+
- 関連知識を持つ悪意のアクターが開発者コミュニティに侵入する場合。ここでの目的は、些末な議論を繰り広げたり、重要な判断を遅らせたり、スパムを送信するなどの方法により、イーサリアムの開発を遅らせることです。
+
- イーサリアムのエコシステムに含まれるキープレイヤーに対して賄賂を提供して、意思決定に影響を及ぼそうとする行為。
これらの攻撃がとりわけ危険な理由は、ごくわずかな資本あるいは技術的ノウハウしか持たない者でも実行が可能である場合が多いためです。 レイヤー0攻撃は、暗号経済的な攻撃の被害をさらに拡大する可能性があります。 例えば、悪意のある多数派のステークホルダーにより検閲やファイナリティの撤回が達成された場合、ソーシャルレイヤーが弱体化していれば、帯域外においてユーザーコミュニティ全体が団結して対応することが難しくなるかもしれません。
@@ -55,9 +58,9 @@ lang: ja
#### 再編成 {#reorgs}
-ステーキングされたイーサ全体のごく一部を用いて、チェーンの再編成またはファイナリティの遅延を実行するという攻撃については、すでにいくつかのペーパーにより詳説されています。 これらの攻撃は通常、攻撃者以外のバリデータに対して一部の情報を秘匿しておき、特定のニュアンスを持つ方法で、および/または攻撃者にとって有利な時点で、その情報を公開するという手段を用います。 攻撃者は通常、一部の誠実なブロック(複数の場合あり)を正規チェーンから削除することを目的とします。 [ノイダー他(2020年)](https://arxiv.org/pdf/2102.02247.pdf)の論文では、攻撃者であるバリデータが特定のスロット `n+1` に対してブロック(`B`) を作成し、アテステーションを実行しつつ、ネットワークの他のノードへの送信を控える方法について説明しています。 攻撃者は、アテステーションを実行したブロックを次のスロット(`n+2`まで公開せずに残しておきます。 誠実なバリデータは、あるブロック(`C`)を`n+2`スロットに提案します。 攻撃者は、これとほぼ同時に、秘匿していたブロック(`B`)およびこれに対するアテステーションをリリースし、さらに、十分な投票権と共にスロット`n+2`におけるチェーンの先頭が`B`であるというアテステーションを実行することで、誠実なブロック`C`の存在を事実上否定することができます。 誠実なブロック `D` がリリースされると、フォーク選択アルゴリズムにより、ブロック`B`上で構築された`D`の方が、ブロック`C`上で構築されたブロック`D`よりも重みが大きいと判断します。 つまり攻撃者は、1つ後のブロックにおけるチェーンの再編成により、スロット`n+2`における誠実なブロック`C`を正規チェーンから削除することが可能になるのです。 [攻撃者がステーク全体の34%を保有する場合](https://www.youtube.com/watch?v=6vzXwwk12ZE)、[この注記](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair)で述べられているように、この攻撃が成功する可能性は非常に高いと言えます。 さらに、理論的にはより少ない割合のステークでもこの攻撃を試みることが可能です。 [ノイダー他(2020年)](https://arxiv.org/pdf/2102.02247.pdf)では、この攻撃は30%ステークでも可能だと述べていますが、その後の研究により、[ステーク全体のわずか2%](https://arxiv.org/pdf/2009.04987.pdf)を保有するだけでこの攻撃が可能であると判明しました。この場合、[単独のバリデータ](https://arxiv.org/abs/2110.10086#)によるバランシングのテクニックが用いられますが、これについては以下のセクションで検証します。
+ステーキングされたイーサ全体のごく一部を用いて、チェーンの再編成またはファイナリティの遅延を実行するという攻撃については、すでにいくつかの論文により詳説されています。 これらの攻撃は通常、攻撃者以外のバリデータに対して一部の情報を秘匿しておき、特定のニュアンスを持つ方法で、および/または攻撃者にとって有利な時点で、その情報を公開するという手段を用います。 攻撃者は通常、一部の誠実なブロック(複数の場合あり)を正規チェーンから削除することを目的とします。 [ノイダー他(2020年)の論文](https://arxiv.org/pdf/2102.02247.pdf)では、攻撃者であるバリデータが特定のスロット `n+1` に対してブロック(`B`) を作成し、アテステーションを実行しつつ、ネットワークの他のノードへの送信を控える方法について説明しています。 攻撃者は、アテステーションを実行したブロックを次のスロット(`n+2`まで公開せずに残しておきます。 誠実なバリデータは、あるブロック(`C`)を`n+2`スロットに提案します。 攻撃者は、これとほぼ同時に、秘匿していたブロック(`B`)およびこれに対するアテステーションをリリースし、さらに、十分な投票権と共にスロット`n+2`におけるチェーンの先頭が`B`であるというアテステーションを実行することで、誠実なブロック`C`の存在を事実上否定することができます。 誠実なブロック`D`がリリースされると、フォーク選択アルゴリズムにより、ブロック`B`上で構築された`D`の方が、ブロック`C`上で構築されたブロック`D`よりも重みが大きいと判断します。 つまり攻撃者は、1つ後のブロックにおけるチェーンの再編成により、スロット`n+2`における誠実なブロック`C`を正規チェーンから削除することが可能になるのです。 [攻撃者がステーク全体の34%を保有する場合](https://www.youtube.com/watch?v=6vzXwwk12ZE) 、[この注記](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair)で述べられているように、この攻撃が成功する可能性は非常に高いと言えます。 さらに、理論的にはより少ない割合のステークでもこの攻撃を試みることが可能です。 [ノイダー他(2020年)](https://arxiv.org/pdf/2102.02247.pdf)では、この攻撃は30%ステークでも可能だと述べていますが、その後の研究により、[ステーク全体のわずか2%](https://arxiv.org/pdf/2009.04987.pdf)を保有するだけでこの攻撃が可能であると判明しました。この場合、[単独のバリデータ](https://arxiv.org/abs/2110.10086#) によるバランシングのテクニックが用いられますが、これについては以下のセクションで検証します。
-
+
上記の1ブロック後の再編成攻撃の概念図 (https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair を修正)
@@ -67,7 +70,7 @@ lang: ja
-バランシング攻撃およびバウンス攻撃のいずれも、ネットワークにおけるメッセージ送信のタイミングを攻撃者が非常に細かく制御できなければならず、実際に発生する可能性は高くありません。 攻撃の可能性は低いものの、これらの攻撃に対する防御手段として、プロトコルにおいては迅速なメッセージがよりメッセージよりも重みが大きくなるように設定されています。 これは、[提案者重みブースティング](https://github.com/ethereum/consensus-specs/pull/2730)と呼ばれています。 また、バウンス攻撃を回避するため、正当化された最新のチェックポイントを代替のチェーンに切り替えできる時期が[エポック全体の前半3分の1のスロット](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114)のみとなるようにフォーク選択アルゴリズムが修正されました。 この条件により、攻撃者が後で投票するための投票権を蓄積することが不可能になりました。フォーク選択アルゴリズムは、大部分の誠実なバリデータが投票するであろう各エポックの前半3分の1の時間内において選択されたチェックポイントをそのまま選択し続けるからです。
+バランシング攻撃およびバウンス攻撃のいずれも、ネットワークにおけるメッセージ送信のタイミングを攻撃者が非常に細かく制御できなければならず、実際に発生する可能性は高くありません。 攻撃の可能性は低いものの、これらの攻撃に対する防御手段として、プロトコルにおいては迅速なメッセージがよりメッセージよりも重みが大きくなるように設定されています。 これは、[提案者加重ブースティング](https://github.com/ethereum/consensus-specs/pull/2730)と呼ばれています。 また、バウンス攻撃を回避するため、正当化された最新のチェックポイントを代替のチェーンに切り替えできる時期が[エポック全体の前半3分の1のスロット](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114)のみとなるようにフォーク選択アルゴリズムが修正されました。 この条件により、攻撃者が後で投票するための投票権を蓄積することが不可能になりました。フォーク選択アルゴリズムは、大部分の誠実なバリデータが投票するであろう各エポックの前半3分の1の時間内において選択されたチェックポイントをそのまま選択し続けるからです。
これらの対策を組み合わせた場合、誠実なブロック提案者が各スロットの開始時点でただちにブロックを送信するが、スロットの前半3分の1(4秒間)においては、新規ブロックの生成によりフォーク選択アルゴリズムを通じて他のチェーンへの切り替えが可能な状態が発生するというシナリオが想定されます。 この締切時間が到来した後は、作業が遅いバリデータから送信されたアテステーションは、作業が早いバリデータからのアテステーションよりも重みが小さくなるのです。 これにより、チェーンの先頭を決定する作業において迅速に行動した提案者およびバリデータが有利になるため、バランシング攻撃やバウンス攻撃が成功する確率を大きく引き下げることができます。
@@ -81,23 +84,23 @@ lang: ja
アバランチ攻撃の脅威は、LMD-GHOSTというフォーク選択アルゴリズムのLMDによって軽減されます。 LMDとは、「最新メッセージ主導型」を意味し、各バリデータが維持し、他のバリデータから受信する最新のメッセージが含まれている表を指しています。 このフィールドが更新されるのは、各バリデータの表においてすでに記入済みであるスロットよりも後のスロットにおいて新規メッセージを受信した場合のみです。 これにより、実際には各スロットにおいて最初に受信されたメッセージが認証され、その後のすべてのメッセージは曖昧化をもたらすものとして却下されます。 つまり、コンセンサス・クライアントは曖昧化をもたらすメッセージを考慮せず、各バリデータから最初に受信したメッセージのみを採用し、その後の曖昧化させるメッセージは単に無視されるため、アバランチ攻撃が不可能になります。
-提案者の重み追加が提供するセキュリティをさらに強めるために、フォーク選択ルールに対しては今後もいくつかのアップデート案が検討されています。 そのうちの1つが [ビュー・マージ](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739)であり、アテステーションを行うユーザーは、各自のフォーク選択のビューが当該スロットが開始される`n`秒前にフリーズされるため、提案者はネットワーク全体にわたるチェーンビューを同期しやすくなります。 もう1つのアップグレード案は、 [シングルスロット・ファイナリティ](https://notes.ethereum.org/@vbuterin/single_slot_finality)であり、1スロット後にチェーンをファイナライズすることにより、メッセージを送信するタイミングに基づいた攻撃を回避するというものです。
+提案者の重み追加が提供するセキュリティをさらに強めるために、フォーク選択ルールに対しては今後もいくつかのアップデート案が検討されています。 そのうちの1つが[ビュー・マージ](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739)であり、アテステーションを行うユーザーは、各自のフォーク選択のビューが当該スロットが開始されるn秒前にフリーズされるため、提案者はネットワーク全体にわたるチェーンビューを同期しやすくなります。 もう1つのアップグレード案は、 [シングルスロット・ファイナリティ](https://notes.ethereum.org/@vbuterin/single_slot_finality)であり、1スロット後にチェーンをファイナライズすることにより、メッセージを送信するタイミングに基づいた攻撃を回避するというものです。
#### ファイナリティ遅延 {#finality-delay}
-低コストで単一ブロックを対象とする再編成攻撃について説明したのと[同じ論文](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf)では、さらに、攻撃者がエポックの境界となるブロックの提案者となることで実行可能になるファイナリティ遅延(「生存性障害」とも呼ばれます)攻撃についても説明されています。 この攻撃が非常に重要であるのは、エポック境界ブロックはキャスパーFFGがチェーンの各部分をファイナライズするために参照するチェックポイントになるためです。 攻撃者は、ひとつ前のエポック境界ブロックを現在のファイナライズ対象にすることを支持する誠実なバリデータによる投票が十分に集まるまで、自分のブロックを保留するだけでよいのです。 攻撃者はその上で、保留してきたブロックをリリースします。 彼らは自らのブロックに対するアテステーションを実行し、攻撃者以外の誠実なバリデータも同様に実行するので、ターゲットのチェックポイントが異なる複数のフォークが作成されてしまうのです。 適切なタイミングで実行された場合、いずれのフォークに対するアテステーションにおいても3分の2のスーパーマジョリティを得られないため、ファイナリティを実現できなくなります。 この場合、ステークの規模が小さければ小さいほど、攻撃が成功する実行のタイミングが狭まります。と言うのも、攻撃者が直接支配するアテステーションの数がより少なくなり、特定のエポック境界ブロックを提案するバリデータを攻撃者が支配する可能性が低くなるからです。
+低コストで単一ブロックを対象とする再編成攻撃について説明したのと[同じ論文](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf) では、さらに、攻撃者がエポックの境界となるブロックの提案者となることで実行可能になるファイナリティ遅延(「生存性障害」とも呼ばれます)攻撃についても説明されています。 この攻撃が非常に重要であるのは、エポック境界ブロックはキャスパーFFGがチェーンの各部分をファイナライズするために参照するチェックポイントになるためです。 攻撃者は、ひとつ前のエポック境界ブロックを現在のファイナライズ対象にすることを支持する誠実なバリデータによる投票が十分に集まるまで、自分のブロックを保留するだけでよいのです。 攻撃者はその上で、保留してきたブロックをリリースします。 彼らは自らのブロックに対するアテステーションを実行し、攻撃者以外の誠実なバリデータも同様に実行するので、ターゲットのチェックポイントが異なる複数のフォークが作成されてしまうのです。 適切なタイミングで実行された場合、いずれのフォークに対するアテステーションにおいても3分の2のスーパーマジョリティを得られないため、ファイナリティを実現できなくなります。 この場合、ステークの規模が小さければ小さいほど、攻撃が成功する実行のタイミングが狭まります。と言うのも、攻撃者が直接支配するアテステーションの数がより少なくなり、特定のエポック境界ブロックを提案するバリデータを攻撃者が支配する可能性が低くなるからです。
#### ロングレンジ攻撃 {#long-range-attacks}
プルーフ・オブ・ステークを採用したブロックチェーン特有のもう一つの攻撃カテゴリーとして、ジェネシスブロックの作成に関与したバリデータが誠実なチェーンとは異なる別途のフォークを維持し、最終的に誠実なバリデータ群に対し、かなりの時間を経た適当なタイミングで代替フォークに移行するように説得するという手法があります。 イーサリアムにおいては、ファイナリティ・ガジェットによりすべてのバリデータが誠実なチェーンについて定期的な感覚(「チェックポイント」)において同意する必要があるため、この種の攻撃は実行できません。 このシンプルなメカニズムによりイーサリアムのクライアントにおいてはファイナライズされたブロックの再編成が不可能であり、ロングレンジ攻撃は無効化されます。 イーサリアム・ネットワークに新たに参加するノードは、信頼できる最新状態のハッシュ(「[弱い主観性](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/)チェックポイント」)を見つけ、このチェックポイントを疑似的なジェネシスブロックとして、その上に新たなブロックを作成します。 この方法により、新たにネットワークに参加するノードに対して「信頼性ゲートウェイ」が提供され、ノード自身が情報を検証できるようになります。
-#### サービス拒否 (DOS) {#denial-of-service}
+#### サービス拒否 (DOS) {#denial-of-service}
-イーサリアムにおけるプルーフ・オブ・ステークのメカニズムでは、すべてのバリデータの中から、各スロットにおけるブロック提案者として1名のバリデータを選出します。 この選出は公開された関数を用いて計算できるため、攻撃者は、ブロック提案のタイミングをわずかに先立つ時点で次のブロック提案者を特定することが可能です。 攻撃者はこの情報を得ることで、次のブロック提案者にスパムを送信し、他のピアとの情報交換を妨げることができます。 ネットワークの他のユーザーにとっては、次のブロック提案者がオフラインになり、スロットは空のままであるように見えます。 これは、特定のバリデータを対象とする一種の検閲として機能させることができ、それらのユーザーがブロックチェーンに情報を追加するのを妨害することが可能です。 単独非公開リーダー選挙(SSLE)あるいは非単独非公開リーダー選挙を実施する場合、当該のブロック提案者自身のみが提案者に選出されたことを知ることができ、選出を事前に知ることが不可能になるため、DoSリスクを軽減することができます。 このようなメカニズムはまだ実装されていませんが、積極的な[研究開発](https://ethresear.ch/t/secret-non-single-leader-election/11789)が進められています。
+イーサリアムにおけるプルーフ・オブ・ステークのメカニズムでは、すべてのバリデータの中から、各スロットにおけるブロック提案者として1名のバリデータを選出します。 この選出は公開された関数を用いて計算できるため、攻撃者は、ブロック提案のタイミングをわずかに先立つ時点で次のブロック提案者を特定することが可能です。 攻撃者はこの情報を得ることで、次のブロック提案者にスパムを送信し、他のピアとの情報交換を妨げることができます。 ネットワークの他のユーザーにとっては、次のブロック提案者がオフラインになり、スロットは空のままであるように見えます。 これは、特定のバリデータを対象とする一種の検閲として機能させることができ、それらのユーザーがブロックチェーンに情報を追加するのを妨害することが可能です。 単独非公開リーダー選挙(SSLE)あるいは非単独非公開リーダー選挙を実施する場合、当該のブロック提案者自身のみが提案者に選出されたことを知ることができ、選出を事前に知ることが不可能になるため、DoSリスクを軽減することができます。 これはまだ実装されていませんが、活発な[研究開発](https://ethresear.ch/t/secret-non-single-leader-election/11789)分野です。
以上の説明はすべて、ステークが小規模なユーザーがイーサリアムへの攻撃を成功させることが非常に困難であることを示しています。 ここで紹介した実行可能な攻撃はいずれも、理想的なフォーク選択アルゴリズム、非現実的なネットワーク状況、あるいはクライアント・ソフトウェアに対する比較的小規模なパッチ修正によりすでに実行不可能になった攻撃ベクトルを前提としています。 もちろん、ゼロデイ攻撃が発生する可能性を否定することはできませんが、小規模のステークに基づく攻撃が成功するためには、非常に高い水準の技術的な能力、コンセンサスレイヤーに関する知識、および運が要求されることを示しています。 攻撃者の立場で考えた場合、できるだけ多くのイーサを蓄積した上で、ステーク全体に対する支配力を高めることが攻撃の成功率を高める最善の手段だと言うことになるでしょう。
-### >= 33%のステークを用いた攻撃 {#attackers-with-33-stake}
+### ステーク全体の33%以上を支配する攻撃者の場合 {#attackers-with-33-stake}
これまでに紹介したすべての攻撃手段は、攻撃者が投票できるステークの規模を大きくし、各スロットでブロックを提案するバリデータとして選出される可能性が高まるほど、成功する確率が高まります。 従って、悪意のバリデータはできる限り多くのステーキングされたイーサを支配しようとするでしょう。
@@ -107,11 +110,11 @@ lang: ja
イーサリアム・ネットワークが非同期型である(つまり、メッセージの送受信に遅延が生じる)と想定すると、ステーク全体の34%を支配する攻撃者は二重ファイナリティを発生させることができます。 これは、攻撃者がブロック作成者に選出された場合、曖昧化を実行し、支配するバリデータ全員と共に二重投票が可能になるからです。 これは、ブロックチェーンに分岐が発生し、それぞれのフォークに対してステークされたイーサの34%が投票するという事態を招きます。 各フォークがスーパーマジョリティの支持を得るには、残りのバリデータのうち50%の投票を得ればよいので、どちらのチェーンもファイナライズが可能になってしまいます(つまり、攻撃者であるバリデータの34%と、残余のバリデータの66%の半分を足すと、各フォークが67%を達成できます)。 競合するブロックは誠実なバリデータのうちおよそ50%の投票を得る必要があるので、この攻撃が成功するためには、ネットワークにメッセージが伝播される他ミングを攻撃者がある程度管理でき、誠実なバリデータを各チェーンに半分づつ振り分けられなければなりません。 攻撃者がこの二重ファイナリティを達成するには、支配下である34%のバリデータは二重投票を同時に実行する必要があり、これは最大の相関ペナルティが科せられるスラッシング対象の違反行為であるため、攻撃者のステーク全体(現在、バリデータによる合計ステークはおよそ1,000万イーサなので、その34%)を破壊する必要があります。 この攻撃に対する防御策は、ステークされたイーサ全体の34%を破壊することであるため、非常に大きなコストを伴います。 この攻撃から復旧するには、イーサリアム・コミュニティ全体が「帯域外」で連携し、フォークの一方を正当として、もう一方を破棄することに同意する必要があります。
-### ステーク全体の最大50%を支配する攻撃者の場合 {#attackers-with-50-stake}
+### ステーク全体の最大50%を支配する攻撃者の場合 {#attackers-with-50-stake}
悪意のバリデータ集団がステークされたイーサ全体の50%に対する支配力を持つ場合、理論的にはチェーンを同サイズの2つのフォークに分割し、彼らが持つ50%のステーク全体を用いて誠実なバリデータ群とは異なる投票を行うことで、2つのフォークが存在する状態を維持し、ファイナリティの実現を妨げることができます。 最終的には、両方のフォークに対するインアクティブ・リークを実行することで、両方のチェーンがファイナライズされることになるでしょう。 この場合は、ソーシャルリカバリーの力に頼るしかありません。
-誠実なバリデータ数やネットワーク遅延などの値が常に流動的であることを考慮すると、悪意のバリデータ集団がステーク全体に対して正確に50%の支配権を維持できる可能性はきわめて低く、このような攻撃の実行は非常にコストが高く、成功率が低いことを考えると、特にわずかな追加投資により50%_以上_のステークを取得すればさらに大きな攻撃力を得られることを考えると、合理的な攻撃者がこの手段を講じる可能性は少ないと言えるでしょう。
+誠実なバリデータ数やネットワーク遅延などの値が常に流動的であることを考慮すると、悪意のバリデータ集団がステーク全体に対して正確に50%の支配権を維持できる可能性はきわめて低く、このような攻撃の実行は非常にコストが高く、成功率が低いことを考えると、特にわずかな追加投資により _50%以上_ のステークを取得すればさらに大きな攻撃力を得られることを考えると、合理的な攻撃者がこの手段を講じる可能性は少ないと言えるでしょう。
攻撃者がステーク合計の50%以上を支配する場合、フォーク選択アルゴリズムを操作することが可能になります。 この場合、攻撃者は多数派の投票に基づくアテステーションが可能になるため、誠実なクライアントを騙す必要なしに、ショートレンジの再編成攻撃を実行するために十分な支配権を持つことになります。 この場合、誠実なバリデータも、彼らのフォーク選択アルゴリズムが攻撃者の選好チェーンの重みが最も大きいと判断するために攻撃者の支持に従い、チェーンがファイナライズ可能になります。 攻撃者は、このメカニズムを通して特定のトランザクションに対する検閲やショートレンジの再編成攻撃を実行することで、自らが有利になるようにブロックを再編成し、最大限のMEVを抽出することが可能になります。 この攻撃を防ぐには、ソーシャルレイヤーの介入により、誠実な少数派フォークを正当と認識することで、攻撃者のステークが持つ価値を大幅に引き下げる必要がありますが、これは同時に多数派のステーク全体(現時点の価値は190億米ドル弱)を攻撃のリスクに晒すことを意味します。
@@ -127,13 +130,13 @@ lang: ja
さらに、攻撃者に科されるペナルティがどのようなものであれ、ユーザーコミュニティ全体が、イーサリアム・クライアントに搭載されたフォーク選択アルゴリズムにより選好されているが不正であるチェーンにつき、実際にそれが不正なチェーンであり、誠実なチェーン上でのブロック生成に戻るべきだということを決定しなければなりません。 誠実なバリデータ群は、攻撃が開始される前に正規チェーンから分岐した、ユーザーコミュニティが承認したイーサリアム・ブロックチェーンのフォークにおいて今後の開発を継続するか、あるいは、攻撃者の支配下にあるバリデータを強制的に排除するかについて、集団的に同意することが可能でしょう。 誠実なバリデータは、攻撃者のチェーンに対するアテステーションを実行しないという正しい行動に対してペナルティが科せられるのを避けたいと考えるため、この正規チェーンで開発を続行するインセンティブが存在します。 イーサリアム上で開発された取引所、オンランプ、およびアプリケーションは、誠実なチェーン上での利用を望むと予想されるので、誠実なバリデータの決定に従って誠実なブロックチェーンを選択するでしょう。
-しかし、これはガバナンス上の大きな問題をもたらします。 一部のユーザーおよびバリデータは誠実なチェーンへの再移行に伴い確実に自分の資産を失うことになり、攻撃後に確定したブロック内のトランザクションはロールバックされる可能性がありあるため、アプリケーションレイヤーにおいて混乱が発生します。つまり、「コードは法である」という確信が強い一部のユーザーの倫理観が揺らいでしまうのです。 取引所およびアプリケーションにおいては、すでにオフチェーンにおけるアクションをオンチェーンのトランザクションとを関連付けている可能性が高く、オンチェーンのトランザクションをロールバックするとなると、取消や修正が相次ぐことになりますが、特に不正に獲得した利益がすでに正当な利益混合しており、DeFIやその他のデリバティブにおいて入金されている場合、誠実なユーザーに対しても二次的な影響を及ぼすため、公平な方法で元の状態に戻すのは困難になるでしょう。 おそらく組織ユーザーをも含む一部のユーザーは、意図的または偶然によりすでに不正なチェーンから何らかの利益を得ているはずであり、この利益を守るために正規フォークへの再移行に反対するかもしれません。 コミュニティ全体の連携に基づく賢明なリスク軽減策を迅速に実行できる体制を整えておくために、51%攻撃に対するコミュニティ全体の対応をリハーサルするべきだという声も多いです。 ヴィタリクによるethresear.chでの有益な議論については、[こちら](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925)と[こちら](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363)、そしてTwitterの[こちら](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw)でご確認ください。 コミュニティ全体が連携したソーシャル対応は、攻撃者を罰し、他のユーザーへの影響を最小化するという具体的な目的に絞り込む必要があります。
+しかし、これはガバナンス上の大きな問題をもたらします。 一部のユーザーおよびバリデータは誠実なチェーンへの再移行に伴い確実に自分の資産を失うことになり、攻撃後に確定したブロック内のトランザクションはロールバックされる可能性がありあるため、アプリケーションレイヤーにおいて混乱が発生します。つまり、「コードは法である」という確信が強い一部のユーザーの倫理観が揺らいでしまうのです。 取引所およびアプリケーションにおいては、すでにオフチェーンにおけるアクションをオンチェーンのトランザクションとを関連付けている可能性が高く、オンチェーンのトランザクションをロールバックするとなると、取消や修正が相次ぐことになりますが、特に不正に獲得した利益がすでに正当な利益混合しており、DeFIやその他のデリバティブにおいて入金されている場合、誠実なユーザーに対しても二次的な影響を及ぼすため、公平な方法で元の状態に戻すのは困難になるでしょう。 おそらく組織ユーザーをも含む一部のユーザーは、意図的または偶然によりすでに不正なチェーンから何らかの利益を得ているはずであり、この利益を守るために正規フォークへの再移行に反対するかもしれません。 コミュニティ全体の連携に基づく賢明なリスク軽減策を迅速に実行できる体制を整えておくために、51%攻撃に対するコミュニティ全体の対応をリハーサルするべきだという声も多いです。 ヴィタリクによるethresear.chでの有益な議論については、[こちら](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) と[こちら](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363)、そしてTwitterの[こちら](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw)でご確認ください。 コミュニティ全体が連携したソーシャル対応は、攻撃者を罰し、他のユーザーへの影響を最小化するという具体的な目的に絞り込む必要があります。
-ブロックチェーンのガバナンスは、それ自体が複雑なトピックです。 不正なバリデータがファイナライズしてしまったチェーンに対するレイヤー0の緊急対応をいかに管理するかは、イーサリアムコミュニティにとって間違いなく大きな課題であり、イーサリアムの歴史において、すでに[2回](/ethereum-forks/#dao-fork-summary)[も発生しています](/ethereum-forks/#tangerine-whistle)。
+ブロックチェーンのガバナンスは、それ自体が複雑なトピックです。 不正なバリデータがファイナライズしてしまったチェーンに対するレイヤー0の緊急対応をいかに管理するかは、イーサリアムコミュニティにとって間違いなく大きな課題であり、イーサリアムの歴史において、すでに[2回](/ethereum-forks/#tangerine-whistle)も[発生](/ethereum-forks/#dao-fork-summary)しています。
しかしながら、最悪の事態においても現実世界において解決策を見出せるという事実には、やや安堵感を覚えます。 究極的に、私たちが利用しているこの驚くべきテクノロジースタックにおいても、最悪の事態が発生した場合には、ユーザーである実際の人間たちが議論を通じて解決策を見出すしかないのです。
-## 要約 {#summary}
+## まとめ {#summary}
この記事では、イーサリアムにおけるプルーフ・オブ・ステークのコンセンサス・プロトコルを悪用する攻撃手法のいくつかについて説明しました。 攻撃者のステークがイーサ全体に対してどの程度の割合を占めるかに応じて、再編成攻撃やファイナリティ遅延攻撃がどのように変化するのかについても掘り下げました。 一般論として、資金が潤沢である攻撃者は、より大きな投票権を持ち、以後のブロックの内容に対して影響力を及ぼせるため、攻撃が成功する可能性が高まります。 攻撃者の攻撃能力は、ステークしたイーサの割合が特定のしきい値を越えるに従って増加します:
@@ -151,13 +154,13 @@ lang: ja
一方で、34%攻撃、51%攻撃、あるいは66%攻撃に対しては帯域外のソーシャルな連携による解決が必要になる場合が多いです。 これはユーザーコミュニティにとって痛みを伴うものですが、帯域外での連携による対応が可能だという事実は、攻撃者にとって大きな抑止効果を持ちます。 イーサリアムのソーシャルレイヤーは最終的な防御手段であり、攻撃が技術的に成功した場合でも、コミュニティが誠実なフォークを選択することに同意できれば、攻撃を無力化することができます。 これは、攻撃者とイーサリアム・コミュニティとの間の争いとなるでしょう。つまり、66%攻撃を実行するために数十億ドルもの資金を投じたとしても、ソーシャル連携を通じて反撃を迅速に実行できれば、攻撃者は、イーサリアム・コミュニティにとって無意味である既知の不正チェーンにステークされた、換金不可能なイーサを背負い込むことになるだけだからです。 攻撃者にとってはこの攻撃から利益を上げられる可能性が非常に低くなるため、事実上の効果的な抑止力として機能します。 これこそ、緊密に連携した価値観に基づき、団結力を持つソーシャルレイヤーを維持するために投資することが重要である理由です。
-## さらに学びたい方へ {#further-reading}
+## 参考リンク {#further-reading}
- [本記事の詳細版](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs)
- [ヴィタリックによる決済のファイナリティに関する説明](https://blog.ethereum.org/2016/05/09/on-settlement-finality/)
-- [LMD-GHOSTについての論文](https://arxiv.org/abs/2003.03052)
-- [Casper-FFGについての論文](https://arxiv.org/abs/1710.09437)
-- [ガスパーについての論文](https://arxiv.org/pdf/2003.03052.pdf)
-- [提案者の加重ブーストに関するコンセンサス仕様](https://github.com/ethereum/consensus-specs/pull/2730)
-- [ethresear.chに対するバウンス攻撃](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114)
-- [SSLEについてのリサーチ](https://ethresear.ch/t/secret-non-single-leader-election/11789)
+- [LMD GHOSTの論文](https://arxiv.org/abs/2003.03052)
+- [Casper-FFG ペーパー](https://arxiv.org/abs/1710.09437)
+- [Gasperの論文](https://arxiv.org/pdf/2003.03052.pdf)
+- [提案者加重ブーストのコンセンサス仕様](https://github.com/ethereum/consensus-specs/pull/2730)
+- [バウンス攻撃(ethresear.ch)](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114)
+- [SSLEの研究](https://ethresear.ch/t/secret-non-single-leader-election/11789)
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/attestations/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/attestations/index.md
index 49ade6239c0..567253cef13 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/attestations/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/attestations/index.md
@@ -1,6 +1,6 @@
---
-title: アテステーション
-description: イーサリアムのプルーフ・オブ・ステークにおけるアテステーションについての説明
+title: "アテステーション"
+description: "イーサリアムのプルーフ・オブ・ステークにおけるアテステーションについての説明"
lang: ja
---
@@ -8,35 +8,35 @@ lang: ja
## アテステーションとは何か? {#what-is-an-attestation}
-バリデータは、[エポック](/glossary/#epoch) (6.4分) ごとに、ネットワークに対するアテステーションを提案します。 アテステーションは、当該エポックにおける特定のスロットのみを対象とします。 アテステーションとは、チェーンに対するバリデータの意見を支持する投票を行うことです。具体的には、最新の正当化されたブロックと、現在のエポックにおける最初のブロック(それぞれ、`ソース`と`ターゲット`のチェックポイントと呼ぶ)を対象とします。 この情報は、参加するすべてのバリデータを対象として結合されるため、ネットワークがブロックチェーンの状態についてコンセンサスに達することが可能になります。
+[エポック](/glossary/#epoch) (6.4分) ごとに、バリデータはネットワークにアテステーションを提案します。 アテステーションは、当該エポックにおける特定のスロットのみを対象とします。 アテステーションの目的は、バリデータのチェーン観、特に最新の正当化されたブロックと、現在のエポックの最初のブロック (`source` と `target` のチェックポイントとして知られる) に賛成票を投じることです。 この情報は、参加するすべてのバリデータを対象として結合されるため、ネットワークがブロックチェーンの状態についてコンセンサスに達することが可能になります。
アテステーションには、以下の構成要素が含まれます:
-- `aggregation_bits`:バリデータ委員会における当該バリデータのインデックスにポジションがマッピングされたバリデータのビットリスト。この値(0または1)は、当該バリデータが当該`データ`を署名したか否か(つまり、当該バリデータがアクティブであり、ブロック提案者に同意するか否か)を示します。
-- `data`:当該アテステーションに関する詳細情報(以下の定義を参照)。
-- `signature`:個々のバリデータの署名を集約したBLS署名。
+- `aggregation_bits`: バリデータのビットリストで、位置がその委員会におけるバリデータインデックスに対応します。値(0/1)は、バリデータが`data`に署名したかどうか(つまり、アクティブであり、ブロック提案者に同意しているかどうか)を示します。
+- `data`: 以下に定義される、アテステーションに関する詳細
+- `signature`: 個々のバリデータの署名を集約したBLS署名
-アテステーションを行うバリデータはまず、`データ<./code>を構築する必要があります。 このデータ`には、以下の情報が含まれます:
+アテステーションを行うバリデータの最初のタスクは、`data`を構築することです。 `data`には以下の情報が含まれます:
-- `slot`:当該のアテステーションが参照するスロット番号。
-- `index`:特定のスロットにおいて、当該バリデータが所属する委員会を特定する番号。
-- `beacon_block_root`:当該バリデータが、(フォーク選択アルゴリズムを適用した結果として)チェーンの先頭にあると認識するブロックのルートハッシュ。
-- `source`:ファイナリティ投票の一部であり、当該バリデータがどのブロックを最も最近正当化されたブロックとして認識するかを示す。
-- `target`:ファイナリティ投票の一部であり、当該バリデータがどのブロックを現在のエポックにおける最初のブロックとして認識するかを示します。
+- `slot`: アテステーションが参照するスロット番号
+- `index`: 特定のスロットでバリデータが属する委員会を識別する番号
+- `beacon_block_root`: バリデータがチェーンの先頭に見るブロックのルートハッシュ(フォークチョイスアルゴリズムを適用した結果)
+- `source`: バリデータが最新の正当化されたブロックとして見なすものを示すファイナリティ投票の一部
+- `target`: バリデータが現在のエポックの最初のブロックとして見なすものを示すファイナリティ投票の一部
-`data`が構築されると、バリデータは、自分が参加したことを示すために、自身のバリデータ・インデックスに対応した`aggregation_bits`のビットを0から1に変更することができます。
+`data`が構築されると、バリデータは参加したことを示すために、自身のバリデータインデックスに対応する`aggregation_bits`のビットを0から1に反転させることができます。
バリデータは最後に、このアテステーションに署名し、ネットワークに送信します。
-### アテステーションの集約 {#aggregated-attestation}
+### 集約アテステーション {#aggregated-attestation}
-このデータを各バリデータに提供する場合、ネットワークに対する負担が大きくなります。 このため、各バリデータからのアテステーションは、より広汎に送信する前にサブネット内で集約されます。 具体的には、各バリデータの署名を集約することで、送信されるアテステーションに当該コンセンサスの`データ`と、この`データ`に同意するすべてのバリデータの署名を結合した単一の署名が含まれるようにします。 これは、`aggregation_bits`を用いて確認することができます。aggregation_bitsは、各バリデータが所属する委員会におけるインデックス(バリデータのIDは`データ`に含まれています)であり、個々の署名に対してクエリを実行するために使用できるからです。
+このデータを各バリデータに提供する場合、ネットワークに対する負担が大きくなります。 このため、各バリデータからのアテステーションは、より広汎に送信する前にサブネット内で集約されます。 これには署名を一緒に集約することも含まれ、ブロードキャストされるアテステーションにはコンセンサス`data`と、その`data`に同意するすべてのバリデータの署名を結合して形成された単一の署名が含まれます。 これは`aggregation_bits`を使って確認できます。なぜなら、これは各バリデータの委員会におけるインデックスを提供し (委員会のIDは`data`で提供)、個々の署名を照会するために使用できるからです。
-エポックごとに、各サブネットから16のバリデータが`アグリゲータ`に選定されます。 アグリゲータは、ゴシップネットワーク上において、自身のアテステーションと同等の`データ`を持つすべてのアテステーションを収集します。 データが一致するアテステーションを送信したすべてのユーザーは、`aggregatoin_bits`に記録されます。 アグリゲータは次に、この集約されたアテステーションをより広汎なネットワークに送信します。
+各エポックで、各サブネットの16のバリデータが`aggregators`として選ばれます。 アグリゲータは、ゴシップネットワークを介して耳にする、自身のものと同等の`data`を持つすべてのアテステーションを収集します。 一致する各アテステーションの送信者は、`aggregation_bits`に記録されます。 アグリゲータは次に、この集約されたアテステーションをより広汎なネットワークに送信します。
バリデータがブロック提案者に選定されると、当該の新規ブロックにおける最新のスロットまで、各サブネットからのアテステーションを集約して、パッケージ化します。
-### アテステーション追加のライフサイクル {#attestation-inclusion-lifecycle}
+### アテステーション取り込みのライフサイクル {#attestation-inclusion-lifecycle}
1. 生成
2. 伝播
@@ -46,7 +46,7 @@ lang: ja
以下の図は、アテステーションのライフサイクルの概略を示したものです。
-
+
## 報酬 {#rewards}
@@ -64,29 +64,29 @@ lang: ja
ベース報酬は、アテステーションを行うバリデータの数と、彼らの有効なステーク済みイーサ残高により計算されます。
-`base reward = validator effective balance x 2^6 / SQRT(Effective balance of all active validators)`
+`ベース報酬 = バリデータ有効残高 x 2^6 / SQRT(全アクティブバリデータの有効残高)`
-#### 追加の遅延 {#inclusion-delay}
+#### 取り込み遅延 {#inclusion-delay}
-各バリデータがチェーンの先頭(`ブロック n`)で投票した時点では、`ブロック n+1`はまだ提案されていません。 このため、追加されるアテステーションは当然**1ブロック後**になり、`ブロック n`がチェーンの先頭である時点で投票したすべてのバリデータのアテステーションは`ブロック n+1`に含まれることになるため、**追加の遅延**は「1」になります。 アテステーション報酬は、ベース報酬に追加遅延の値の逆数を掛け合わせて算出されるため、追加の遅延が「2」スロットに倍増した場合、アテステーション報酬は2分の1になります。
+バリデータがチェーンの先頭(`ブロックn`)に投票した時点では、`ブロックn+1`はまだ提案されていませんでした。 そのため、アテステーションは自然に**1ブロック後**に取り込まれ、`ブロックn`がチェーンヘッドであることに投票したすべてのアテステーションが`ブロックn+1`に取り込まれるため、**取り込み遅延**は1になります。 アテステーション報酬は、ベース報酬に追加遅延の値の逆数を掛け合わせて算出されるため、追加の遅延が「2」スロットに倍増した場合、アテステーション報酬は2分の1になります。
-### アテステーションで発生しうるシナリオ {#attestation-scenarios}
+### アテステーションのシナリオ {#attestation-scenarios}
-#### 投票を行うバリデータが欠席する場合 {#missing-voting-validator}
+#### 投票バリデータの欠落 {#missing-voting-validator}
バリデータがアテステーションを提出できるのは、最長で1エポックの期間です。 エポック0でアテステーションを提出しなかった場合、エポック1で提出できますが、追加遅延が発生します。
-#### アグリゲータが欠席する場合 {#missing-aggregator}
+#### アグリゲータの欠落 {#missing-aggregator}
-エポックごとに、合計16名のアグリゲータが存在します。 さらに、**256件のエポックを対象とする2つのサブネット**を講読するランダムなバリデータが存在し、アグリゲータが欠席する際のバックアップとして機能します。
+エポックごとに、合計16名のアグリゲータが存在します。 さらに、ランダムなバリデータが**256エポックの間、2つのサブネット**を購読し、アグリゲータが欠落した場合のバックアップとして機能します。
-#### ブロック提案者が欠席する場合 {#missing-block-proposer}
+#### ブロック提案者の欠落 {#missing-block-proposer}
-運が良ければ、アグリゲータがブロック提案者になる場合もあります。 ブロック提案者が欠席したためにアテステーションが追加されなかった場合、次のブロック提案者がこの集約済みのアテステーションを継承して、次のブロックに追加します。 ただし、**追加の遅延**の値が1増えます。
+運が良ければ、アグリゲータがブロック提案者になる場合もあります。 ブロック提案者が欠席したためにアテステーションが追加されなかった場合、次のブロック提案者がこの集約済みのアテステーションを継承して、次のブロックに追加します。 ただし、**取り込み遅延**は1増加します。
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [Vitalikのコンセンサス仕様(注釈付)におけるアテステーションの説明](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata)
-- [eth2book.infoにおけるアテステーションの説明](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata)
+- [Vitalikの注釈付きコンセンサス仕様のアテステーション](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata)
+- [eth2book.infoのアテステーション](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata)
-_役に立つコミュニティリソースをご存知の場合は、 このページを編集して追加してください。_
+_役に立つコミュニティリソースを知っていますか? Edit this page and add it!_
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/block-proposal/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/block-proposal/index.md
index 91fbb196266..ac3407cc2a8 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/block-proposal/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/block-proposal/index.md
@@ -1,24 +1,24 @@
---
-title: ブロック提案
-description: イーサリアムのプルーフ・オブ・ステークにおけるブロックの提案方法についての説明
+title: "ブロック提案"
+description: "イーサリアムのプルーフ・オブ・ステークにおけるブロックの提案方法についての説明"
lang: ja
---
ブロックは、ブロックチェーンにおける基本的な単位です。 ブロックとは、各ノード間で受け渡しされ、合意され、各ノードのデータベースに追加される情報を区切った単位です。 このページでは、ブロックがどのように生成されるのかを説明します。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-ブロックの提案は、プルーフ・オブ・ステークのプロトコルの一部です。 このページの内容を理解するためには、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)および[ブロックのアーキテクチャ](/developers/docs/blocks/)を読んでおくとよいでしょう。
+ブロックの提案は、プルーフ・オブ・ステークのプロトコルの一部です。 このページを理解するために、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)と[ブロックの構造](/developers/docs/blocks/)について読むことを推奨します。
## 誰がブロックを生成するのか? {#who-produces-blocks}
ブロックは、バリデータのアカウントが提案します。 バリデータのアカウントは、実行クライアントおよびコンセンサス・クライアントの一部としてバリデータ・ソフトウェアを実行し、少なくともデポジット・コントラクトの残高が少なくとも32イーサ以上であるノードのオペレータが管理します。 ただし、各バリデータがすべてのブロックを提案する訳ではありません。 イーサリアムでは、時間をスロットおよびエポック単位で把握します。 1スロットは12秒であり、1エポックは32スロット(6.4分)です。 各スロットは、イーサリアムに新規ブロックを追加する期間を表します。
-### 無作為の選出 {#random-selection}
+### 無作為抽出 {#random-selection}
-各スロットにおいてブロックを提案するために、1名のバリデータがほぼ無作為に選出されます。 各ノードによる番号の生成が真に無作為であればノード間においてコンセンサスを実現することが不可能になるため、ブロックチェーンにおいては真の無作為性は存在しません。 むしろ、ここでの目的は、バリデータの選出プロセスを予測不可能にすることです。 イーサリアムでは、RANDAOと呼ばれるアルゴリズムを用いてバリデータ選出の無作為性を実現します。これは、ブロック提案者のハッシュと、ブロックごとに更新されるシードと混合するアルゴリズムです。 この混合された値に基づき、バリデータの全リストから特定のバリデータを選出します。 バリデータは、シードに対する特定の種類の不正操作から保護するために、2エポック前の時点で選出が確定します。
+各スロットにおいてブロックを提案するために、1名のバリデータがほぼ無作為に選出されます。 各ノードによる番号の生成が真に無作為であればノード間においてコンセンサスを実現することが不可能になるため、ブロックチェーンにおいては真の無作為性は存在しません。 むしろ、ここでの目的は、バリデータの選出プロセスを予測不可能にすることです。 イーサリアムでは、RANDAOと呼ばれるアルゴリズムを用いてバリデータ選出の無作為性を実現します。これは、ブロック提案者のハッシュと、ブロックごとに更新されるシードと混合するアルゴリズムです。 この混合値は、バリデータの全リストから当該の1名を選出するために用いられます。 バリデータは、シードに対する特定の種類の不正操作から保護するために、2エポック前の時点で選出が確定します。
-バリデータは各スロットにおいてRANDAOに追加されますが、グローバルなRANDAO値は各エポックにつき1回のみ更新されます。 次のブロック提案者のインデックスを算出するために、RANDAO値はスロット番号とミックスされ、スロットごとに固有値が得られます。 特定のバリデータが選出される確率は、単に`1/N`(`N`は、アクティブなバリデータの合計数)ではありません。 これは、各バリデータの有効なイーサ残高によって加重されるためです。 有効な残高の上限は32イーサです(つまり、`残高<32イーサ`の場合、`残高=32イーサ`の場合よりも加重が低くなりますが、`残高>32`でああっても`残高=32イーサ`の場合よりも加重は大きくなりません。
+バリデータは各スロットにおいてRANDAOに追加されますが、グローバルなRANDAO値は各エポックにつき1回のみ更新されます。 次のブロック提案者のインデックスを算出するために、RANDAO値はスロット番号とミックスされ、スロットごとに固有値が得られます。 特定のバリデータが選出される確率は、単に`1/N`(Nは、アクティブなバリデータの合計数)ではありません。 これは、各バリデータの有効なイーサ残高によって加重されるためです。 最大有効残高は32 ETHです(これは、`balance < 32 ETH` の場合は `balance == 32 ETH` よりも重みが低くなりますが、`balance > 32 ETH` の場合でも `balance == 32 ETH` より重みは高くならないことを意味します)。
各スロットにおいて選出されるブロック提案者は1名のみです。 通常、1名のブロック生成者が、専用のスロットにおいて1つのブロックを生成し、リリースします。 同一スロットにおいて2つのブロックを生成することはスラッシングの対象となる不正行為であり、これを「曖昧化」と呼びます。
@@ -42,28 +42,28 @@ class BeaconBlockBody(Container):
execution_payload: ExecutionPayload
```
-ブロック提案者が現在のエポック番号に署名することによって作成する検証可能なランダム値を`randao_reveal`フィールドで受け取ります。 `eth1_data`は、ブロック提案者における入金コントラクトのビューに対する投票であり、入金コントラクトのマークルツリーにおけるルートと、新規の入金に対する検証を可能にする入金件数の総数が含まれています。 `graffiti`は、ブロックにメッセージを追加するための使用できるオプション項目です。 `proposer_slashings`および `attester_slashings`は、提案者によるチェーンビューに基づき、特定のバリデータがスラッシュ対象の違反行為を実行したことを証明する項目です。 `deposits`は、ブロック提案者が認識しているバリデータによる新規の入金リストであり、`voluntary_exits`は、ブロック提案者がコンセンサスレイヤーのゴシップネットワークにおいて、退出を希望する意向を確認したバリデータのリストです。 `sync_aggregate`は、どのバリデータが、以前に同期委員会(軽量のクライアントデータを担当するバリデータのサブセット)に指定されたことがあり、データの署名を実行したことがあるのかを示すベクトルです。
+`randao_reveal`フィールドは、ブロック提案者が現在のエポック番号に署名することによって作成する検証可能なランダム値を受け取ります。 `eth1_data`は、ブロック提案者における入金コントラクトのビューに対する投票であり、入金コントラクトのマークルツリーにおけるルートと、新規の入金に対する検証を可能にする入金件数の総数が含まれています。 `graffiti`は、ブロックにメッセージを追加するために使用できるオプションのフィールドです。 `proposer_slashings`および`attester_slashings`は、提案者のチェーンビューに基づき、特定のバリデータがスラッシュ対象の違反行為を実行したことを証明するフィールドです。 `deposits`は、ブロック提案者が認識しているバリデータによる新規の入金リストであり、`voluntary_exits`は、ブロック提案者がコンセンサスレイヤーのゴシップネットワークにおいて、退出を希望する意向を確認したバリデータのリストです。 `sync_aggregate`は、どのバリデータが、以前に同期委員会(軽量のクライアントデータを担当するバリデータのサブセット)に指定されたことがあり、データの署名を実行したことがあるのかを示すベクトルです。
-`execution_payload`は、トランザクションに関する情報が実行クライアントとコンセンサス・クライアントとの間で受け渡されることを可能にします。 `execution_payload`は、ビーコンブロック内にネスティングされるブロックの実行データです。 `execution_payload`内の各フィールドは、イーサリアムのイエローペーパーで概説されたブロックの構造を反映しています。ただし、オマーブロックを含まず、`難易度`の代わりに`prev_randao`を含む点が異なります。 実行クライアントは、自身のゴシップネットワークで耳にしたトランザクションのローカルプールにアクセスすることができます。 これらのトランザクションはローカルで実行され、ポストステートと呼ばれる更新後の状態ツリーを生成します。 これらのトランザクションは、`execution_payload`において`トランザクション`という名称のリストに含まれており、当該のポストステートは`state-root`フィールドに書き込まれます。
+`execution_payload`は、トランザクションに関する情報が実行クライアントとコンセンサスクライアントとの間で受け渡されることを可能にします。 `execution_payload`は、ビーコンブロック内にネストされる実行データのブロックです。 `execution_payload`内の各フィールドは、イーサリアムのイエローペーパーで概説されたブロックの構造を反映しています。ただし、オマーブロックを含まず、難易度の代わりに`prev_randao`を含む点が異なります。 実行クライアントは、自身のゴシップネットワークで耳にしたトランザクションのローカルプールにアクセスすることができます。 これらのトランザクションはローカルで実行され、ポストステートと呼ばれる更新後の状態ツリーを生成します。 これらのトランザクションは、`execution_payload`においてトランザクションという名称のリストに含まれており、当該のポストステートは`state-root`フィールドに書き込まれます。
これらのデータはすべてビーコンブロックで収集、署名された上で、ブロック提案者のピアユーザーのブロードキャストされ、受信したピアはさらにそのピアユーザーに送信します。
-詳細については、[ブロックの構造](/developers/docs/blocks)をご覧ください。
+[ブロックの構造についての詳細](/developers/docs/blocks/)
## 生成されたブロックには、何が起きるのか? {#what-happens-to-blocks}
-生成されたブロックはブロック提案者のローカルデータベースに追加され、コンセンサスレイヤーのゴシップネットワークを通じてピアユーザーにブロードキャストされます。 ブロックを受け取ったバリデータは、そのブロックに含まれるデータを検証します。具体的には、親ブロックが適切かどうか、適切なスロットに対応しているか、提案者インデックスが予期されたものであるか、RANDAO開示が有効か、および提案者がスラッシュ対象になっていないか、について確認します。 `execution_payload`のバンドルが解除され、バリデータの実行クライアントが当該リストに含まれるトランザクションを実行して、提案される状態変更についてチェックします。 当該ブロックがこれらのチェックにすべて合格した場合、各バリデータはブロックを自身の正規チェーンに追加します。 以上のプロセスを、次のスロットでも繰り返します。
+生成されたブロックはブロック提案者のローカルデータベースに追加され、コンセンサスレイヤーのゴシップネットワークを通じてピアユーザーにブロードキャストされます。 ブロックを受け取ったバリデータは、そのブロックに含まれるデータを検証します。具体的には、親ブロックが適切かどうか、適切なスロットに対応しているか、提案者インデックスが予期されたものであるか、RANDAO開示が有効か、および提案者がスラッシュ対象になっていないか、について確認します。 `execution_payload`のバンドルが解除され、バリデータの実行クライアントがリスト内のトランザクションを再実行して、提案された状態変更をチェックします。 当該ブロックがこれらのチェックにすべて合格した場合、各バリデータはブロックを自身の正規チェーンに追加します。 以上のプロセスを、次のスロットでも繰り返します。
## ブロック報酬 {#block-rewards}
-ブロック提案者は、この作業に対する報酬を獲得します。 `base_reward` は、アクティブなバリデータの数と、それらのバリデータにおける有効な残高に基づいて計算されます。 その上で、ブロック提案者は、当該ブロックに含まれる1件の有効なアテステーションごとに`base_reward`の一部を受け取ります。当該ブロックをアテステーションするバリデータの数が多ければ多いほど、ブロック提案者の報酬は増えます。 スラッシングが必要なバリデータを報告したユーザーに対しても報酬が提供されます。この報酬額は、スラッシングされたバリデータにおける`有効な残高の512分の1`となります。
+ブロック提案者は、この作業に対する報酬を獲得します。 `base_reward` は、アクティブなバリデータの数と、それらのバリデータにおける有効な残高に基づいて計算されます。 その上で、ブロック提案者は、当該ブロックに含まれる1件の有効なアテステーションごとに`base_reward`の一部を受け取ります。当該ブロックをアテステーションするバリデータの数が多ければ多いほど、ブロック提案者の報酬は増えます。 スラッシングが必要なバリデータを報告したユーザーに対しても報酬が提供されます。この報酬額は、スラッシングされたバリデータにおける有効な残高の512分の1となります。
-[報酬およびペナルティの詳細](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties)
+[報酬とペナルティの詳細](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties)
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
- [ブロック入門](/developers/docs/blocks/)
- [プルーフ・オブ・ステーク入門](/developers/docs/consensus-mechanisms/pos/)
-- [イーサリアムにおけるコンセンサスの仕様](https://github.com/ethereum/consensus-specs)
-- [ガスパー入門](/developers/docs/consensus-mechanisms/pos/)
+- [イーサリアムコンセンサス仕様](https://github.com/ethereum/consensus-specs)
+- [Gasper入門](/developers/docs/consensus-mechanisms/pos/gasper/)
- [イーサリアムのアップグレード](https://eth2book.info/)
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/faqs/index.md
index ca13cd89276..258e9e84add 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/faqs/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/faqs/index.md
@@ -1,14 +1,14 @@
---
-title: よくある質問
-description: プルーフ・オブ・ステークについてのよくある質問
+title: "よくある質問"
+description: "プルーフ・オブ・ステークについてのよくある質問"
lang: ja
---
-## プルーフ・オブ・ステークとは何ですか? {#what-is-proof-of-stake}
+## プルーフ・オブ・ステークとは {#what-is-proof-of-stake}
プルーフ・オブ・ステークとは、悪意の行為を実行した攻撃者の資産価値を没収することで、ブロックチェーンの安全性を保護するアルゴリズムのクラスを指します。 プルーフ・オブ・ステークのシステムでは、バリデータ(検証者)が不正行為を行ったと実証される場合、自分の資産の一部が破壊されることを了承した上で預け入れる意思を持つバリデータ群が必要になります。 イーサリアムでは、ブロックチェーンの安全性を保護するためにプルーフ・オブ・ステークのメカニズムを採用しています。
-## プルーフ・オブ・ステークとプルーフ・オブ・ワークの違いは何ですか? {#comparison-to-proof-of-work}
+## プルーフ・オブ・ステークとプルーフ・オブ・ワークの違いは何ですか? プルーフ・オブ・ワークとの比較 {#comparison-to-proof-of-work}
プルーフ・オブ・ワークとプルーフ・オブ・ステークはいずれも、悪意のアクターがスパム行為やネットワーク上の不正行為を行う場合に経済的な不利益を被ることになるメカニズムであるという点では共通しています。 どちらのメカニズムでも、コンセンサスに積極的に関与する各ノードは、自分の資産の一部を「ネットワークに預け入れる」必要があり、預け入れられた資産は不正行為が発覚した場合に没収されます。
@@ -18,7 +18,7 @@ lang: ja
プルーフ・オブ・ワークではマイニングにおいて電力が消費されるため、よりエネルギー効率が低いと言えます。 一方、プルーフ・オブ・ステークではエネルギー消費量は非常に少なく抑えることができ、イーサリアムのバリデータはRaspberry Piなどの低電力消費のコンピュータでも作業を実行できます。 イーサリアムが採用したプルーフ・オブ・ステークのメカニズムでは、攻撃者が負担するコストがより大きく、より厳格な制裁が課されるため、プルーフ・オブ・ワークよりも安全性が高いと考えられています。
-プルーフ・オブ・ワークとプルーフ・オブ・ステークのどちらが優れているかについては、現在も論争が続いています。 [ビタリック・ブテリンのブログ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work)およびジャスティン・ドレイクとリン・オールデンとのディベートは、この論争で参考となる要約になっています。
+プルーフ・オブ・ワークとプルーフ・オブ・ステークのどちらが優れているかについては、現在も論争が続いています。 [ヴィタリック・ブテリンのブログ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work)やジャスティン・ドレイクとリン・オールデンとのディベートで、議論の概要がよくまとめられています。
@@ -26,33 +26,33 @@ lang: ja
プルーフ・オブ・ステークのネットワークに含まれる各ノードは、ごくわずかの電力しか消費しません。 あるサードパーティ調査によれば、イーサリアムにおけるプルーフ・オブ・ステークのネットワーク全体で消費される電力は年間0.0026TWhであり、米国のゲーム用途の電力消費量と比較するとおよそ1万3,000分の1に過ぎません。
-[イーサリアムのエネルギー消費についての詳細](/energy-consumption/)
+[イーサリアムのエネルギー消費の詳細](/energy-consumption/)
## プルーフ・オブ・ステークは安全ですか? {#is-pos-secure}
イーサリアムのプルーフ・オブ・ステークは、非常に安全性が高いと言えます。 プルーフ・オブ・ステークのメカニズムは、実際に導入される前に、8年間にわたりって研究・開発、厳格な検証が行われてきました。 プルーフ・オブ・ステークによるセキュリティの保証は、プルーフ・オブ・ワークの場合とは異なっています。 プルーフ・オブ・ステークでは、悪意のバリデータを積極的に処罰し(「スラッシュする」)、バリデータリストから削除できるため、攻撃者は多額のイーサを失うことになります。 一方プルーフ・オブ・ワークでは、攻撃者はハッシュパワーが十分である限り攻撃を継続できてしまいます。 また、同等の攻撃を行うための費用も、プルーフ・オブ・ステークの方がプルーフ・オブ・ワークよりも高価になります。 プルーフ・オブ・ステークでは、チェーンの生存性に悪影響を及ぼすためにはネットワークにステーキングするイーサの量が全体の33%以上でなければなりません(成功確率がきわめて低い非常に洗練された攻撃の場合を除く)。 将来のブロックの内容を支配するためには、ステーキングされたイーサの合計量の51%以上が必要であり、履歴の変更には66%以上が必要になります。 イーサリアムのプロトコルでは、これらの33%あるいは51%を保有する攻撃者の資産を破壊することができ、66%の攻撃シナリオでは社会的コンセンサスにより破壊が可能です。
-- [イーサリアムにおけるプルーフ・オブ・ステークのメカニズムを攻撃者から防御する方法についての詳細](/developers/docs/consensus-mechanisms/pos/attack-and-defense)
+- [イーサリアムのプルーフ・オブ・ステークに対する攻撃と防御の詳細](/developers/docs/consensus-mechanisms/pos/attack-and-defense)
- [プルーフ・オブ・ステークの設計に関する詳細](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51)
## プルーフ・オブ・ステークの導入により、イーサリアムの利用コストを引き下げられますか? {#does-pos-make-ethereum-cheaper}
できません。 トランザクションを送信するコスト(ガス代)は常に変化する手数料市場により決定され、ネットワーク需要と比例して上昇します。 イーサリアムのコンセンサス・メカニズムは、利用コストに直接的な影響を及ぼしません。
-[ガスについての詳細](/developers/docs/gas)
+[ガスの詳細](/developers/docs/gas)。
## ノード、クライアント、バリデータとは何ですか? {#what-are-nodes-clients-and-validators}
ノードとは、イーサリアム・ネットワークに接続されたコンピュータを指します。 クライアントとは、各コンピュータがノードとして機能するために実行されるソフトウェアを指します。 クライアントには、実行クライアントとコンセンサス・クライアントの2種類があります。 ノードとして機能するためには、これら2種類のソフトウェアが両方必要です。 バリデータとは、コンセンサス・クライアントがオプションで搭載できるアドオン機能であり、この機能を持つノードはプルーフ・オブ・ステークによるコンセンサス作業に参加できるようになります。 具体的には、バリデータに選定された場合にブロックを作成、提案でき、ネットワーク上で情報を得たブロックに対するアテステーションを実行できるようになります。 ノードの運用者がバリデータを実行するには、入金コントラクトに32イーサを預け入れる必要があります。
-- [ノードおよびクライアントについての詳細](/developers/docs/nodes-and-clients)
-- [ステークの詳細](/staking)
+- [ノードとクライアントの詳細](/developers/docs/nodes-and-clients)
+- [ステーキングの詳細](/staking)
## プルーフ・オブ・ステークは新しいアイデアですか? {#is-pos-new}
-できません。 BitcoinTalk上のあるユーザーが2011年に、ビットコインをアップグレードする方法として[プルーフ・オブ・ステークの基本概念](https://bitcointalk.org/index.php?topic=27787.0)を提案しました。 イーサリアム・メインネット上でプルーフ・オブ・ステークの導入が可能になる11年前のことでした。 他のいくつかのブロックチェーンではイーサリアムよりも早期にプルーフ・オブ・ステークのメカニズムを導入しましたが、イーサリアムが導入したメカニズム(ガスパー)とは異なります。
+できません。 2011年、BitcoinTalkのあるユーザーが、ビットコインへのアップグレードとして[プルーフ・オブ・ステークの基本概念を提案しました](https://bitcointalk.org/index.php?topic=27787.0)。 イーサリアム・メインネット上でプルーフ・オブ・ステークの導入が可能になる11年前のことでした。 他のいくつかのブロックチェーンではイーサリアムよりも早期にプルーフ・オブ・ステークのメカニズムを導入しましたが、イーサリアムが導入したメカニズム(ガスパー)とは異なります。
-## イーサリアムにおけるプルーフ・オブ・ステークのメカニズムは、他のチェーンの場合と何が異なりますか? {#why-is-ethereum-pos-special}
+## イーサリアムにおけるプルーフ・オブ・ステークのメカニズムは、他のチェーンの場合と何が異なりますか? イーサリアムのPoSが特別な理由 {#why-is-ethereum-pos-special}
イーサリアムにおけるプルーフ・オブ・ステークのメカニズムは、独自の設計になっています。 イーサリアムに先がけて設計、実装されたプルーフ・オブ・ステークのメカニズムと比較すると、最も堅牢なメカニズムであると言えるでしょう。 イーサリアムにおけるプルーフ・オブ・ステークのメカニズムは、「キャスパー」と呼ばれます。 キャスパーでは、ブロック提案を行うバリデータを選出する方法、アテステーションがいつ、どのように作成されるか、アテステーションをどのように数えるか、バリデータに提供される報酬およびバリデータに課されるペナルティ、スラッシングの実行条件、インアクティブ・リークなどのフェイルセーフのメカニズム、および「ファイナリティ」の条件といった事項が定義されています。 ファイナリティとは、当該ブロックが正規チェーンの永続的な一部であると見なされるための条件であり、ネットワーク上でステーキングされたイーサ総量の少なくとも66%以上が投票する必要があります。 キャスパーは、特にイーサリアムを念頭に置いて開発されたメカニズムであり、イーサリアムが最初に実装して以降、現在も他のブロックチェーンは採用していません。
@@ -60,13 +60,13 @@ lang: ja
キャスパーおよびLMD-GHOSTをまとめて、「ガスパー」と呼んでいます。
-[ガスパーについての詳細](/developers/docs/consensus-mechanisms/pos/gasper/)
+[Gasperの詳細](/developers/docs/consensus-mechanisms/pos/gasper/)
## スラッシングとは何ですか? {#what-is-slashing}
スラッシングとは、バリデータがステーキングした資産の一部を破壊し、バリデータをネットワークから退出させる行為を指します。 スラッシングで破壊されるイーサの量は、スラッシング対象のバリデータの数に応じて変化します。つまり、複数のバリデータが共謀して悪意の行為を行った場合、1名の悪意のユーザーに対する場合よりも厳格に罰せられます。
-[スラッシングについての詳細](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing)
+[スラッシングの詳細](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing)
## バリデータが32イーサを預け入れなければならないのはなぜですか? {#why-32-eth}
@@ -76,32 +76,32 @@ lang: ja
各スロットにおいてブロックを提案できるバリデータが、疑似的な無作為性に基づき1名選出されます。これは、ブロック提案者のハッシュとブロックごとに更新されるシードを混合するRANDAOというアルゴリズムを用いて行われます。 この混合値は、バリデータの全リストから当該の1名を選出するために用いられます。 バリデータの選出は、2つ前のエポックの時点で事前に完了しています。
-[バリデータの選出についての詳細](/developers/docs/consensus-mechanisms/pos/block-proposal)
+[バリデータ選択の詳細](/developers/docs/consensus-mechanisms/pos/block-proposal)
## ステーク・グラインディングとは何ですか? {#what-is-stake-grinding}
ステーク・グラインディングとは、プルーフ・オブ・ステークのネットワークに対する攻撃の一種であり、攻撃者が自分にとって有利なバリデータが選出されるようにバリデータ選出アルゴリズムを影響付けようとする手法です。 RANDAOに対するステーク・グラインディング攻撃を実行するには、ステーキングされたイーサ総量の約半分が必要になります。
-[ステーク・グラインディングについての詳細](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability)
+[ステーク・グラインディングの詳細](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability)
## ソーシャルスラッシングとは何ですか? {#what-is-social-slashing}
ソーシャルスラッシングとは、ネットワークが攻撃を受けた際に、ユーザーコミュニティがブロックチェーンのフォークを調整する能力を指します。 ユーザーコミュニティは、ソーシャルスラッシングを通じて、攻撃者がファイナライズしてしまった不正なチェーンを元に戻すことができます。 ソーシャルスラッシングはさらに、検閲攻撃に対しても活用できます。
-- [ソーシャルスラッシングについての詳細](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7)
-- [ソーシャルスラッシングについてのヴィタリック・ブテリンの意見](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake)
+- [ソーシャルスラッシングの詳細](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7)
+- [ソーシャルスラッシングに関するヴィタリック・ブテリンの見解](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake)
## 私もスラッシングの対象になりますか? {#will-i-get-slashed}
バリデータに対しては、故意に悪意の行動を実行しない限り、スラッシングの対象になる可能性は非常に低いです。 スラッシングが実行されるのは、バリデータが同一スロットに対して複数のブロックを提案する場合や、アテステーションと矛盾した行動を取るという非常に限定的なシナリオにおいてのみであり、これらの状況が偶然発生する可能性はほとんどありません。
-[スラッシングの実行条件についての詳細](https://eth2book.info/altair/part2/incentives/slashing)
+[スラッシングの条件に関する詳細](https://eth2book.info/altair/part2/incentives/slashing)
## ステーキング無しの問題とは何ですか? {#what-is-nothing-at-stake-problem}
ステーキング無しの問題とは、報酬のみを伴い、ペナルティが科せられない一部のプルーフ・オブ・ステークのメカニズムにおける概念上の問題です。 ステーキングが要求されない場合、実利を求めるバリデータは、報酬を増やすために、ブロックチェーンのいかなるいかなるフォークに対して、あるいは複数のフォークに対して喜んでアテステーションを行うでしょう。 イーサリアムでは、ファイナリティ条件とスラッシングのメカニズムを採用することで、唯一の正規チェーンを維持できるようにしています。
-[ステーキング無し問題についての詳細](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed)
+[ナッシング・アット・ステーク問題の詳細](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed)
## フォーク選択アルゴリズムとは何ですか? {#what-is-a-fork-choice-algorithm}
@@ -109,13 +109,13 @@ lang: ja
イーサリアムでは、LMD-GHOSTというフォーク選択アルゴリズムを採用しています。 このアルゴリズムでは、アテステーションの加重が最も大きいフォーク、つまりステーキングされたイーサ量を最も多く集めたフォークが選択されます。
-[LMD-GHOSTについての詳細](/developers/docs/consensus-mechanisms/pos/gasper/#fork-choice)
+[LMD-GHOSTの詳細](/developers/docs/consensus-mechanisms/pos/gasper/#fork-choice)
## プルーフ・オブ・ステークにおけるファイナリティとは何ですか? {#what-is-finality}
プルーフ・オブ・ステークにおけるファイナリティとは、特定のブロックが正規チェーンの永続的な一部となり、攻撃者がステーキングされたイーサ総量の33%をバーンすることでコンセンサス障害を発生させない限り、取り消すことができない状況を指します。 これは、「暗号経済的な」ファイナリティであり、プルーフ・オブ・ワークを採用したブロックチェーンにおける「確率論的なファイナリティ」と対比される概念です。 確率論的なファイナリティにおいては、ブロックに対して明確にファイナライズされた/されていない状態というものが存在しません。つまり、各ブロックは、作成後の時間が経過するに従ってチェーンから削除される可能性が徐々に少なくなり、ユーザー自身が当該ブロックが「安全」である時期が到来したかどうかを決定する必要があるのです。 暗号経済的なファイナリティは、ステーキングされたイーサ総量の66%を占めるユーザーが、チェックポイントとなるブロックのペアを投票することで決定されます。 この投票で認められた場合、チェックポイントであるブロックのペア間に挟まれたブロックは明示的に「ファイナライズ」されます。
-[ファイナリティについての詳細](/developers/docs/consensus-mechanisms/pos/#finality)
+[ファイナリティの詳細](/developers/docs/consensus-mechanisms/pos/#finality)
## 「弱い主観性」とは何ですか? {#what-is-weak-subjectivity}
@@ -127,19 +127,19 @@ lang: ja
現在のところ、検閲耐性を証明するのは困難です。 ただしプルーフ・オブ・ワークの場合とは異なり、プルーフ・オブ・ステークではスラッシングを連携して実行するオプションが提供されるため、検閲するバリデータを罰することができます。 今後予定されているプロトコルの変更では、ブロック作成者とブロック提案者が分離され、作成者が各ブロックに含まなければならないトランザクションのリストが実装されます。 この提案は、提案者/作成者の分離と呼ばれており、バリデータがトランザクションを検閲できなくするために役立ちます。
-[提案者/作成者の分離についての詳細](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme)
+[提案者-ビルダー分離についての詳細](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme)
-## イーサリアムのプルーフ・オブ・ステークに対しては、51%攻撃が可能ですか? {#pos-51-attack}
+## イーサリアムのプルーフ・オブ・ステークに対しては、51%攻撃が可能ですか? PoSの51%攻撃 {#pos-51-attack}
プルーフ・オブ・ワークの場合と同様に、プルーフ・オブ・ステークも51%攻撃に対する脆弱性が存在します。 ただし、攻撃者に必要なのはネットワーク全体のハッシュパワーのうち51%ではなく、ステーキングされたイーサ総量の51%である点が異なります。 攻撃者は、ステーキングされたイーサ総量の51%することで、フォーク選択アルゴリズムを支配することが可能になります。 この場合、攻撃者は一部のトランザクションを検閲し、ショートレンジの再編成を行い、自分に有利になるようにブロックの順序を入れ換えることでMEVを獲得することができます。
-[プルーフ・オブ・ステークに対する攻撃の詳細](/developers/docs/consensus-mechanisms/pos/attack-and-defense)
+[プルーフ・オブ・ステークへの攻撃に関する詳細](/developers/docs/consensus-mechanisms/pos/attack-and-defense)
## ソーシャル・コーディネーションとは何であり、なぜ必要なのですか? {#what-is-social-coordination}
ソーシャル・コーディネーションは、イーサリアムにおける最後の防衛ラインであり、不正なブロックをファイナライズした攻撃から、正当なチェーンを回復することが可能になるものです。 この場合、イーサリアム・コミュニティは「帯域外」で連携して、正当な少数派フォークを採用することに合意し、同時に攻撃者のバリデータに対してスラッシングを実行する必要があります。 このプロセスには、正当なフォークを認識するためのアプリおよび取引所も必要になります。
-[ソーシャル・コーディネーションについての詳細](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense)
+[ソーシャルコーディネーションの詳細](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense)
## プルーフ・オブ・ステークでは、すでに資金が豊富なユーザーがさらに富を得るのですか? {#do-rich-get-richer}
@@ -147,15 +147,15 @@ lang: ja
## プルーフ・オブ・ステークのメカニズムは、プルーフ・オブ・ワークよりも分散性が低いのですか? {#is-pos-decentralized}
-いいえ。むしろプルーフ・オブ・ワークの方が、マイニングの費用が高額になり、参加できないユーザーや中小企業等が増加するため、分散性が損なわれます。 プルーフ・オブ・ステークが現在直面している課題は、流動性ステーキングデリバティブ(LSD)の影響をどう排除するかです。 LSDは、一部のプロバイダーがステーキングしたイーサを原資産とするトークンであり、ステーキングされた実際のイーサを解除することなく、流通市場で誰もがスワップすることができます。 このようなLSDを用いることで、32イーサ未満の資産でもステーキングが可能にありますが、ステークの大部分を少数の大規模組織が支配することが可能になるため、中央集権化のリスクを生み出してしまいます。 このため、イーサリアムにおいては [ソロ・ステーキング](/staking/solo)が最善の選択肢なのです。
+いいえ。むしろプルーフ・オブ・ワークの方が、マイニングの費用が高額になり、参加できないユーザーや中小企業等が増加するため、分散性が損なわれます。 プルーフ・オブ・ステークが現在直面している課題は、流動性ステーキングデリバティブ(LSD)の影響をどう排除するかです。 LSDは、一部のプロバイダーがステーキングしたイーサを原資産とするトークンであり、ステーキングされた実際のイーサを解除することなく、流通市場で誰もがスワップすることができます。 このようなLSDを用いることで、32イーサ未満の資産でもステーキングが可能にありますが、ステークの大部分を少数の大規模組織が支配することが可能になるため、中央集権化のリスクを生み出してしまいます。 このため、イーサリアムにおいては[ソロ・ステーキング](/staking/solo)が最善の選択肢なのです。
-[LSDによるステークの分散性低下についての詳細](https://notes.ethereum.org/@djrtwo/risks-of-lsd)
+[LSDにおけるステークの中央集権化に関する詳細](https://notes.ethereum.org/@djrtwo/risks-of-lsd)
## ステーキングにイーサしか利用できないのはなぜですか? {#why-can-i-only-stake-eth}
ETHはイーサリアムにおけるネイティブな通貨です。 投票の加重を決定し、セキュリティを維持するためには有効残高を正確に計算することが必要であり、それには、すべてのステーキングを同一の単位で表示する単一の通貨を定めなければなりません。 ETHは、それ自体がイーサリアムの基本的な構成要素であり、単なるスマートコントラクトとは言えません。 他の通貨を利用可能にする場合、ステーキングのプロセスがさらに複雑になり、安全性が低下します。
-## イーサリアムは、プルーフ・オブ・ステークを採用した唯一のブロックチェーンですか? {#is-ethereum-the-only-pos-blockchain}
+## イーサリアムは、プルーフ・オブ・ステークを採用した唯一のブロックチェーンですか? PoSブロックチェーンはイーサリアムだけか {#is-ethereum-the-only-pos-blockchain}
いいえ、他にもプルーフ・オブ・ステークを採用しているブロックチェーンが存在します。 ただし、イーサリアムにおけるプルーフ・オブ・ステークは独自のメカニズムを採用しており、他のブロックチェーンの場合とは異なります。
@@ -167,6 +167,6 @@ ETHはイーサリアムにおけるネイティブな通貨です。 投票の
## 生存性および安全性とは何ですか? {#what-are-liveness-and-safety}
-生存性と安全性は、ブロックチェーンにおいて最も基本的なセキュリティ上の懸念事項です。 生存性とは、ファイナライズされたチェーンが存在することを指します。 つまり、チェーンのファイナライズが実行されなくなったり、ユーザーがファイナライズされたチェーンに簡単にアクセスできなくなった場合、生存性が失われたと言えます。 また、ネットワークへのアクセス費用が非常に高額になった場合も、生存性が失われたと考えられるでしょう。 一方、安全性とは、チェーンへの攻撃(競合するチェックポイントをファイナライズすること)がどれだけ困難であるかを示す概念です。
+生存性と安全性は、ブロックチェーンにおいて最も基本的なセキュリティ上の懸念事項です。 生存性とは、ファイナライズされたチェーンが存在することを指します。 つまり、チェーンのファイナライズが実行されなくなったり、ユーザーがファイナライズされたチェーンに簡単にアクセスできなくなった場合、生存性が失われたと言えます。 また、ネットワークへのアクセス費用が非常に高額になった場合も、生存性が失われたと考えられるでしょう。 安全性とは、チェーンを攻撃すること、つまり競合するチェックポイントをファイナライズすることが、どれほど困難であるかを指します。
-[キャスパー文書でより詳細に学ぶ](https://arxiv.org/pdf/1710.09437.pdf)
+[Casperの論文で続きを読む](https://arxiv.org/pdf/1710.09437.pdf)
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/gasper/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/gasper/index.md
index 49dd0dd9353..243dcb737e5 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/gasper/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/gasper/index.md
@@ -1,18 +1,18 @@
---
-title: ガスパー (Gasper)
-description: ガスパー・プルーフ・オブ・ステーク・メカニズムの説明
+title: "ガスパー (Gasper)"
+description: "ガスパー・プルーフ・オブ・ステーク・メカニズムの説明"
lang: ja
---
ガスパー(Gasper)は、Casper-FFG (Casper the Friendly Finality Gadget)とLMD-GHOSTフォーク・チョイス・アルゴリズムを組み合わせたものです。 これらのコンポーネントが合わさって、プルーフ・オブ・ステークのイーサリアムを保護する合意メカニズムを形成します。 Casper(キャスパー)は、特定のブロックを「ファイナライズ (確定) 」にアップグレードするメカニズムであり、ネットワークへの新規参入者が正規のブロックチェーンと同期していることが確信できます。 フォーク・チョイス・アルゴリズムは、ブロックチェーンでフォークの発生時に、累積票を使用してノードが正しいものを簡単に選択できます。
-**注** Casper-FFG の元の定義は、ガスパーを包括させるため、若干更新されました。 このページでは、更新されたバージョンを考慮しています。
+**注** Casper-FFGの元の定義は、Gasperに含めるために若干更新されました。 このページでは、更新されたバージョンを考慮しています。
-## 前提知識
+## 事前に必要な環境
-この資料を理解するためには、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)入門ページを読む必要があります。
+この資料を理解するには、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)の入門ページを読む必要があります。
-## ガスパーの役割 {#role-of-gasper}
+## Gasperの役割 {#role-of-gasper}
ガスパーは、プルーフ・オブ・ステーク・ブロックチェーンの上部にあり、ノードがEtherをセキュリティデポジットとして提供します。このセキュリティデポジットは、ブロックの提案や検証を怠ったり、不正をした場合には破棄されます。 ガスパーは、バリデータがどのように報酬と罰を受け、どのブロックを受け入れ、拒否するかを決定し、ブロックチェーンのどのフォークで構築するかを定めるメカニズムです。
@@ -20,33 +20,34 @@ lang: ja
ファイナリティとは、ブロックのプロパティで、致命的なコンセンサスの障害があり、攻撃者が少なくともステークされたETH総数の3分の1を破壊しない限り、元に戻すことはできないことを意味します。 ファイナライズされたブロックは、ブロックチェーンが確信している情報だと考えることができます。 ファイナライズされるには、ブロックは2つのステップのアップブレード手順を経る必要があります。
-1. ステークされたETH総数の3分の2が、そのブロックが正規のチェーンに含まれることに賛成票を投じることが必要。 この条件によって、ブロックは「正当 (justified)」にアップグレードされる。 正当とされたブロックは、元に戻される可能性は低いものの、一定の条件下で元に戻されることがある。
+1. ステークされたETH総数の3分の2が、そのブロックが正規のチェーンに含まれることに賛成票を投じることが必要。 この条件によって、ブロックは「正当 (justified)」にアップグレードされる。
+ 正当とされたブロックは、元に戻される可能性は低いものの、一定の条件下で元に戻されることがある。
2. 正当とされたブロック上で、別のブロックが再び正当となった時、「ファイナライズ」にアップグレードされる。 ブロックがファイナライズされるとは、いわば正規チェーンにそのブロックを含めることにコミットすることである。 攻撃者が、数百万ETH (数十億$USD)を破壊しない限り、元に戻すことはできない。
-これらのブロックのアップグレードは、すべてのスロットで発生するわけではありません。 エポック境界ブロックが、正当およびファイナライズになることがあります。 これらのブロックは、「チェックポイント」とも呼ばれています。 アップグレードは、チェックポイントのペアを考慮します。 2つの連続するチェックポイント(すなわち、チェックポイントBが、チェックポイントAの正しい子孫であるというステークされたETH総数の3分の2の投票) 間に、「スーパーマジョリティ・リンク」が存在する必要があります。
+これらのブロックのアップグレードは、すべてのスロットで発生するわけではありません。 エポック境界ブロックが、正当およびファイナライズになることがあります。 これらのブロックは、「チェックポイント」とも呼ばれています。 アップグレードは、チェックポイントのペアを考慮します。 より古いチェックポイントをファイナライズ済みに、より新しいブロックを正当化済みに更新するには、2つの連続したチェックポイント間に「スーパーマジョリティ・リンク」が存在する必要があります(すなわち、ステークされたether総量の3分の2が、チェックポイントBがチェックポイントAの正しい子孫であると投票すること)。
ファイナリティには、ブロックが正規なものであるという3分の2の合意が必要となるため、攻撃者はファイナライズされたチェーンの代替を次の方法でしか作成できません。
1. ステークされたETH総数の3分の2を所有または操作する。
2. ステークされたETH総数の少なくとも3分の1を破壊する。
-1つ目の条件が生じるのは、チェーンをファイナライズさせるにはステークされたETHの3分の2が必要なためです。 2つ目の条件が生じるのは、ステーク合計の3分の2が両方のフォークに賛成票を投じた場合、3分の1が両方に投票したことになるためです。 2重投票は、最大限の処罰を受けるスラッシング条件で、ステーキング総額の3分の1が破壊されます。 2022年5月の時点では、攻撃者は約100億ドル相当のETHをバーン(燃焼)する必要があります。 ガスパーのブロックを正当化およびファイナライズさせるアルゴリズムは、[Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437.pdf)を少し変更した形式となっています。
+1つ目の条件が生じるのは、チェーンをファイナライズさせるにはステークされたETHの3分の2が必要なためです。 2つ目の条件が生じるのは、ステーク合計の3分の2が両方のフォークに賛成票を投じた場合、3分の1が両方に投票したことになるためです。 2重投票は、最大限の処罰を受けるスラッシング条件で、ステーキング総額の3分の1が破壊されます。 2022年5月の時点では、攻撃者は約100億ドル相当のETHをバーン(燃焼)する必要があります。 Gasperのブロックを正当化およびファイナライズするアルゴリズムは、[Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437.pdf)を若干変更した形式です。
### インセンティブとスラッシング {#incentives-and-slashing}
バリデータは、誠実にブロックを提案し、検証することで報酬を得ることができます。 ETHが報酬として与えられ、ステークに加えられます。 一方、呼び出されたときにオフラインおよび行動しなかったバリデータは、これらの報酬を逃し、時には既存のステークのごく一部を失うこともあります。 しかし、オフラインであることのペナルティは小さく、ほとんどの場合、報酬を逃したことによる機会コストに相当します。 ただし、一部のバリデータには、偶然に実行することが非常に困難であり、同じスロットに対して複数のブロックを提案する、同じスロットに対して複数のブロックを証明する、または以前のチェックポイントの投票に矛盾するなど、何らかの悪意が感じられる行動を取るものもあります。 これらは、「スラッシング対象」となる行為であり、より厳しいペナルティが課されます。スラッシングされると、バリデータのステークの一部は破壊され、そのバリデータはネットワークから削除されます。 このプロセスには、36日間を要します。 第1日目における初回のペナルティは、最大1ETHまでです。 次に、スラッシュシングされたバリデータのETHは、退出期間全体を通してゆっくりと失われます。18日目には、「相関ペナルティ」が発生し、これは、より多くのバリデータが同時にスラッシングされた場合に大きくなります。 最大のペナルティは、ステーク全額です。 これらの報酬とペナルティは、誠実なバリデータにインセンティブを与え、ネットワークへの攻撃を阻害するように設計されています。
-### 非稼働リーク {#inactivity-leak}
+### 無活動リーク {#inactivity-leak}
セキュリティだけでなく、ガスパーは、「信ぴょう性のある生存度」も提供します。 これは、ステークされたETH総数の3分の2が、誠実な投票をしており、プロトコルに従っている限り、他のアクティビティ(攻撃、遅延、スラッシングなど)に関係なく、チェーンがファイナライズできるという条件です。 言い換えれば、ステークされたETH合計の3分の1は、チェーンがファイナライズするのを防ぐために何らかの方法で損なわれる必要があります。 ガスパーには、「非稼働リーク」として知られる生存度障害に対する追加の防御策があります。 このメカニズムは、4エポック以上、チェーンのファイナライズに失敗した場合に作動します。 マジョリティのチェーンを積極的に証明しないバリデータは、マジョリティがステーク合計の3分の2を取り戻すまで、バリデータのステークが徐々に失われるため、生存度障害が確実に一時的なものになるようにします。
-### フォークの選択 {#fork-choice}
+### フォーク選択 {#fork-choice}
-オリジナルのCasper-FFGの定義には、次のルールを課すフォーク・チョイス・アルゴリズムを含んでいました。 `follow the chain containing the justified checkpoint that has the greatest height` ここで、「高さ (Height) 」は始まりのブロックからの最大距離として定義されます。 ガスパーでは、LMD-GHOSTと呼ばれるより洗練されたアルゴリズムが選ばれたため、元のフォーク・チョイス・ルールは廃止されました。 通常の条件下では、フォーク・チョイス・ルールは不要であることを認識することが重要です。スロットごとに単一のブロック提案者がいて、誠実なバリデータがそれを証明するだけです。 ネットワークの非同期性が大きい場合や、または不誠実なブロック提案者がフォーク・チョイス・アルゴリズムが必要であると主張した場合にのみ必要です。 ただし、これらのケースが発生した場合、フォーク・チョイス・アルゴリズムは、正しいチェーンを保護する重要な防御策になります。
+Casper-FFGの元の定義には、「`follow the chain containing the justified checkpoint that has the greatest height`」というルールを課すフォーク選択アルゴリズムが含まれていました。ここで、height(高さ)はジェネシスブロックからの最長距離として定義されます。 ガスパーでは、LMD-GHOSTと呼ばれるより洗練されたアルゴリズムが選ばれたため、元のフォーク・チョイス・ルールは廃止されました。 通常の条件下では、フォーク・チョイス・ルールは不要であることを認識することが重要です。スロットごとに単一のブロック提案者がいて、誠実なバリデータがそれを証明するだけです。 ネットワークの非同期性が大きい場合や、または不誠実なブロック提案者がフォーク・チョイス・アルゴリズムが必要であると主張した場合にのみ必要です。 ただし、これらのケースが発生した場合、フォーク・チョイス・アルゴリズムは、正しいチェーンを保護する重要な防御策になります。
LMD-GHOSTは、「Latest Message-Driven Greedy Heaviest Observed Sub-Tree」の略です。 これは、専門用語が多い定義ですが、アテステーションの最大の累積重みを持つフォークを正規のものとして選択し(Greedy Heaviest SubTree)、バリデータから複数のメッセージを受信した場合、最新のメッセージ(Latest-Message Driven)のみが考慮されるというアルゴリズムです。 最大の累積重みを持つブロックを正規チェーンに追加する前に、すべてのバリデータがこのLMD-GHOSTルールを使用して各ブロックを評価します。
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [ガスパー: GHOSTとキャスパーの組み合わせ](https://arxiv.org/pdf/2003.03052.pdf)
-- [キャスパー:フレンドリーなファイナリティ用ガジェット](https://arxiv.org/pdf/1710.09437.pdf)
+- [Gasper: Combining GHOST and Casper](https://arxiv.org/pdf/2003.03052.pdf)
+- [Casper the Friendly Finality Gadget](https://arxiv.org/pdf/1710.09437.pdf)
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/index.md
index b5d0c0bfb5e..c453d47d3ec 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/index.md
@@ -1,14 +1,14 @@
---
-title: プルーフ・オブ・ステーク(PoS)
-description: イーサリアムにおけるプルーフ・オブ・ステーク (PoS)プロトコルとその役割
+title: "プルーフ・オブ・ステーク(PoS)"
+description: "イーサリアムにおけるプルーフ・オブ・ステーク (PoS)プロトコルとその役割"
lang: ja
---
-プルーフ・オブ・ステーク(PoS)は、イーサリアムの[合意形成のメカニズム](/developers/docs/consensus-mechanisms/)の基礎となっています。 イーサリアムは2022年プルーフ・オブ・ステークのメカニズムに移行しました。これまでの[プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow)のアーキテクチャと比較して、より安全で、エネルギー消費量が少なく、新たなスケーリングソリューションの導入に適しています。
+プルーフ・オブ・ステーク(PoS)は、イーサリアムの[コンセンサスメカニズム](/developers/docs/consensus-mechanisms/)の基礎となっています。 イーサリアムは2022年、プルーフ・オブ・ステークメカニズムに移行しました。これまでの[プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow)アーキテクチャと比較して、より安全で、エネルギー消費量が少なく、新たなスケーリングソリューションの導入に適しているためです。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-このページをより理解するために、まずは[合意メカニズム](/developers/docs/consensus-mechanisms/)を読むことをお勧めします。
+このページをよりよく理解するために、まず[コンセンサスメカニズム](/developers/docs/consensus-mechanisms/)について読むことをお勧めします。
## プルーフ・オブ・ステーク(PoS)とは {#what-is-pos}
@@ -20,38 +20,39 @@ lang: ja
プルーフ・オブ・ワークでは、ブロックのタイミングはマイニングの難易度によって決まりますが、プルーフ・オブ・ステークでは、間隔は固定されています。 プルーフ・オブ・ステークのイーサリアムにおける時間は、スロット(12秒)とエポック(32スロット)に分かれています。 すべてのスロットで、1つのバリデータがランダムに選択され、ブロックを提案できます。 このバリデータは新しいブロックを作成後、ネットワーク上の他のノードに新しいブロックを送信します。 また、すべてのスロットでバリデータの委員会がランダムに選択され、提案されているブロックの有効性を判断し、投票が行われます。 バリデータセットを委員会に分割することは、ネットワークの負荷を管理可能な状態に維持するために重要です。 委員会は、すべてのアクティブなバリデータが、各スロットではなく各エポックにで証明できるように、バリデータのセットを分割します。
-## イーサリアムのプルーフ・オブ・ステークでは、トランザクションはどのように実行されるか? {#transaction-execution-ethereum-pos}
+## イーサリアムPoSにおけるトランザクションの実行方法 {#transaction-execution-ethereum-pos}
以下では、イーサリアムのプルーフ・オブ・ステークにおいて、トランザクションがどのように実行するかをエンドツーエンドの視点で説明します。
-1. ユーザーはまず、自分の秘密鍵を使って[トランザクション](/developers/docs/transactions/)を作成し、署名します。 この作業は通常、ウォレットや、[ethers.js](https://docs.ethers.org/v6/)、[web3js](https://docs.web3js.org/)、[web3py](https://web3py.readthedocs.io/en/v5/)といったライブラリにより実行されますが、実際には、ユーザーはイーサリアムの[JSON-RPC API](/developers/docs/apis/json-rpc/)を用いてノードへのリクエストを実行しています。 作成ユーザーは、バリデータに支払う意思があるチップとして特定のガス代を提示することで、このトランザクションをブロックに追加してもらえるように促します。 この[チップ](/developers/docs/gas/#priority-fee)はバリデータに支払われ、[ベース報酬](/developers/docs/gas/#base-fee)はバーンされます。
-2. 作成されたトランザクションは、イーサリアムの[実行クライアント](/developers/docs/nodes-and-clients/#execution-client)に送信され、実行クライアントにおいてその有効性が検証されます。 この検証では、送信者がトランザクションを実行するために十分なイーサ残高を持っているか、および適切な鍵で署名されているかを確認できます。
-3. トランザクションが有効であれば、実行クライアントは自分のローカルメムプール(実行待ちのトランザクションリスト)にこのトランザクションを追加し、さらに、実行レイヤーのゴシップネットワークを通じてその他のノードにこのトランザクションを送信します。 このトランザクションについて耳にしたその他のノードも、自分のメムプールにこのトランザクションを追加します。 より高度なユーザーは、トランザクションをブロードキャストすることを避けて、[フラッシュボット・オークション](https://docs.flashbots.net/flashbots-auction/overview)などの特化されたブロックビルダーに送信してもよいでしょう。 これにより、今後のブロックにトランザクションを追加する順番を整理することで、利益を最大化することができます([MEV](/developers/docs/mev/#mev-extraction))。
-4. ネットワーク上のバリデータノードの1つが、RANDAOを使用して疑似ランダムに選ばれ、現在のスロットのブロック提案者となります。 ブロック提案者のノードは、イーサリアムのブロックチェーンに追加される次のブロックを生成、ブロードキャストし、グローバルステートを更新する役割を担います。 このノードは、実行クライアント、コンセンサスクライアント、およびバリデータクライアントの3つの部分で構成されます。 実行クライアントは、ローカルのメムプールに含まれるトランザクションを「実行ペイロード」としてバンドル化した上でローカルに実行し、状態変更を生成します。 状態変更の情報はコンセンサスクライアントに送信され、コンセンサスクライアントにおいて実行ペイロードが「ビーコンブロック」の一部としてラップされます。ビーコンブロックにはその他にも、報酬、ペナルティ、スラッシング、アテステーション等に関する情報が含まれており、チェーンの先頭におけるブロックのシーケンスについてネットワーク全体が合意することが可能になります。 実行クライアントとコンセンサスクライアントとの間のコミュニケーションについては、[「コンセンサスクライアントと実行クライアントを接続する」](/developers/docs/networking-layer/#connecting-clients)でより詳細に説明されています。
-5. 他のノードは、コンセンサスレイヤーのゴシップネットワークでこの新しいビーコンブロックを受け取ります。 その上で、このビーコンブロックを実行クライアントに送信し、実行クライアントがローカルでトランザクションを再実行することで、提案された状態変更が有効なものであることを確認します。 次にバリデータクライアントが、当該ブロックが有効であり、自分のチェーンビューにおいて論理的な次のブロックであるとのアテステーションを実行します(つまり、[フォーク選択ルール](/developers/docs/consensus-mechanisms/pos/#fork-choice)の規定に基づき、最大の重みを持つアテステーションに基づいてチェーンを構築します)。 当該ブロックは、アテステーションを実行した各ノードのローカルデータベースに追加されます。
+1. ユーザーは自身の秘密鍵で[トランザクション](/developers/docs/transactions/)を作成し、署名します。 これは通常、ウォレットや[ethers.js](https://docs.ethers.org/v6/)、[web3js](https://docs.web3js.org/)、[web3py](https://web3py.readthedocs.io/en/v5/)などのライブラリによって処理されますが、内部的にはユーザーはイーサリアムの[JSON-RPC API](/developers/docs/apis/json-rpc/)を使用してノードにリクエストを送信しています。 作成ユーザーは、バリデータに支払う意思があるチップとして特定のガス代を提示することで、このトランザクションをブロックに追加してもらえるように促します。 [チップ](/developers/docs/gas/#priority-fee)はバリデータに支払われ、[ベースフィー](/developers/docs/gas/#base-fee)はバーンされます。
+2. トランザクションはイーサリアムの[実行クライアント](/developers/docs/nodes-and-clients/#execution-client)に送信され、その有効性が検証されます。 この検証では、送信者がトランザクションを実行するために十分なイーサ残高を持っているか、および適切な鍵で署名されているかを確認できます。
+3. トランザクションが有効であれば、実行クライアントは自分のローカルメムプール(実行待ちのトランザクションリスト)にこのトランザクションを追加し、さらに、実行レイヤーのゴシップネットワークを通じてその他のノードにこのトランザクションを送信します。 このトランザクションについて耳にしたその他のノードも、自分のメムプールにこのトランザクションを追加します。 上級ユーザーは、トランザクションをブロードキャストせず、代わりに[Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview)のような専門のブロックビルダーに転送することもあります。 これにより、次のブロック内のトランザクションを整理して、利益を最大化することができます([MEV](/developers/docs/mev/#mev-extraction))。
+4. ネットワーク上のバリデータノードの1つが、RANDAOを使用して疑似ランダムに選ばれ、現在のスロットのブロック提案者となります。 ブロック提案者のノードは、イーサリアムのブロックチェーンに追加される次のブロックを生成、ブロードキャストし、グローバルステートを更新する役割を担います。 このノードは、実行クライアント、コンセンサスクライアント、およびバリデータクライアントの3つの部分で構成されます。 実行クライアントは、ローカルのメムプールに含まれるトランザクションを「実行ペイロード」としてバンドル化した上でローカルに実行し、状態変更を生成します。 状態変更の情報はコンセンサスクライアントに送信され、コンセンサスクライアントにおいて実行ペイロードが「ビーコンブロック」の一部としてラップされます。ビーコンブロックにはその他にも、報酬、ペナルティ、スラッシング、アテステーション等に関する情報が含まれており、チェーンの先頭におけるブロックのシーケンスについてネットワーク全体が合意することが可能になります。 実行クライアントとコンセンサスクライアント間の通信については、[コンセンサスクライアントと実行クライアントの接続](/developers/docs/networking-layer/#connecting-clients)で詳しく説明されています。
+5. 他のノードは、コンセンサスレイヤーのゴシップネットワークでこの新しいビーコンブロックを受け取ります。 その上で、このビーコンブロックを実行クライアントに送信し、実行クライアントがローカルでトランザクションを再実行することで、提案された状態変更が有効なものであることを確認します。 次にバリデータクライアントは、そのブロックが有効であり、自身のチェーンビューにおいて論理的な次のブロックであるとアテステーションします(つまり、[フォーク選択ルール](/developers/docs/consensus-mechanisms/pos/#fork-choice)で定義されているように、アテステーションの重みが最も大きいチェーン上に構築されることを意味します)。 当該ブロックは、アテステーションを実行した各ノードのローカルデータベースに追加されます。
6. トランザクションは、2つのチェックポイント間の「過半数リンク」を持った形でチェーンの一部となった場合に、「ファイナライズ済み」であると見なすことができます。 チェックポイントは、各エポックの開始時に発生します。このチェックポイントは、各スロットではアクティブなバリデータのサブセットが証明を行いますが、各エポック全体では、すべてのアクティブなバリデータが証明を行っていることを示すためのものです。 そのため、「過半数リンク」が実証できるのはエポック間のみです(これは、ネットワーク上でステーキングされたETH全体の66%が2つのチェックポイントに合意した場所)。
ファイナリティに関する詳細については、以下をご覧ください。
## ファイナリティ {#finality}
-分散ネットワークにおけるトランザクションのファイナリティとは、ブロックの当該部分を変更するためには大量のイーサをバーンする必要がある場合に達成されます。 イーサリアムのプルーフ・オブ・ステークでは、ファイナリティは「チェックポイント」ブロックを用いて管理されます。 各エポックの最初のブロックがチェックポイントになります。 バリデータは、有効だと見なすチェックポイントのペアに対して投票を行います。 ステーキングされたイーサの合計のうち少なくとも3分の2が当該のチェックポイントのペアに対して投票した場合、これらのチェックポイントは更新されます。 2つの(ターゲットである)チェックポイントのうち、より新しいチェックポイントの方が「正当化」されます。 チェックポイントのペアにおけるより古いチェックポイントは、1つ前のエポックにおいて「ターゲット」のチェックポイントとしてすでに正当化されています。 こうして正当化されたチェックポイントは、「ファイナライズ済み」にアップグレードされます。
+分散ネットワークにおけるトランザクションのファイナリティとは、ブロックの当該部分を変更するためには大量のイーサをバーンする必要がある場合に達成されます。 イーサリアムのプルーフ・オブ・ステークでは、ファイナリティは「チェックポイント」ブロックを用いて管理されます。 各エポックの最初のブロックがチェックポイントになります。 バリデータは、有効だと見なすチェックポイントのペアに対して投票を行います。 ステーキングされたイーサの合計のうち少なくとも3分の2が当該のチェックポイントのペアに対して投票した場合、これらのチェックポイントは更新されます。 2つの(ターゲットである)チェックポイントのうち、より新しいチェックポイントの方が「正当化」されます。 チェックポイントのペアにおけるより古いチェックポイントは、1つ前のエポックにおいて「ターゲット」のチェックポイントとしてすでに正当化されています。 こうして正当化されたチェックポイントは、「ファイナライズ済み」にアップグレードされます。 このチェックポイントをアップグレードするプロセスは、**[Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437)**によって処理されます。 Casper-FFGはコンセンサスのためのブロックファイナリティツールです。 ブロックが一度ファイナライズされると、ステーカーの大多数のスラッシングなしには覆したり変更したりすることはできず、経済的に実行不可能になります。
-攻撃者は、ステーキングされたイーサの総供給量のうち少なくとも3分の1を犠牲にすれば、ファイナライズされたブロックを以前の状態に戻すことが可能になります。 このように設定されている具体的な理由については、こちらの[イーサリアム・ファウンデーションによるブログ投稿](https://blog.ethereum.org/2016/05/09/on-settlement-finality/)をご覧ください。 ファイナリティを達成するには3分の2以上の投票が必要であるため、攻撃者は、ステーキングされたイーサ合計の3分の1を投じることで、ネットワークのファイナリティ実現を阻止することが可能です。 ただし、この攻撃を防ぐために、[インアクティブ・リーク](https://eth2book.info/bellatrix/part2/incentives/inactivity)という防御メカニズムが導入されています。 インアクティブ・リークは、チェーンが4エポック以上にわたりファイナライズに失敗した場合に発動します。 インアクティブ・リークが実行されると、多数派に対抗して投票したバリデータがステーキングしたイーサが没収されるため、多数派のユーザーが3分の2の過半数を取り戻し、チェーンのファイナライズを完了できるようになります。
+攻撃者は、ステーキングされたイーサの総供給量のうち少なくとも3分の1を犠牲にすれば、ファイナライズされたブロックを以前の状態に戻すことが可能になります。 この正確な理由は、こちらの[イーサリアム・ファウンデーションのブログ記事](https://blog.ethereum.org/2016/05/09/on-settlement-finality/)で説明されています。 ファイナリティを達成するには3分の2以上の投票が必要であるため、攻撃者は、ステーキングされたイーサ合計の3分の1を投じることで、ネットワークのファイナリティ実現を阻止することが可能です。 これに対抗するメカニズムとして、[非アクティブリーク](https://eth2book.info/bellatrix/part2/incentives/inactivity)があります。 インアクティブ・リークは、チェーンが4エポック以上にわたりファイナライズに失敗した場合に発動します。 インアクティブ・リークが実行されると、多数派に対抗して投票したバリデータがステーキングしたイーサが没収されるため、多数派のユーザーが3分の2の過半数を取り戻し、チェーンのファイナライズを完了できるようになります。
-## 暗号経済におけるセキュリティとは {#crypto-economic-security}
+## 暗号経済学的セキュリティ {#crypto-economic-security}
バリデータを務めることは、ひとつのコミットメントです。 バリデータは、ブロックの検証/提案を行うのに必要な水準のハードウェアとネット接続を維持することが要求されます。 バリデータはその代償として、イーサを受け取ります(ステーキングした残高が増加します)。 一方で、バリデータとしてネットワークに参加することで、ユーザーは個人的な利益や迷惑行為を目的としてネットワークを攻撃できる手段が得られることも事実です。 これを防止する手段として、呼び出し時に参加しなかったバリデータはイーサ報酬を受け取ることができず、不正行為を行った場合には既存のステークが没収されます。 バリデータにおける不正行為とは主に、1つのスロットで複数のブロックを提案する場合(曖昧化)と、相互に矛盾するアテステーションを提出する場合の2種類が考えられます。
-スラッシングされるイーサの額は、ほぼ同時にスラッシング対象となるバリデータの数に応じて異なります。 これは[相関性ペナルティ](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty)と呼ばれており、スラッシングされる額がわずかである場合(1名のバリデータにおけるスラッシング額がステーキングした全体の1%未満である場合)から、ステーキング残高の100%が没収される場合(大規模なスラッシングイベント)までさまざまです。 スラッシングは、1日目には即時のペナルティ(最大1イーサまで)で科され、18日目にはコリレーション・ペナルティが科され、最終的に36日目にはネットワークからの強制退出が実行されます。そのため、コリレーション・ペナルティは、強制退出に至る期間の中間点で実行されることになります。 バリデータがネットワークに参加していても、投票を実行しない場合、アテステーションに対する軽微なペナルティが毎日科されます。 これらの防御システムはすべて、組織的な攻撃者による攻撃が非常にコスト高になるように設計されています。
+スラッシングされるイーサの額は、ほぼ同時にスラッシング対象となるバリデータの数に応じて異なります。 これは["相関ペナルティ"](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty)として知られており、軽微な場合(単独でスラッシュされた単一バリデータのステークの約1%)から、バリデータのステークが100%破棄される(大量スラッシングイベント)場合まであります。 スラッシングは、1日目には即時のペナルティ(最大1イーサまで)で科され、18日目にはコリレーション・ペナルティが科され、最終的に36日目にはネットワークからの強制退出が実行されます。そのため、コリレーション・ペナルティは、強制退出に至る期間の中間点で実行されることになります。 バリデータがネットワークに参加していても、投票を実行しない場合、アテステーションに対する軽微なペナルティが毎日科されます。
+これらの防御システムはすべて、組織的な攻撃者による攻撃が非常にコスト高になるように設計されています。
-## フォーク・チョイス {#fork-choice}
+## フォーク選択 {#fork-choice}
-ネットワークが最適化された誠実な方法で実行されている場合、チェーンの先頭には常に新規ブロックが1つだけ存在し、すべてのバリデータがこの新規ブロックに対してアテステーションを実行しています。 しかし、ネットワークが遅延したり、ブロック提案者が曖昧化を実行した場合、各バリデータに対するチェーンの先頭のビューが異なる可能性があります。 このため、コンセンサスクライアントでは、どのフォークを支持すべきかについてのアルゴリズムが必要になります。 イーサリアムのプルーフ・オブ・ステークで採用されているアルゴリズムは[LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf)と呼ばれ、履歴においてアテステーションの重みが最大であるフォークを特定する方式です。
+ネットワークが最適化された誠実な方法で実行されている場合、チェーンの先頭には常に新規ブロックが1つだけ存在し、すべてのバリデータがこの新規ブロックに対してアテステーションを実行しています。 しかし、ネットワークが遅延したり、ブロック提案者が曖昧化を実行した場合、各バリデータに対するチェーンの先頭のビューが異なる可能性があります。 このため、コンセンサスクライアントでは、どのフォークを支持すべきかについてのアルゴリズムが必要になります。 プルーフ・オブ・ステークのイーサリアムで使われるアルゴリズムは[LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf)と呼ばれ、その履歴の中で最もアテステーションの重みが大きいフォークを特定することで機能します。
## プルーフ・オブ・ステークとセキュリティ {#pos-and-security}
-プルーフ・オブ・ワークと同様、プルーフ・オブ・ステークにおいても[51%攻撃](https://www.investopedia.com/terms/1/51-attack.asp)の脅威は存在しますが、プルーフ・オブ・ステークでは攻撃者のリスクがさらに高まります。 攻撃者は、ステーキングされたイーサ総量の51%を保有する必要があるからです。 必要なイーサを確保できれば、攻撃者は自分のアテステーションを用いて、希望するフォークでのアテステーションの蓄積量を最大にすることができます。 蓄積されたアテステーションの「重み」は、コンセンサスクライアントが正規チェーンを決定する際に参照する基準となるため、攻撃者は、この「重み」を操作することで、希望するフォークを正規チェーンにすることができます。 しかし、プルーフ・オブ・ワークと比較した場合、プルーフ・オブ・ステークは攻撃者に対する反撃をより柔軟に行えるという利点があります。 例えば、誠実なバリデータは、マイノリティのチェーン構築を継続することで、攻撃者のフォークを無視し、アプリや取引所、プールにも同様の対応を促すことができます。 さらに、攻撃者をネットワークから強制的に排除し、攻撃者がステーキングしたイーサを破壊するように決定することもできます。 これらの手段は、51%攻撃に対する強力な経済的防御メカニズムと言えます。
+プルーフ・オブ・ワークと同様に、プルーフ・オブ・ステークにも[51%攻撃](https://www.investopedia.com/terms/1/51-attack.asp)の脅威は存在しますが、攻撃者にとってはさらにリスクが高くなります。 攻撃者は、ステーキングされたイーサ総量の51%を保有する必要があるからです。 必要なイーサを確保できれば、攻撃者は自分のアテステーションを用いて、希望するフォークでのアテステーションの蓄積量を最大にすることができます。 蓄積されたアテステーションの「重み」は、コンセンサスクライアントが正規チェーンを決定する際に参照する基準となるため、攻撃者は、この「重み」を操作することで、希望するフォークを正規チェーンにすることができます。 しかし、プルーフ・オブ・ワークと比較した場合、プルーフ・オブ・ステークは攻撃者に対する反撃をより柔軟に行えるという利点があります。 例えば、誠実なバリデータは、マイノリティのチェーン構築を継続することで、攻撃者のフォークを無視し、アプリや取引所、プールにも同様の対応を促すことができます。 さらに、攻撃者をネットワークから強制的に排除し、攻撃者がステーキングしたイーサを破壊するように決定することもできます。 これらの手段は、51%攻撃に対する強力な経済的防御メカニズムと言えます。
51%攻撃以外にも、悪意のある者は次のような悪質な行動を企てる可能性があります。
@@ -64,7 +65,7 @@ lang: ja
## メリットとデメリット {#pros-and-cons}
-| メリット | デメリット |
+| 長所 | 短所 |
| ---------------------------------------------------------------------------------------------------- | -------------------------------------------- |
| ステーキングにより個人がネットワークの安全性に参画しやすくなり、分散化を促進。 バリデータノードは通常のラップトップで実行可能。 ステーキングプールを利用すると、32 ETH未満でもステーキング可能。 | プルーフ・オブ・ステークは若く、プルーフ・オブ・ワークと比較して実環境でのテストが少ない |
| ステーキングはより分散型であり、 規模の経済がプルーフ・オブ・ワークのマイニングの場合と同じようには適用されない。 | プルーフ・オブ・ステークは、プルーフ・オブ・ワークよりも実装が複雑 |
@@ -82,16 +83,16 @@ lang: ja
- 不正に対する経済制裁により、プルーフ・オブ・ワークと比較して51%攻撃のコストが高くなる
- 51%攻撃が暗号経済の防御を乗り越えた場合でも、正当なチェーンの社会的な回復が可能
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [プルーフ・オブ・ステークFAQ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _ビタリック・ブテリン_
+- [プルーフ・オブ・ステークFAQ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_
- [プルーフ・オブ・ステークとは](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_
-- [プルーフ・オブ・ステークとは何か、またその重要性](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_
-- [なぜプルーフ・オブ・ステークなのか (2020年11月)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _ビタリック・ブテリン_
-- [プルーフ・オブ・ステーク: 弱い主観性の利点](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _ヴィタリック・ブテリン_
-- [プルーフ・オブ・ステークのイーサリアム対する攻撃と防御](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs)
-- [プルーフ・オブ・ステークの設計思想](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _ヴィタリック・ブテリン_
-- [ヴィタリック・ブテリンがLex Fridmanにプルーフ・オブ・ステークについて解説するビデオ](https://www.youtube.com/watch?v=3yrqBG-7EVE)
+- [プルーフ・オブ・ステークとは何か、なぜそれが重要なのか](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_
+- [なぜプルーフ・オブ・ステークなのか (2020年11月)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_
+- [プルーフ・オブ・ステーク: 私が弱い主観性を愛するようになった経緯](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_
+- [プルーフ・オブ・ステークのイーサリアムにおける攻撃と防御](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs)
+- [プルーフ・オブ・ステークの設計哲学](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_
+- [動画: ヴィタリック・ブテリンがレックス・フリードマンにプルーフ・オブ・ステークを解説](https://www.youtube.com/watch?v=3yrqBG-7EVE)
## 関連トピック {#related-topics}
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/keys/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/keys/index.md
index 16827fb9733..79835cc47a2 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/keys/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/keys/index.md
@@ -1,20 +1,20 @@
---
-title: イーサリアムのプルーフ・オブ・ステークにおける鍵について
-description: イーサリアムにおけるプルーフ・オブ・ステークのコンセンサスメカニズムで使用される各種の鍵の説明
+title: "イーサリアムのプルーフ・オブ・ステークにおける鍵について"
+description: "イーサリアムにおけるプルーフ・オブ・ステークのコンセンサスメカニズムで使用される各種の鍵の説明"
lang: ja
---
イーサリアムでは、公開鍵と秘密鍵による暗号化を用いてユーザーの資産を保護しています。 公開鍵は、イーサリアムアドレスの基盤として使用されるもので、誰もが見ることができ、一意の識別子として使用されます。 一方で、プライベートキー(すなわち「秘密鍵」)はアカウント所有者以外はアクセスできないものでなければなりません。 秘密鍵は、トランザクションおよびデータに「署名」するために用いられ、特定の秘密鍵の所有者がその鍵のアクションを承認したことを暗号化によって証明できるものです。
-イーサリアムの鍵は、[楕円曲線暗号](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography)を用いて生成されます。
+イーサリアムの鍵は、[楕円曲線暗号](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography)を使用して生成されます。
-ただし、イーサリアムにおける[プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow)から[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)への移行に伴い、新たな種類の鍵が追加されています。 従来の鍵も、これまでとまったく同様に機能し、楕円曲線暗号を用いて生成された鍵により保護されるアカウントは従来とまったく変更されません。 しかし、イーサのステーキングやバリデータの実行によりプルーフ・オブ・ステークに参加するには、新しい種類の鍵が必要になります。 この新しい種類の鍵は、暗号化の手段を必要とする非常に多くのバリデータ間におけるメッセージのやりとりが必要であるというスケーラビリティの課題を克服するために導入されたもので、メッセージを集約することで、ネットワークがコンセンサスを実現するために必要なコミュニケーションの規模を縮小することができます。
+しかし、イーサリアムが[プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow)から[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)に移行した際、新しい種類の鍵がイーサリアムに追加されました。 従来の鍵も、これまでとまったく同様に機能し、楕円曲線暗号を用いて生成された鍵により保護されるアカウントは従来とまったく変更されません。 しかし、イーサのステーキングやバリデータの実行によりプルーフ・オブ・ステークに参加するには、新しい種類の鍵が必要になります。 この新しい種類の鍵は、暗号化の手段を必要とする非常に多くのバリデータ間におけるメッセージのやりとりが必要であるというスケーラビリティの課題を克服するために導入されたもので、メッセージを集約することで、ネットワークがコンセンサスを実現するために必要なコミュニケーションの規模を縮小することができます。
-この新しい種類の鍵では、 [**Boneh-Lynn-Shacham (BLS)**署名スキーム](https://wikipedia.org/wiki/BLS_digital_signature)を使用します。 BLSは、署名を非常に効率的に集約できるだけでなく、集約された個々のバリデータの鍵に対してリバースエンジニアリングを実行することも可能であり、バリデータ間のアクションを管理する上で理想的なソリューションです。
+この新しい種類の鍵は、[**Boneh-Lynn-Shacham (BLS)** 署名方式](https://wikipedia.org/wiki/BLS_digital_signature)を使用します。 BLSは、署名を非常に効率的に集約できるだけでなく、集約された個々のバリデータの鍵に対してリバースエンジニアリングを実行することも可能であり、バリデータ間のアクションを管理する上で理想的なソリューションです。
-## バリデータ向けの2種類の鍵 {#two-types-of-keys}
+## 2種類のバリデータ鍵 {#two-types-of-keys}
-イーサリアムでは、プルーフ・オブ・ステークへの移行前は、楕円曲線ベースの秘密鍵だけを用いて資金にアクセスしていました。 プルーフ・オブ・ステークの導入により、ソロステークの実行を希望するユーザーは、**バリデータ鍵**と**引き出し鍵**の両方が必要になりました。
+イーサリアムでは、プルーフ・オブ・ステークへの移行前は、楕円曲線ベースの秘密鍵だけを用いて資金にアクセスしていました。 プルーフ・オブ・ステークの導入により、ソロステーカーになることを希望するユーザーには、**バリデータ鍵**と**出金鍵**も必要になりました。
### バリデータ鍵 {#validator-key}
@@ -25,7 +25,7 @@ lang: ja
バリデータ秘密鍵は、ブロックの提案やアテステーションといったオンチェーンの操作を行うために使用します。 このため、バリデータ秘密鍵は常にホットウォレットで管理しなければなりません。
-バリデータ秘密鍵におけるこの柔軟性は、ひとつの端末から他の端末に移動させるのが容易であるという利点がありますが、紛失/盗難時には、以下のような**悪意の行為**の被害を受ける可能性があります:
+この柔軟性により、バリデータの署名鍵をあるデバイスから別のデバイスに非常に迅速に移動できるという利点がありますが、紛失または盗難された場合、攻撃者はいくつかの方法で**悪意のある行動**をとることができます:
- 以下の行為に対して、バリデータの資産がスラッシングされうる:
- 提案者となり、同一スロットにおいて2つの異なるビーコンブロックに署名してしまう
@@ -33,13 +33,13 @@ lang: ja
- アテスターとなり、同一のターゲットに対して2つの異なるアテステーションを署名する場合
- 自発的な退出を強制して、当該のバリデータがステーキングを行えなくし、出金鍵の所有者がバリデータのETH残高にアクセスできるようにする場合
-**バリデータ公開鍵**は、ユーザーがステーキング入金コントラクトにETHを入金する際のトランザクションデータに含まれています。 これは、_入金データ_と呼ばれ、イーサリアムがバリデータを特定するために用いられます。
+**バリデータ公開鍵**は、ユーザーがステーキングの入金コントラクトにETHを入金する際のトランザクションデータに含まれています。 これは、入金データと呼ばれ、イーサリアムがバリデータを特定するために用いられます。
-### 引出における認証情報 {#withdrawal-credentials}
+### 出金の認証情報 {#withdrawal-credentials}
-すべてのバリデータは、_出金の認証情報_と呼ばれるプロパティを持ちます。 この32バイトのフィールドは、BLSによる出金の認証情報を表す`0x00`か、実行アドレスを示す認証情報を表す`0x01`のどちらかで始まります。
+すべてのバリデータは、_出金の認証情報_として知られるプロパティを持っています。 この32バイトのフィールドは、BLSによる出金の認証情報を表す`0x00`か、実行アドレスを示す認証情報を表す`0x01`のどちらかで始まります。
-`0x00`のBLS キーを持つバリデータは、超過残高の支払いを実行したり、ステーキングした資金を全額出金したい場合、実行アドレスを示すこれらの認証情報を更新する必要があります。 具体的には、鍵を最初に生成する際において入金データに含まれていた実行アドレスを提供するか、_あるいは_事後的に出金鍵を用いて署名し、` BLSToExecutionChange`のメッセージをブロードキャストする必要があります。
+`0x00`のBLS鍵を持つバリデータは、超過残高の支払いやステーキングからの全額出金を有効にするために、これらの認証情報を実行アドレスを指すように更新する必要があります。 これは、最初の鍵生成時に入金データで実行アドレスを提供するか、_または_後で出金鍵を使用して`BLSToExecutionChange`メッセージに署名し、ブロードキャストすることで行えます。
### 出金鍵 {#withdrawal-key}
@@ -50,17 +50,19 @@ lang: ja
- 出金用**秘密**鍵
- 出金用**公開**鍵
-出金の認証情報を`0x01`タイプに更新する前にこの鍵を紛失してしまうと、バリデータは残高にアクセスできなくなります。 ブロックや署名に必要なのはバリデータの秘密鍵であるため、この場合でも、バリデータはアテステーションやブロックに署名を行うことができますが、出金鍵を紛失してしまった場合、バリデータが署名を行う理由はほぼ/まったくなくなります。
+出金の認証情報を0x01タイプに更新する前にこの鍵を紛失してしまうと、バリデータは残高にアクセスできなくなります。 ブロックや署名に必要なのはバリデータの秘密鍵であるため、この場合でも、バリデータはアテステーションやブロックに署名を行うことができますが、出金鍵を紛失してしまった場合、バリデータが署名を行う理由はほぼ/まったくなくなります。
イーサリアムのアカウント鍵とバリデータ鍵を分離することで、1人のユーザーが複数のバリデータを実行することが可能になります。
-
+
-## シードフレーズから鍵を導出するには {#deriving-keys-from-seed}
+**注**: 現在、ステーキングの責務から退出してバリデータの残高を引き出すには、バリデータ鍵で[自発的退出メッセージ(VEM)](https://mirror.xyz/ladislaus.eth/wmoBbUBes2Wp1_6DvP6slPabkyujSU7MZOFOC3QpErs&1)に署名する必要があります。 ただし、[EIP-7002](https://eips.ethereum.org/EIPS/eip-7002)は、将来、ユーザーが出金鍵で退出メッセージに署名することで、バリデータの退出をトリガーし、その残高を引き出すことを可能にする提案です。 これにより、[ステーキング・アズ・ア・サービス・プロバイダー](/staking/saas/#what-is-staking-as-a-service)にETHを委任するステーカーが自身の資金の管理を維持できるようになり、信頼の仮定が軽減されます。
+
+## シードフレーズからの鍵の導出 {#deriving-keys-from-seed}
ユーザーが32ETHをステークするには、相互に完全に独立した2つの鍵セットが新たに必要になるため、特に複数のバリデータを実行するユーザーにとっては鍵の管理がとても煩雑になります。 この状況を回避するため、1つの共通のシークレットから複数のバリデータ鍵を導出できるようになっており、この1つのシークレットを保存することで、複数のバリデータ鍵へのアクセスが可能になります。
-ユーザーが各自のウォレットに[アクセス](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0)する際には、[ニーモニック](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase)やパスの機能が目に入るでしょう。 ニーモニックとは、特定の秘密鍵に対する当初のシードとして機能する単語のつらなりです。 ニーモニックは、追加のデータと結合することで、「マスター鍵」と呼ばれるハッシュを生成できます。 マスター鍵は、特定のツリーにおけるルートだと考えればよいでしょう。 このルートから派生したブランチについては、階層的なパスを用いて導出できるので、子ノードは親ノードのハッシュとツリー上のインデックスを結合したものとして存在することになります。 ニーモニックによる鍵の生成については、[BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)標準と[BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)標準をご覧ください。
+[ニーモニック](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase)とパスは、ユーザーが自分のウォレットに[アクセスする](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0)際によく遭遇する顕著な機能です。 ニーモニックとは、特定の秘密鍵に対する当初のシードとして機能する単語のつらなりです。 ニーモニックは、追加のデータと結合することで、「マスター鍵」と呼ばれるハッシュを生成できます。 マスター鍵は、特定のツリーにおけるルートだと考えればよいでしょう。 このルートから派生したブランチについては、階層的なパスを用いて導出できるので、子ノードは親ノードのハッシュとツリー上のインデックスを結合したものとして存在することになります。 ニーモニックベースの鍵生成に関する[BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)および[BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)標準についてお読みください。
パスは、以下のような構造を持ちます。ハードウェアのウォレットを使用したことがあるユーザーにとっては、おなじみでしょう。
@@ -74,7 +76,7 @@ m/44'/60'/0'/0`
master_key / purpose / coin_type / account / change / address_index
```
-このロジックにより、ツリーの共通ルートから異なるブランチをいくつでも設定できるため、ユーザーは1つの**ニーモニックフレーズ**にいくつでもバリデータを追加することができます。 ユーザーは、ニーモニックフレーズを用いて、**鍵をいくつでも導出**することができます。
+このロジックにより、ツリーのルートは共通で、分岐点で差別化できるため、ユーザーは単一の**ニーモニックフレーズ**にできるだけ多くのバリデータを関連付けることができます。 ユーザーは、ニーモニックフレーズを用いて、鍵をいくつでも導出することができます。
```
[m / 0]
@@ -86,11 +88,13 @@ master_key / purpose / coin_type / account / change / address_index
[m / 2]
```
-各ブランチは、`/`で区切られるため、`m/2`は、マスター鍵で開始され、ブランチ2に従うことを意味します。 以下の図の場合、1つのニーモニックフレーズを用いて3つの出金鍵が保存され、それぞれに2つのバリデータが関連付けられています。
+各ブランチは、/で区切られるため、m/2は、マスター鍵で開始され、ブランチ2に従うことを意味します。 以下の図の場合、1つのニーモニックフレーズを用いて3つの出金鍵が保存され、それぞれに2つのバリデータが関連付けられています。

-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [カール・ベークハイゼンによるイーサリアム・ファウンデーションのブログ記事](https://blog.ethereum.org/2020/05/21/keys/)
-- [EIP-2333 BLS12-381 鍵の生成](https://eips.ethereum.org/EIPS/eip-2333)
+- [Carl Beekhuizenによるイーサリアム・ファウンデーションのブログ投稿](https://blog.ethereum.org/2020/05/21/keys/)
+- [EIP-2333 BLS12-381 鍵生成](https://eips.ethereum.org/EIPS/eip-2333)
+- [EIP-7002: 実行レイヤーによってトリガーされる退出](https://web.archive.org/web/20250125035123/https://research.2077.xyz/eip-7002-unpacking-improvements-to-staking-ux-post-merge)
+- [大規模な鍵管理](https://docs.ethstaker.cc/ethstaker-knowledge-base/scaled-node-operators/key-management-at-scale)
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md
index 56710ddac0f..3026dc01a20 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md
@@ -1,6 +1,6 @@
---
-title: プルーフ・オブ・ステークとプルーフ・オブ・ワークの比較
-description: イーサリアムのプルーフ・オブ・ステークとプルーフ・オブ・ワークベースの合意メカニズムの比較
+title: "プルーフ・オブ・ステークとプルーフ・オブ・ワークの比較"
+description: "イーサリアムのプルーフ・オブ・ステークとプルーフ・オブ・ワークベースの合意メカニズムの比較"
lang: ja
---
@@ -14,19 +14,19 @@ lang: ja
### 攻撃コスト {#cost-to-attack}
-プルーフ・オブ・ステークでは、バリデータはスマートコントラクトに少なくとも32ETHをエスクロー(ステーク)する必要があります。 イーサリアムは、不正行為を行ったバリデータを罰するために、ステークされたイーサを破壊することができます。 合意に達するには、ステークされたイーサ全体の少なくとも66%が特定のブロックのセットに賛成票を投じる必要があります。 ステークの66%の投票を受けたブロックは「ファイナライズ」となり、削除や再編成ができなくなります。
+プルーフ・オブ・ステークでは、バリデータはスマートコントラクトに少なくとも32ETHをエスクロー(ステーク)する必要があります。 イーサリアムは、不正行為を行ったバリデータを罰するために、ステークされたイーサを破壊することができます。 合意に達するには、ステークされたイーサ全体の少なくとも66%が特定のブロックのセットに賛成票を投じる必要があります。 ステークの66%以上の投票を得たブロックは"ファイナライズ"され、削除や再編成ができなくなります。
ネットワークを攻撃するということは、チェーンのファイナライズを妨げたり、何らかの形で攻撃者に利益をもたらすように正規チェーン内のブロックの特定の構成を確保したりすることを意味する場合があります。 そのためには、攻撃者が大量のイーサを蓄積して直接投票するか、正直なバリデータをだまして特定の方法で投票させることにより、誠実なコンセンサスの道を妨害する必要があります。 正直なバリデータをだます洗練された低確率の攻撃は別として、イーサリアムを攻撃するコストは、攻撃者が自分たちに有利なコンセンサスに影響を与えるために蓄積しなければならないステークのコストです。
-攻撃の最低コストは総ステークの33%以上です。 攻撃者が総ステークの33%以上を保有している場合、オフラインになるだけでファイナリティ遅延が発生する可能性があります。 オンライン過半数がステークの66%を占め、再びチェーンを完成させることができるまで、オフラインのバリデータからステークを漏洩させる「非アクティブリーク」として知られるメカニズムがあるため、これはネットワークにとって比較的小さな問題です。 また理論的には、攻撃者がブロック生成者になるよう求められたときにブロックを 1つではなく2つ作成し、バリデータ全員に二重投票することで、総ステークの33%強でダブルファイナリティを引き起こすことも可能です。 各フォークでは、残りの誠実なバリデータの50%が各ブロックを最初に確認するだけでよいため、メッセージのタイミングを適切に調整できれば、両方のフォークを完了できる可能性があります。 これが成功する可能性は低いですが、攻撃者が二重ファイナリティを引き起こすことができた場合、イーサリアムコミュニティは、一方のフォークに従うことを決定する必要があります。その場合、攻撃者のバリデータは、必然的にもう一方のフォークでスラッシュされることになります。
+攻撃の最低コストは、総ステークの33%超です。 攻撃者が総ステークの33%超を保有している場合、オフラインになるだけでファイナリティ遅延が発生する可能性があります。 オンライン過半数がステークの66%を占め、再びチェーンを完成させることができるまで、オフラインのバリデータからステークを漏洩させる「非アクティブリーク」として知られるメカニズムがあるため、これはネットワークにとって比較的小さな問題です。 また理論的には、攻撃者がブロック生成者になるよう求められたときにブロックを 1つではなく2つ作成し、バリデータ全員に二重投票することで、総ステークの33%強でダブルファイナリティを引き起こすことも可能です。 各フォークでは、残りの誠実なバリデータの50%が各ブロックを最初に確認するだけでよいため、メッセージのタイミングを適切に調整できれば、両方のフォークを完了できる可能性があります。 これが成功する可能性は低いですが、攻撃者が二重ファイナリティを引き起こすことができた場合、イーサリアムコミュニティは、一方のフォークに従うことを決定する必要があります。その場合、攻撃者のバリデータは、必然的にもう一方のフォークでスラッシュされることになります。
-総ステークの33%以上を使用すると、攻撃者はイーサリアムネットワークに軽微な影響(ファイナリティ遅延)またはより深刻な影響 (二重ファイナリティ) を与える可能性があります。 ネットワーク上に14,000,000 ETH以上がステークされており、代表的な価格が1000 ドル/ETHであるため、これらの攻撃を仕掛ける最小コストは、`1000 x 14,000,000 x 0.33 = 46億2,000,000ドル`となります。 攻撃者はスラッシュによってこのお金を失い、ネットワークから排除されてしまいます。 再度攻撃するには、ステークの33%以上を再び蓄積し、バーンする必要があります。 ネットワークへの攻撃を試みるたびに、46億ドル以上の費用がかかります(1,000ドル/ETHで1,400万ETHをステークした場合)。 攻撃者はスラッシュされるとネットワークからも排除され、再参加するにはアクティベーションキューに参加する必要があります。 これは、攻撃者が合計ステークの33%以上を蓄積できる割合に対してだけでなく、すべてのバリデータをネットワークにオンボードするのにかかる時間にも、反復攻撃の割合が制限されることを意味します。 攻撃者が攻撃するたびに、攻撃者はさらに貧乏になり、結果として生じる供給ショックのおかげで、他のコミュニティメンバーはさらに裕福になります。
+総ステークの33%超を使用すると、攻撃者はイーサリアムネットワークに軽微な(ファイナリティ遅延)またはより深刻な(二重ファイナリティ)影響を与える可能性があります。 ネットワーク上に14,000,000 ETH以上がステークされており、代表的な価格が1000ドル/ETHである場合、これらの攻撃を仕掛けるための最低コストは `1000 x 14,000,000 x 0.33 = $4,620,000,000` となります。 攻撃者はスラッシュによってこのお金を失い、ネットワークから排除されてしまいます。 再度攻撃するには、ステークの33%超を再び蓄積し、それをバーン(焼却)する(再び)必要があります。 ネットワークへの攻撃を試みるたびに、46億ドル超の費用がかかります(1000ドル/ETHで1,400万ETHをステークした場合)。 攻撃者はスラッシュされるとネットワークからも排除され、再参加するにはアクティベーションキューに参加する必要があります。 これは、反復攻撃の頻度が、攻撃者が総ステークの33%超を蓄積できる速さだけでなく、すべてのバリデータをネットワークにオンボードするのにかかる時間によっても制限されることを意味します。 攻撃者が攻撃するたびに、攻撃者はさらに貧乏になり、結果として生じる供給ショックのおかげで、他のコミュニティメンバーはさらに裕福になります。
51%攻撃や総ステークの66%によるファイナリティ復帰などの他の攻撃では、必要なETHの量が大幅に増加するため、攻撃者にとってははるかにコストがかかります。
-これをプルーフ・オブ・ワークと比較してください。 プルーフ・オブ・ワークのイーサリアムに対する攻撃を開始するためには、総ネットワークハッシュレートの50%を継続的に所有するコストが必要でした。 このコストは、他のマイナーと競合して、プルーフ・オブ・ワーク・ソリューションを一貫して計算するために必要な、十分な計算能力を備えたハードウェアとランニングコストに相当します。 イーサリアムは主にASICではなくGPUでマイニングされていたため、コストを抑えることができていました(ただし、イーサリアムがプルーフ・オブ・ワークのままであった場合、ASICマイニングがさらに普及していた可能性もあります)。 攻撃者は、プルーフ・オブ・ワークのイーサリアムネットワークを攻撃するために、大量のハードウェアを購入し、それを稼働させるための電気代を支払う必要があります。しかし、その総コストは、攻撃を開始するのに十分なETHを蓄積するのに必要なコストよりも低くなります。 51%攻撃は、プルーフ・オブ・ワークの場合、プルーフ・オブ・ステークの20分の1以下の費用で実行できます。 攻撃が検出され、変更を削除するためにチェーンがハードフォークされた場合、攻撃者は同じハードウェアを繰り返し使用して新しいフォークを攻撃する可能性があります。
+これをプルーフ・オブ・ワークと比較してください。 プルーフ・オブ・ワークのイーサリアムに対する攻撃を開始するためのコストは、総ネットワークハッシュレートの50%超を継続的に所有するためのコストでした。 このコストは、他のマイナーと競合して、プルーフ・オブ・ワーク・ソリューションを一貫して計算するために必要な、十分な計算能力を備えたハードウェアとランニングコストに相当します。 イーサリアムは主にASICではなくGPUでマイニングされていたため、コストを抑えることができていました(ただし、イーサリアムがプルーフ・オブ・ワークのままであった場合、ASICマイニングがさらに普及していた可能性もあります)。 攻撃者は、プルーフ・オブ・ワークのイーサリアムネットワークを攻撃するために、大量のハードウェアを購入し、それを稼働させるための電気代を支払う必要があります。しかし、その総コストは、攻撃を開始するのに十分なETHを蓄積するのに必要なコストよりも低くなります。 51%攻撃は、プルーフ・オブ・ステークに比べ、プルーフ・オブ・ワークの方が[約20分の1](https://youtu.be/1m12zgJ42dI?t=1562)の費用で済みます。 攻撃が検出され、変更を削除するためにチェーンがハードフォークされた場合、攻撃者は同じハードウェアを繰り返し使用して新しいフォークを攻撃する可能性があります。
-### 複雑性 {#complexity}
+### 複雑さ {#complexity}
プルーフ・オブ・ステークはプルーフ・オブ・ワークよりもはるかに複雑です。 単純なプロトコルは、誤ったバグや意図しない影響が入り込みにくいため、プルーフ・オブ・ワークの安全性に有利になる可能性があります。 しかし、その複雑性は、長年にわたる研究開発、シミュレーション、テストネットの実装によって軽減されてきました。 プルーフ・オブ・ステークのプロトコルは、5つのプログラミング言語で、実行レイヤーとコンセンサスレイヤーのそれぞれを担当する5つの個別のチームによって独立して実装されており、クライアントのバグに対する回復力を提供します。
@@ -36,7 +36,7 @@ lang: ja
プルーフ・オブ・ステークはプルーフ・オブ・ワークよりも複雑です。そのため、処理すべき潜在的な攻撃ベクトルもより多く存在します。 クライアントを接続する1つのピアツーピアネットワークの代わりに、2つのピアツーピアネットワークがあり、それぞれが別のプロトコルを実装しています。 各スロットでブロックを提案する特定のバリデータ1つを事前に選択すると、大量のネットワークトラフィックによってそのバリデータがオフラインになり、サービス妨害の可能性が生じます。
-攻撃者がブロックやアテステーションのリリースのタイミングを慎重に調整することで、それらが誠実なネットワークの一定割合で受信され、特定の方法で投票するように影響を与えることができます。 また、攻撃者は単純に十分なETHを蓄積してステーキングし、合意メカニズムを支配することもできます。 これらの攻撃ベクトルにはそれぞれ防御手段がありますが、プルーフ・オブ・ワークの下では十分な防御とはなりません。
+攻撃者がブロックやアテステーションのリリースのタイミングを慎重に調整することで、それらが誠実なネットワークの一定割合で受信され、特定の方法で投票するように影響を与えることができます。 また、攻撃者は単純に十分なETHを蓄積してステーキングし、合意メカニズムを支配することもできます。 これらの[攻撃ベクトルにはそれぞれ関連する防御策があります](/developers/docs/consensus-mechanisms/pos/attack-and-defense)が、プルーフ・オブ・ワークではこれらの攻撃ベクトル自体が存在しません。
## 分散化 {#decentralization}
@@ -46,7 +46,7 @@ lang: ja
バリデータが自宅のコンピュータ上でローカルに実行し、分散化を最大限に高めることが、イーサリアムにとって最善の選択肢です。 そのため、イーサリアムは、ノードおよびバリデータを実行するためのハードウェア要件の増加に対する変更に反対しています。
-## サステナビリティ {#sustainability}
+## 持続可能性 {#sustainability}
プルーフ・オブ・ステークは、プルーフ・オブ・ワークに比べて、ブロックチェーンを保護するために必要な炭素排出量が少なくなっています。 プルーフ・オブ・ワークでは、ブロックをマイニングする権利をめぐり競争が繰り広げられています。 マイナーは、計算を速く実行できれば、成功する可能性が高くなるので、ハードウェアやエネルギー消費に投資する傾向があります。 この現象は、イーサリアムがプルーフ・オブ・ステークに移行する前に見られました。 プルーフ・オブ・ステークに移行する直前、イーサリアムの年間消費電力量は約78TWに達し、小国一国分の電力に匹敵していました。 しかし、移行後はエネルギー消費は約99.98%削減され、 イーサリアムはエネルギー効率の高い低炭素プラットフォームへと生まれ変わりました。
@@ -62,8 +62,8 @@ Justin Drakが、プルーフ・オブ・ワークよりも優れたプルーフ
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [ヴィタリックによるプルーフ・オブ・ステークの設計哲学](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51)
-- [ヴィタリックによるプルーフ・オブ・ステークのFAQ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake)
-- [シンプルにPoSとPoWの比較を説明したビデオ](https://www.youtube.com/watch?v=M3EFi_POhps)
+- [Vitalikによるプルーフ・オブ・ステークの設計思想](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51)
+- [Vitalikによるプルーフ・オブ・ステークに関するよくある質問](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake)
+- [posとpowに関する「Simply Explained」のビデオ](https://www.youtube.com/watch?v=M3EFi_POhps)
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md
index d38009e3d05..59dfa3a5dbf 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md
@@ -1,10 +1,10 @@
---
-title: プルーフ・オブ・ステークにおける報酬とペナルティ
-description: イーサリアムのプルーフ・オブ・ステークのプロトコルにおけるインセンティブについて学ぶ
+title: "プルーフ・オブ・ステークにおける報酬とペナルティ"
+description: "イーサリアムのプルーフ・オブ・ステークのプロトコルにおけるインセンティブについて学ぶ"
lang: ja
---
-イーサリアムでは、ネイティブの暗号通貨であるイーサ(ETH)を使用することでセキュリティを維持しています。 ブロックの検証や、チェーンの先頭の特定に関与したいノードオペレーターは、イーサリアム上の[デポジットコントラクト](/staking/deposit-contract/)に対してイーサを入金する必要があります。 ノードの運用者は、ピアツーピアネットワークで受信した新規ブロックの正当性を確認するためのバリデータ・ソフトウェアを実行し、チェーンの先頭を特定するためのフォーク選択アルゴリズムを適用することで、報酬を得ることができます。
+イーサリアムでは、ネイティブの暗号通貨であるイーサ(ETH)を使用することでセキュリティを維持しています。 ブロックの検証やチェーンのヘッドの特定に参加したいノードオペレーターは、イーサリアムの[デポジットコントラクト](/staking/deposit-contract/)にイーサを入金します。 ノードの運用者は、ピアツーピアネットワークで受信した新規ブロックの正当性を確認するためのバリデータ・ソフトウェアを実行し、チェーンの先頭を特定するためのフォーク選択アルゴリズムを適用することで、報酬を得ることができます。
バリデータは、主に、1) 新規ブロックを確認し、それが正当なブロックでることを「証明」(アテステーション)すること、および2) バリデータの全体プールから選出された場合に、新規ブロックを提案すること、という2つの役割を担います。 バリデータがこれらのタスクの実行を要求された場合に実行できない場合、イーサの支払いを受け取る機会を逃すことになります。 バリデータはさらに、署名の集約作業や同期委員会に参加することが求められる場合もあります。
@@ -18,48 +18,49 @@ lang: ja
### 報酬 {#rewards}
-バリデータは、ブロックが提案された場合と同期委員会に参加する際に、多数派のバリデータと同じ投票を行うことでで報酬を受け取ります。 各エポックにおける報酬額は、`べース報酬`により算出されます。 ベース報酬は、その他の報酬を算定する際の基準値です。 `ベース報酬`は、各エポックの最適な条件下において、1名のバリデータが受け取る平均報酬額を示す値です。 ベース報酬額は、当該バリデータにおける有効な残高と、アクティブなバリデータ数を掛け合わせて算出します。具体的な数式は、以下の通りです:
+バリデータは、ブロックが提案された場合と同期委員会に参加する際に、多数派のバリデータと同じ投票を行うことでで報酬を受け取ります。 各エポックの報酬額は、`base_reward`から計算されます。 ベース報酬は、その他の報酬を算定する際の基準値です。 `base_reward`は、最適な条件下でバリデータがエポックごとに受け取る平均報酬を表します。 ベース報酬額は、当該バリデータにおける有効な残高と、アクティブなバリデータ数を掛け合わせて算出します。具体的な数式は、以下の通りです:
```
base_reward = effective_balance * (base_reward_factor / (base_rewards_per_epoch * sqrt(sum(active_balance))))
```
-この数式において、`base_reward_factor`は64であり、`base_rewards_per_epoch`は4で、`sum(active balance)`はアクティブなバリデータ全員がステーキングしたイーサの合計です。
+ここで`base_reward_factor`は64、`base_rewards_per_epoch`は4、`sum(active balance)`はすべてのアクティブなバリデータによってステークされたイーサの合計です。
-この数式により、ベース報酬は当該バリデータの有効な残高と比例し、ネットワークに含まれるバリデータの数と反比例することが分かります。 バリデータの数が増えれば、(`sqrt(N)`)により全体の発行額も増えますが、バリデータ1名あたりの`ベース報酬`は(`1/sqrt(N)`)により少なくなります。 これらの要因は、ステーキングを行うノードのAPRに影響を及ぼします。 この仕様の根拠については、[ヴィタリックの説明](https://notes.ethereum.org/@vbuterin/rkhCgQteN?type=view#Base-rewards)をご覧ください。
+この数式により、ベース報酬は当該バリデータの有効な残高と比例し、ネットワークに含まれるバリデータの数と反比例することが分かります。 バリデータが多いほど、全体の発行量は (`sqrt(N)` として) 大きくなりますが、バリデータあたりの `base_reward` は (`1/sqrt(N)` として) 小さくなります。 これらの要因は、ステーキングを行うノードのAPRに影響を及ぼします。 この理論的根拠については、[ヴィタリックのメモ](https://notes.ethereum.org/@vbuterin/rkhCgQteN?type=view#Base-rewards)をお読みください。
次に合計報酬を計算しますが、これは、それぞれが異なる重みを持つ5つの構成要素を合計して算出します。この重みは、合計報酬を算出するにあたり、各構成要素がどれだけ重要であるかを決定する値です。 5つの構成要素は、以下の通りです:
```
-1. ソース投票:バリデータが、適切なソース・チェックポイントに対して、適時に投票したかどうか。2. ターゲット投票:バリデータが、適切なターゲット・チェックポイントに対して、適時に投票したかどうか。
-3. ヘッド投票:バリデータが、適切な先頭ブロックに対して適時に投票したかどうか。
-4. 同期委員会の報酬:バリデータが、同期委員会に参加したかどうか。
-5. 提案者の報酬:バリデータが、適切なスロットにブロックを提案したかどうか。
+1. ソース投票:バリデータが正しいソースチェックポイントに対して適時に投票した
+2. ターゲット投票:バリデータが正しいターゲットチェックポイントに対して適時に投票した
+3. ヘッド投票:バリデータが正しいヘッドブロックに対して適時に投票した
+4. 同期委員会報酬:バリデータが同期委員会に参加した
+5. 提案者報酬:バリデータが正しいスロットでブロックを提案した
```
これらの構成要素に対する重み付けは以下のようになっています:
```
-TIMELY_SOURCE_WEIGHT uint64(14)
-TIMELY_TARGET_WEIGHT uint64(26)
-TIMELY_HEAD_WEIGHT uint64(14)
-SYNC_REWARD_WEIGHT uint64(2)
-PROPOSER_WEIGHT uint64(8)
+TIMELY_SOURCE_WEIGHT uint64(14)
+TIMELY_TARGET_WEIGHT uint64(26)
+TIMELY_HEAD_WEIGHT uint64(14)
+SYNC_REWARD_WEIGHT uint64(2)
+PROPOSER_WEIGHT uint64(8)
```
-各要素の重みを合計すると、64になります。 報酬額は、該当する重みの合計を64で割ることで算出されます。 つまり、ソース/ターゲット/先頭の投票を適時に行い、ブロックを提案し、同期委員会に参加した場合のベース報酬は、`64/64 * base_reward == base_reward`になります。 ただし、通常の場合バリデータはブロック提案者にはならないので、ブロック提案者に選出されない場合の報酬の上限は、`64-8 /64 * base_reward == 7/8 * base_reward`となります。 ブロック提案者に選出されず、同期委員会にも参加しない場合は、`64-8-2 / 64 * base_reward == 6.75/8 * base_reward`となります。
+各要素の重みを合計すると、64になります。 報酬額は、該当する重みの合計を64で割ることで算出されます。 適時にソース、ターゲット、ヘッドの投票を行い、ブロックを提案し、同期委員会に参加したバリデータは、`64/64 * base_reward == base_reward` を受け取ることができます。 ただし、バリデータは通常ブロック提案者ではないため、その最大報酬は `64-8 /64 * base_reward == 7/8 * base_reward` になります。 ブロック提案者でもなく、同期委員会にも属していないバリデータは、`64-8-2 / 64 * base_reward == 6.75/8 * base_reward`を受け取ることができます。
-さらに、アテステーションの迅速な実行を促すインセンティブとして、追加の報酬が付与されます。 これは、`inclusion_delay_reward`です。 追加遅延報酬は、`base_reward`に`1/delay`を掛けて算出され、`delay`は、ブロック提案とアテステーションとの間のスロット数です。 例えば、ブロック提案が発生してから1スロット内にアテステーションを送信した場合、アテステーションを行ったバリデータの報酬は`base_reward * 1/1 == base_reward`になります。 アテステーションを次のスロットで実行した場合の報酬は、`base_reward * 1/2`となります。
+さらに、アテステーションの迅速な実行を促すインセンティブとして、追加の報酬が付与されます。 これは `inclusion_delay_reward` です。 これは`base_reward`に`1/delay`を乗じた値と等しく、ここで`delay`はブロック提案とアテステーションを隔てるスロット数です。 例えば、アテステーションがブロック提案から1スロット以内に提出された場合、証明者は `base_reward * 1/1 == base_reward` を受け取ります。 アテステーションが次のスロットに到着した場合、証明者は`base_reward * 1/2`を受け取り、以下同様です。
-ブロック提案者は、当該ブロックに含まれる**それぞれの正当なアテステーション**ごとに、`8 / 64 * base_reward`を受け取りますので、実際の報酬額は、アテステーションを行うバリデータの数と比例します。 ブロック提案者はさらに、提案されたブロックに含まれる他のバリデータの不正行為の証拠を提出することで、報酬を追加することができます。 これらの報酬は、バリデータに対して誠実な行為を促す「アメ」だと言えます。 スラッシングを含むブロックの提案者は、`slashed_validators_effective_balance / 512`の報酬を得ます。
+ブロック提案者は、ブロックに含まれる**有効な各アテステーション**に対して `8 / 64 * base_reward` を受け取るため、実際の報酬額はアテステーションを行うバリデータの数に応じて変動します。 ブロック提案者はさらに、提案されたブロックに含まれる他のバリデータの不正行為の証拠を提出することで、報酬を追加することができます。 これらの報酬は、バリデータに対して誠実な行為を促す「アメ」だと言えます。 スラッシングを含むブロック提案者は `slashed_validators_effective_balance / 512` の報酬を得ます。
### ペナルティ {#penalties}
以上は、適切に振る舞うバリデータの報酬ですが、ヘッド/ソース/ターゲットの投票を適時に行わないか、遅延した場合にはどうなるでしょうか?
-ターゲットおよびソースの投票を実行しなかった場合のペナルティは、アテステーションを実行した場合に受け取る報酬と同額です。 つまり、投票を行うことで残高が増えるのとは反対に、残高から報酬分が減額されます。 ヘッド投票を行わない場合のペナルティはありません(つまり、ヘッド投票を行った場合には報酬を得られますが、行わなくてもペナルティは発生しません)。 また、`inclusion_delay`に対してもペナルティは存在せず、追加の遅延による報酬がバリデータの残高に追加されないだけです。 ブロック提案を行わない場合についても、ペナルティは科せられません。
+ターゲットおよびソースの投票を実行しなかった場合のペナルティは、アテステーションを実行した場合に受け取る報酬と同額です。 つまり、投票を行うことで残高が増えるのとは反対に、残高から報酬分が減額されます。 ヘッド投票を行わなかった場合のペナルティはありません(つまり、ヘッド投票は報酬の対象にはなっても、ペナルティの対象になることはありません)。 `inclusion_delay`に関連するペナルティはありません。単に報酬がバリデータの残高に追加されないだけです。 ブロック提案を行わない場合についても、ペナルティは科せられません。
-報酬とペナルティに関する詳細については、[コンセンサス仕様](https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/beacon-chain.md)を確認してください。 Bellatrixアップグレードにより、報酬およびペナルティが調整されました。調整の内容については、このダニー・ライアンとヴィタリックによる[「Peep an EIP」動画](https://www.youtube.com/watch?v=iaAEGs1DMgQ)をご覧ください。
+報酬とペナルティに関する詳細は、[コンセンサス仕様](https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/beacon-chain.md)をお読みください。 報酬とペナルティはBellatrixアップグレードで調整されました。これについては、ダニー・ライアンとヴィタリックが議論しているこちらの[Peep an EIPビデオ](https://www.youtube.com/watch?v=iaAEGs1DMgQ)をご覧ください。
## スラッシング {#slashing}
@@ -69,21 +70,22 @@ PROPOSER_WEIGHT uint64(8)
- あるブロックを「取り囲む」ブロックに対してアテステーションを提供した場合(事実上、履歴を変更した場合)
- 同一ブロックの2つの候補にアテステーションを提供することで、「二重投票」を行った場合
-バリデータによるこのような行為が発見された場合、このバリデータはスラッシングの対象となります。 具体的には、対象となるバリデータがステーキングしたイーサの32分の1(上限は1ETH)がただちにバーンされ、さらに36日間の削除期間が開始されます。 この削除期間にわたり、バリデータのステークは徐々に減少します。 この期間の中間点(18日目)には追加のペナルティが科されますが、その額は、当該のスラッシング・イベントが発生する前の36日間においてスラッシングの対象となったすべてのバリデータがステークしたイーサの合計に基づいて決定されます。 つまり、スラッシング対象のバリデータが多いほど、このスラッシングの額が大きくなります。 最悪の場合、スラッシングは対象のバリデータにおける有効な残高が全額没収されます(つまり、スラッシング対象のバリデータが多数である場合、彼らはステークをすべて失う可能性があります)。 一方、1件のスラッシングイベントのみが発生した場合、バリデータのステークのうちごく一部しかバーンされません。 スラッシング対象のバリデータ数に応じて決定される中間地点におけるペナルティは、「コリレーション・ペナルティ」と呼ばれます。
+バリデータによるこのような行為が発見された場合、このバリデータはスラッシングの対象となります。 具体的には、対象となる32 ETHのバリデータから0.0078125 ETHが即時にバーンされ(アクティブバランスに応じて線形的に増加)、同時に36日の削除期間が開始されます。 この削除期間にわたり、バリデータのステークは徐々に減少します。 この期間の中間点(18日目)には追加のペナルティが科されますが、その額は、当該のスラッシング・イベントが発生する前の36日間においてスラッシングの対象となったすべてのバリデータがステークしたイーサの合計に基づいて決定されます。 つまり、スラッシング対象のバリデータが多いほど、このスラッシングの額が大きくなります。 最大スラッシュ額は、スラッシングされたすべてのバリデータの有効残高の全額です(つまり、多くのバリデータがスラッシングされた場合、彼らはステークの全額を失う可能性があります)。 一方、1件のスラッシングイベントのみが発生した場合、バリデータのステークのうちごく一部しかバーンされません。 スラッシング対象のバリデータ数に応じて決定される中間地点におけるペナルティは、「コリレーション・ペナルティ」と呼ばれます。
-## インアクティブ・リーク {#inactivity-leak}
+## 無活動リーク {#inactivity-leak}
コンセンサスレイヤーにおいて、4エポック連続でファイナライズが実行されない状態になると、「インアクティブ・リーク」と呼ばれる緊急プロトコルが実行されます。 インアクティブ・リークの究極的な目的は、チェーンがファイナリティを回復できる状況に戻すことです。 上述したように、ファイナリティを実現するには、ステークされたイーサの合計の3分の2が、ソースおよびターゲットのチェックポイントについて同意する必要があります。 バリデータ全体の3分の1以上のバリデータがオフラインになったり、適切なアテステーションを送信しない場合、3分の2のスーパーマジョリティによるチェックポイントのファイナライズが不可能になります。 インアクティブ・リークでは、インアクティブなバリデータに帰属するステークを最終的にはステーク合計の3分の1未満になるまで徐々に減少させることで、残りのアクティブなバリデータがチェーンをファイナライズできるようにします。 インアクティブなバリデータの数がどんなに大規模であろうと、最終的には残りのアクティブなバリデータがステーク合計の3分の2以上を支配できるようになります。 このメカニズムによるステークの喪失は、インアクティブなバリデータに対してできる限り早くアクティブな状態に復帰しなければならないという強力なインセンティブとして機能します。 Madallaテストネットにおいてインアクティブ・リークが発動した事例では、アクティブなバリデータの割合が全体の66%未満でしたが、ブロックチェーンの現在の先頭ブロックについてコンセンサスに達することができました。 インアクティブ・リークを実行した結果、ファイナリティを取り戻すことができたのです!
合意メカニズムにおける報酬、ペナルティ、スラッシングは、個々のバリデータにおける適切な行為を促すように設計されています。 しかし、これらの設計上の選択により、複数のクライアントにわたりバリデータを平等に配分することを強く奨励するシステムとなっており、単独のクライアントによる支配を断固として拒否することができるはずです。
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [イーサリアムのアップグレオード:インセンティブ・レイヤー](https://eth2book.info/altair/part2/incentives)
-- [イーサリアムにおけるハイブリッド型のキャスパー・プロトコルによるインセンティブ](https://arxiv.org/pdf/1903.04205.pdf)
-- [ヴィタリクによる注釈付き仕様](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#rewards-and-penalties-1)
-- [Eth2においてスラッシングを避けるためのヒント](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50)
+- [イーサリアムのアップグレード:インセンティブレイヤー](https://eth2book.info/altair/part2/incentives)
+- [イーサリアムのハイブリッドCasperプロトコルにおけるインセンティブ](https://arxiv.org/pdf/1903.04205.pdf)
+- [ヴィタリックの注釈付き仕様](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#rewards-and-penalties-1)
+- [Eth2のスラッシングを防ぐヒント](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50)
+- [EIP-7251におけるスラッシングペナルティの分析](https://ethresear.ch/t/slashing-penalty-analysis-eip-7251/16509)
-_ソース_
+_出典_
- _[https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/](https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/)_
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md
index 2aceda844de..1a7141c3dcd 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md
@@ -1,14 +1,14 @@
---
-title: 弱い主観性
-description: 弱い主観性とプルーフ・オブ・ステーク(PoS)イーサリアムにおける役割
+title: "弱い主観性"
+description: "弱い主観性とプルーフ・オブ・ステーク(PoS)イーサリアムにおける役割"
lang: ja
---
ブロックチェーンにおける主観性とは、現在の状態(ステート)に同意するために社会的な情報を信用することを指します。 ネットワーク上の他のピアから収集された情報に従って、複数の有効なフォークが選択されることがあります。 この逆は客観性で、すべてのノードがコード化されたルールを適用することによって必然的に同意し、有効なチェーンが1つだけ存在することを指します。 また、第三の状態として、弱い主観性と呼ばれるものがあります。 これは情報の最初のシードが社会的に取得された後、客観的に進むことができるチェーンを指します。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-このページを理解するには、まず[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)の基礎を理解している必要があります。
+このページを理解するには、まず[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)の基礎を理解する必要があります。
## 弱い主観性が解決する問題 {#problems-ws-solves}
@@ -16,7 +16,7 @@ lang: ja
## 弱い主観性チェックポイント {#ws-checkpoints}
-弱い主観性は、「弱い主観性チェックポイント」を使って、プルーフ・オブ・ステークのイーサリアムに実装されています。 弱い主観性チェックポイントとは、ネットワーク上のすべてのノードが正規チェーンに属していることに同意するステートルートです。 ブロックチェーンの始まりの位置にいないことを除いて、始まりのブロックと同じ「普遍的な真実」としての目的を果たします。 フォーク・チョイス・アルゴリズムは、そのチェックポイントで定義されたブロックチェーンの状態が正しく、その時点以降のチェーンを独立して客観的に検証することを信頼します。 弱い主観性チェックポイント前のブロックは変えられないため、「戻り制限」として機能します。 メカニズム設計の一部として、単に長いフォークが無効であると定義することで、長距離型攻撃を弱体化させます。 バリデータの引き出し期間よりも、弱い主観性チェックポイントを短い間隔で区切ることにより、ステークが引き出される前に、チェーンをフォークするバリデータは、少なくともある程度のしきい額のスラッシングを受けるようにします。ステークが引き出されたバリデータによって、新規参加者が不正なフォークに騙されることはなくなります。
+弱い主観性は、「弱い主観性チェックポイント」を使って、プルーフ・オブ・ステークのイーサリアムに実装されています。 弱い主観性チェックポイントとは、ネットワーク上のすべてのノードが正規チェーンに属していることに同意するステートルートです。 ブロックチェーンの始まりの位置にいないことを除いて、始まりのブロックと同様に「普遍的な真実」の目的を果たします。 フォーク・チョイス・アルゴリズムは、そのチェックポイントで定義されたブロックチェーンの状態が正しく、その時点以降のチェーンを独立して客観的に検証することを信頼します。 弱い主観性チェックポイント前のブロックは変えられないため、「戻り制限」として機能します。 メカニズム設計の一部として、単に長いフォークが無効であると定義することで、長距離型攻撃を弱体化させます。 バリデータの引き出し期間よりも、弱い主観性チェックポイントを短い間隔で区切ることにより、ステークが引き出される前に、チェーンをフォークするバリデータは、少なくともある程度のしきい額のスラッシングを受けるようにします。ステークが引き出されたバリデータによって、新規参加者が不正なフォークに騙されることはなくなります。
## 弱い主観性チェックポイントとファイナライズされたブロックの違い {#difference-between-ws-and-finalized-blocks}
@@ -30,10 +30,10 @@ lang: ja
最後に、他のノードからチェックポイントをリクエストすることができます。フルノードを実行している他のイーサリアムユーザーは、バリデータがブロックエクスプローラーからのデータに対し検証するチェックポイントを提供できます。 総じて、弱い主観性チェックポイントのプロバイダーを信頼することは、クライアントデベロッパーを信頼するのと同等の問題があると考えられます。 しかし、必要とされる総合的な信頼は低いです。 これらの考慮事項は、大多数のバリデータが共謀しブロックチェーンの代替フォークを作成するような非常にまれなイベントでのみ重要になるということに留意してください。 それ以外の状況では、選択できるイーサリアムチェーンは1つだけです。
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
- [Eth2における弱い主観性](https://notes.ethereum.org/@adiasg/weak-subjectvity-eth2)
-- [Vitalik: 弱い主観性の利点](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/)
-- [弱い主観性(Tekuドキュメント)](https://docs.teku.consensys.net/en/latest/Concepts/Weak-Subjectivity/)
-- [Phase-0弱い主観性ガイド](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/weak-subjectivity.md)
+- [ヴィタリック:私がどのようにして弱い主観性を好きになったか](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/)
+- [弱い主観性 (Tekuドキュメント)](https://docs.teku.consensys.io/concepts/weak-subjectivity)
+- [Phase-0 弱い主観性ガイド](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/weak-subjectivity.md)
- [イーサリアム2.0における弱い主観性の分析](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf)
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/index.md
index 5c4a04a5c55..ca950e8b8a4 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/index.md
@@ -1,27 +1,27 @@
---
-title: プルーフ・オブ・ワーク(PoW)
-description: イーサリアムにおけるプルーフ・オブ・ワーク (PoW)プロトコルとその役割について
+title: "プルーフ・オブ・ワーク(PoW)"
+description: "イーサリアムにおけるプルーフ・オブ・ワーク (PoW)プロトコルとその役割について"
lang: ja
---
-イーサリアムのネットワークは、**[プルーフ・オブ・ワーク(PoW)](/developers/docs/consensus-mechanisms/pow)**という合意メカニズムを使用して始まりました。 このメカニズムにより、イーサリアムネットワークのノードは、ブロックチェーンに記録されたすべての情報に関してネットワーク全体で合意を取り、特定の種類の経済的な攻撃を防ぎました。 しかしながら、イーサリアムは2022年にプルーフ・オブ・ワーク(PoW)を停止し、これに代わる[プルーフ・オブ・ステーク(PoS)](/developers/docs/consensus-mechanisms/pos)の使用を開始しました。
+イーサリアムネットワークは、**[プルーフ・オブ・ワーク(PoW)](/developers/docs/consensus-mechanisms/pow)**というコンセンサスメカニズムを使用して始まりました。 このメカニズムにより、イーサリアムネットワークのノードは、ブロックチェーンに記録されたすべての情報に関してネットワーク全体で合意を取り、特定の種類の経済的な攻撃を防ぎました。 しかし、イーサリアムは2022年にプルーフ・オブ・ワークを停止し、代わりに[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)を使用し始めました。
- 現在、プルーフ・オブ・ワークは廃止されています。 イーサリアムの合意メカニズムにはプルーフ・オブ・ワークではなく、 現在はプルーフ・オブ・ステークが採用されています。 詳細については、[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)と[ステーキング](/staking/)を参照してください。
+ 現在、プルーフ・オブ・ワークは廃止されています。 イーサリアムの合意メカニズムにはプルーフ・オブ・ワークではなく、 現在はプルーフ・オブ・ステークが採用されています。 [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)と[ステーキング](/staking/)について詳しく読む。
## 前提条件 {#prerequisites}
-このページをよく理解するためには、まず[トランザクション](/developers/docs/transactions/)、[ブロック](/developers/docs/blocks/)、および[合意メカニズム](/developers/docs/consensus-mechanisms/)について読むことをお勧めします。
+このページについて深く理解するには、事前に[トランザクション](/developers/docs/transactions/)、[ブロック](/developers/docs/blocks/)、[コンセンサスメカニズム](/developers/docs/consensus-mechanisms/)について読むことをお勧めします。
## プルーフ・オブ・ワーク(PoW)とは {#what-is-pow}
-ナカモトコンセンサスはプルーフ・オブ・ワークを利用した旧メカニズムで、分散型のイーサリアムネットワークが、アカウント残高やトランザクションの順序などについてコンセンサス(例: すべてのノードが合意すること)を得ることを可能にしました。 加えてユーザーのコインの「二重支出」を防ぎ、イーサリアムチェーンの攻撃や改ざんを非常に困難なものにしました。 これらのセキュリティは現在、[Gasper](/developers/docs/consensus-mechanisms/pos/gasper/)として知られる合意メカニズムを用いたプルーフ・オブ・ステークによりもたらされています。
+プルーフ・オブ・ワークを利用するナカモトコンセンサスは、分散型イーサリアムネットワークがアカウント残高やトランザクションの順序などについてコンセンサス(すなわち、すべてのノードが合意すること)を得ることをかつて可能にしていたメカニズムです。 加えてユーザーのコインの「二重支出」を防ぎ、イーサリアムチェーンの攻撃や改ざんを非常に困難なものにしました。 現在、これらのセキュリティプロパティは、[Gasper](/developers/docs/consensus-mechanisms/pos/gasper/)として知られるコンセンサスメカニズムを用いたプルーフ・オブ・ステークによってもたらされています。
## プルーフ・オブ・ワークとマイニング {#pow-and-mining}
@@ -39,7 +39,7 @@ lang: ja
このブロックデータは、プルーフ・オブ・ワーク(PoW)に直接由来していました。
-### プルーフ・オブ・ワークの詳細 {#the-work}
+### プルーフ・オブ・ワークにおける「ワーク」 {#the-work}
プルーフ・オブ・ワークのプロトコルであるEthashでは、有効なノンスを持つブロックのみがチェーンに追加され、マイナーはブロックを生成するノンスを見つけるためにトライ&エラー(試行錯誤)を繰り返し、マイナー間の激しい競争を必要としました 。
@@ -47,7 +47,7 @@ lang: ja
難易度はハッシュのターゲット値の大きさを決定し、 ターゲットが小さいほど、有効なハッシュのセットは小さくなります。 一度ブロックが生成されると、他のマイナーやクライアントは驚くほど簡単にブロックを検証できました。 たとえ1つのトランザクションが変更された場合でも、ハッシュが全く異なり、不正が明らかになりました。
-まとめると、ハッシュはトランザクションの改竄の発見を容易にします。 また、プロセスとしてのプルーフ・オブ・ワークは、チェーンに対する攻撃への大きな抑止力にもなりました。
+まとめると、ハッシュによりトランザクションの改ざんを容易に発見できます。 また、プロセスとしてのプルーフ・オブ・ワークは、チェーンに対する攻撃への大きな抑止力にもなりました。
### プルーフ・オブ・ワークとセキュリティ {#security}
@@ -57,11 +57,11 @@ lang: ja
悪意のあるブロックを有効なものとして、一貫して作成するためには、悪意を持ったマイナーは他のマイナーに勝つ必要があります。そのためには、ネットワークのマイニングパワーの51%以上が必要でした。 その「ワーク」量には、多くの高価な計算能力が必要であり、それに費やされるエネルギーは、攻撃で得られる利益を上回る可能性さえありました。
-### プルーフ・オブ・ワークの経済 {#economics}
+### プルーフ・オブ・ワークの経済性 {#economics}
また、プルーフ・オブ・ワークは通貨を新規発行し、マイナーにインセンティブを与えていました。
-[コンスタンティノープルアップグレード](/ethereum-forks/#constantinople)以降、ブロックの生成を正常に行ったマイナーには、新たにミントされた2 ETHとトランザクションフィーの一部が報酬として支払われました。 また、Ommerブロックの場合には、1.75 ETHを補償しました。 Ommerブロックとは、あるマイナーが有効ブロックを生成したのとほぼ同時に、違うマイナーが有効なブロックを生成したことを指します。最終的にはどのチェーンが先端に入るかが決定されました。 このOmmerブロックは、通常ネットワークの遅延が原因で起こりました。
+[コンスタンティノープル・アップグレード](/ethereum-forks/#constantinople)以降、ブロックの作成に成功したマイナーは、新たに発行された2 ETHとトランザクション手数料の一部を報酬として受け取りました。 また、Ommerブロックの場合には、1.75 ETHを補償しました。 Ommerブロックとは、あるマイナーが有効ブロックを生成したのとほぼ同時に、違うマイナーが有効なブロックを生成したことを指します。最終的にはどのチェーンが先端に入るかが決定されました。 このOmmerブロックは、通常ネットワークの遅延が原因で起こりました。
## ファイナリティ {#finality}
@@ -69,19 +69,19 @@ lang: ja
マイナーは分散して作業するため、2つの有効なブロックが同時にマイニングされることがありました。 これは一時的なフォークを作成します。 最終的には、これらのチェーンの内の1つが容認されたチェーンとなり、後続のブロックがマイニングされて追加され、チェーンが長くなっていきました。
-さらに複雑なことに、一時的なフォークで拒否されたトランザクションが、容認されたチェーンの方に含まれていない可能性がありました。 これはトランザクションが取り消される可能性があることを意味します。 そのため、ファイナリティとは、トランザクションを取り消し不可能と見なすまでに待機する時間を指します。 以前のプルーフ・オブ・ワークのイーサリアムでは、特定のブロック`N`の上に多くのブロックをマイニングすればするほど、`N`のトランザクションが成功し、元に戻されなくなり、より高い信頼性を得られました。 現在のプルーフ・オブ・ステークではファイナリティは確率的なものではなく、明示的で、ブロックのプロパティによりファイナリティに至ります。
+さらに複雑なことに、一時的なフォークで拒否されたトランザクションが、容認されたチェーンの方に含まれていない可能性がありました。 これはトランザクションが取り消される可能性があることを意味します。 そのため、ファイナリティとは、トランザクションを取り消し不可能と見なすまでに待機する時間を指します。 以前のプルーフ・オブ・ワークのイーサリアムでは、特定のブロック`N`の上により多くのブロックがマイニングされるほど、`N`内のトランザクションが成功し、覆されることはないという確信度が高まりました。 現在のプルーフ・オブ・ステークではファイナリティは確率的なものではなく、明示的で、ブロックのプロパティによりファイナリティに至ります。
-## プルーフ・オブ・ワークのエネルギー使用 {#energy}
+## プルーフ・オブ・ワークのエネルギー消費 {#energy}
-ネットワークを安全に保つために必要なエネルギー量は、プルーフ・オブ・ワークが批判を受ける大きな要因です。 セキュリティと分散化を維持するために、プルーフ・オブ・ワークのイーサリアムは多量のエネルギーを消費しました。 イーサリアムは、プルーフ・オブ・ステークに移行する少し前、マイナーによる年間消費電力量が合計で年間約70 TWhに達していました(2022年7月18日の[digiconomist](https://digiconomist.net/)によるとチェコ共和国の年間消費電力量とほぼ同等) 。
+ネットワークを安全に保つために必要なエネルギー量は、プルーフ・オブ・ワークが批判を受ける大きな要因です。 セキュリティと分散化を維持するために、プルーフ・オブ・ワークのイーサリアムは多量のエネルギーを消費しました。 プルーフ・オブ・ステークへの移行直前、イーサリアムのマイナーは年間合計で約70 TWhを消費していました(2022年7月18日の[digiconomist](https://digiconomist.net/)によると、これはチェコ共和国の消費量とほぼ同じです)。
## メリットとデメリット {#pros-and-cons}
-| メリット | デメリット |
-| ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
-| プルーフ・オブ・ワークは中立。 開始時にETHは必要なく、ブロック報酬により残高が0 ETHから増える。 [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)では、最初にETHが必要。 | プルーフ・オブ・ワークはエネルギーを大量に消費するため、環境への悪影響がある。 |
-| プルーフ・オブ・ワークは、長年にわたって、ビットコインやイーサリアムを安全性と分散性を維持してきた十分にテスト・試行された合意メカニズム。 | マイニングをしたい場合は、専門機器が必要となり、始めるにあたって多額の投資が必要。 |
-| プルーフ・オブ・ステークと比較すると、実装が比較的容易。 | 必要な計算量が増えるため、マイニングプールがマイニングゲームを支配する可能性があり、集中化とセキュリティのリスクにつながる。 |
+| 長所 | 短所 |
+| ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
+| プルーフ・オブ・ワークは中立。 開始時にETHは必要なく、ブロック報酬により残高が0 ETHから増える。 [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)では、まずETHが必要です。 | プルーフ・オブ・ワークはエネルギーを大量に消費するため、環境への悪影響がある。 |
+| プルーフ・オブ・ワークは、長年にわたって、ビットコインやイーサリアムを安全性と分散性を維持してきた十分にテスト・試行された合意メカニズム。 | マイニングをしたい場合は、専門機器が必要となり、始めるにあたって多額の投資が必要。 |
+| プルーフ・オブ・ステークと比較すると、実装が比較的容易。 | 必要な計算量が増えるため、マイニングプールがマイニングゲームを支配する可能性があり、集中化とセキュリティのリスクにつながる。 |
## プルーフ・オブ・ステークとの比較 {#compared-to-pos}
@@ -94,16 +94,16 @@ lang: ja
[プルーフ・オブ・ステークの詳細](/developers/docs/consensus-mechanisms/pos/)
-## 映像で学びたい人向け {#visual-learner}
+## 映像で学びたい場合 {#visual-learner}
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [マジョリティ攻撃](https://en.bitcoin.it/wiki/Majority_attack)
-- [ファイナリティ概念について](https://blog.ethereum.org/2016/05/09/on-settlement-finality/)
+- [マジョリティアタック(多数派攻撃)](https://en.bitcoin.it/wiki/Majority_attack)
+- [決済のファイナリティについて](https://blog.ethereum.org/2016/05/09/on-settlement-finality/)
-### ビデオ {#videos}
+### 動画 {#videos}
- [プルーフ・オブ・ワークプロトコルの技術的な説明](https://youtu.be/9V1bipPkCTU)
diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/index.md
index ffe524c3904..b21b31b9c00 100644
--- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/index.md
+++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/index.md
@@ -1,6 +1,6 @@
---
-title: マイニング
-description: マイニングがイーサリアムでどのように機能していたのかの説明
+title: "マイニング"
+description: "マイニングがイーサリアムでどのように機能していたのかの説明"
lang: ja
---
@@ -13,9 +13,9 @@ lang: ja
xᵐ mod P ≡ 1-これらの定義から、次のようになります。 +これを避けるために、数論による結果を使う必要があります。 [_安全素数_](https://en.wikipedia.org/wiki/Safe_prime)は、`(P-1)/2` もまた素数であるような素数 `P` として定義されます。 [乗法群](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ` のメンバー `x` の_位数_は、
xᵐ mod P ≡ 1となる最小の `m` として定義されます。 +これらの定義を前提として、以下が成り立ちます。 -> 見解1. `x`を安全素数`P`の乗法群`ℤ/Pℤ`のメンバーとします。 `x mod P ≠ 1 mod P`かつ`x mod P ≠ P-1 mod P`の場合は、`x`の次数は、`P-1`または`(P-1)/2`となります。 +> 見解1. 安全素数 `P` について、`x` を乗法群 `ℤ/Pℤ` の元とします。 `x mod P ≠ 1 mod P` かつ `x mod P ≠ P-1 mod P` の場合、`x` の位数は `P-1` または `(P-1)/2` のいずれかです。 -_証明_. `P`は安全素数なので、\[ラグランジュの定理\]\[lagrange\]により、`x`の次数は`1`、`2`、`(P-1)/2`、または`P-1`のいずれかになります。 +_証明_。 `P` は安全素数であるため、[ラグランジュの定理][lagrange]により、`x` の位数は `1`、`2`、`(P-1)/2`、または `P-1` のいずれかになります。 -`x`の次数は`1`になることはできません。フェルマーの小定理により、次を満たすためです。 +フェルマーの小定理により次式が成り立つため、`x` の位数が `1` になることはありません。
xP-1 mod P ≡ 1-したがって、`x`は`ℤ/nℤ`の乗法的単位元でなければならず、一意です。 前提で`x≠1`としたので、これはありえません。 +したがって、`x` は `ℤ/nℤ` の乗法単位元でなければなりませんが、これは一意です。 前提として `x ≠ 1` と仮定しているため、これはありえません。 -`x = P-1`でない限り、`x`の次数を`2`にすることはできません。これは、`P`が素数であることに違反するためです。 +`x = P-1` でない限り、`x` の位数が `2` になることはありません。なぜなら、これは `P` が素数であることに反するためです。 -上記の命題から、`(picker * init) % P`の繰り返しは、少なくとも`(P-1)/2`の周期になることがわかります。 これは、`P`を2以上の累乗にほぼ等しい安全素数として選択し、`init`が`[2,2**256+1]`の間隔にあるためです。 `P`の大きさを考えると、冪剰余から周期を予想することはできません。 +上記の命題から、`(picker * init) % P` を繰り返すと、少なくとも `(P-1)/2` の周期長を持つことがわかります。 これは、`P` を2の大きなべき乗にほぼ等しい安全素数として選択し、`init` が区間 `[2,2**256+1]` にあるためです。 `P` の大きさを考えると、冪剰余からサイクルが生じることは予期すべきではありません。 -DAGの最初のセルを割り当てるとき (`init`というラベルの付いた変数) 、`pow(sha3(seed) + 2, 3, P)`を計算します。 一見すると、これは結果が`1`でも`P-1`でもないことを保証しません。 しかし、`P-1`は、安全素数であるため、見解1の帰結となる次の追加の保証があります。 +DAGの最初のセル(`init`というラベルの変数)を割り当てる際、`pow(sha3(seed) + 2, 3, P)` を計算します。 一見したところ、これは結果が `1` でも `P-1` でもないことを保証するものではありません。 しかし、`P-1` は安全素数であるため、観察1の系である以下の追加の保証があります。 -> 見解2. `x`を安全素数`P`の乗法群`ℤ/Pℤ`のメンバーとし、`w`を自然数とします。 `x mod P ≠ 1 mod P`かつ`x mod P ≠ P-1 mod P`および`w mod P ≠ P-1 mod P`かつ`w mod P ≠ 0 mod P`の場合、`xʷ mod P ≠ 1 mod P`かつ`xʷ mod P ≠ P-1 mod P` +> 見解2. 安全素数 `P` について、`x` を乗法群 `ℤ/Pℤ` の元とし、`w` を自然数とします。 `x mod P ≠ 1 mod P` かつ `x mod P ≠ P-1 mod P`、そして `w mod P ≠ P-1 mod P` かつ `w mod P ≠ 0 mod P` の場合、`xʷ mod P ≠ 1 mod P` かつ `xʷ mod P ≠ P-1 mod P` となります。 -### ハッシュ関数としての冪乗余 {#modular-exponentiation} +### ハッシュ関数としての冪剰余 {#modular-exponentiation} -`P`と`w`の特定の値に対して、関数`pow(x,w,P)`は、多くの衝突を起こす可能性があります。 たとえば、`pow(x,9,19) `は値`{1,18}`のみを取ります。 +`P` と `w` の特定の値に対して、関数 `pow(x, w, P)` は多くの衝突を起こす可能性があります。 例えば、`pow(x,9,19)` は値 `{1,18}` のみを取ります。 -`P`が素数であるとすると、累積余剰ハッシュ関数の適切な`w`は、次の結果を使用して選択できます。 +`P` が素数である場合、冪剰余ハッシュ関数に対する適切な `w` は、次の結果を用いて選択できます。 -> 見解3. `P`を素数とし、`ℤ/Pℤ`のすべての`a`かつ`b`において、そのときに限り`w`かつ`P-1`が互いに素であることが成り立ち、これは次のようになります。 -> ->
gas, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen-1] := returndata | |
-| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] = returndata | same as DELEGATECALL, but does not propagate original msg.sender and msg.value |
-| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `。` | | return mem[ost:ost+len-1] |
-| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | |
-| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] |
-| F6-F9 | _invalid_ | | | | | |
-| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | |
-| FB-FC | _invalid_ | | | | | |
-| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `。` | | revert(mem[ost:ost+len-1]) |
-| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | designated invalid opcode - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | |
-| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `。` | | すべてのETHを`addr`へ送信する。コントラクトが作成されたのと同じトランザクションで実行された場合、コントラクトは破壊されます。 |
+| スタック | 名前 | ガス | 初期スタック | 結果スタック | Mem/ストレージ | 注記 | |
+| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |
+| 00 | STOP | 0 | | | | 実行を停止 | |
+| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256の加算 (2\*\*256を法とする) | |
+| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256の乗算 (2\*\*256を法とする) | |
+| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256の減算 (2\*\*256を法とする) | |
+| 04 | DIV | 5 | `a, b` | `a // b` | | uint256の除算 | |
+| 05 | SDIV | 5 | `a, b` | `a // b` | | int256の除算 | |
+| 06 | MOD | 5 | `a, b` | `a % b` | | uint256の剰余 | |
+| 07 | SMOD | 5 | `a, b` | `a % b` | | int256の剰余 | |
+| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256の加算 (Nを法とする) | |
+| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256の乗算 (Nを法とする) | |
+| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256のべき乗 (2\*\*256を法とする) | |
+| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | (b+1)バイトから32バイトへの`x`の[符号拡張](https://wikipedia.org/wiki/Sign_extension) | |
+| 0C-0F | _無効_ | | | | | | |
+| 10 | LT | 3 | `a, b` | `a < b` | | uint256の比較 (小なり) | |
+| 11 | GT | 3 | `a, b` | `a > b` | | uint256の比較 (大なり) | |
+| 12 | SLT | 3 | `a, b` | `a < b` | | int256の比較 (小なり) | |
+| 13 | SGT | 3 | `a, b` | `a > b` | | int256の比較 (大なり) | |
+| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256の比較 (等しい) | |
+| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256がゼロかどうかの判定 | |
+| 16 | AND | 3 | `a, b` | `a && b` | | ビット単位のAND | |
+| 17 | OR | 3 | `a, b` | `a \\|\\| b` | | ビット単位のOR | |
+| 18 | XOR | 3 | `a, b` | `a ^ b` | | ビット単位のXOR | |
+| 19 | NOT | 3 | `a` | `~a` | | ビット単位のNOT | |
+| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | (u)int256 `x`の`i`番目のバイト (左から) | |
+| 1B | SHL | 3 | `shift, val` | `val << shift` | | 左シフト | |
+| 1C | SHR | 3 | `shift, val` | `val >> shift` | | 論理右シフト | |
+| 1D | SAR | 3 | `shift, val` | `val >> shift` | | 算術右シフト | |
+| 1E-1F | _無効_ | | | | | | |
+| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | |
+| 21-2F | _無効_ | | | | | | |
+| 30 | ADDRESS | 2 | `.` | `address(this)` | | 実行中のコントラクトのアドレス | |
+| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | 残高 (wei単位) | |
+| 32 | ORIGIN | 2 | `.` | `tx.origin` | | トランザクションを開始したアドレス | |
+| 33 | CALLER | 2 | `.` | `msg.sender` | | msg送信者のアドレス | |
+| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msgの値 (wei単位) | |
+| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | インデックス`idx`のmsgデータからワードを読み取る | |
+| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | msgデータの長さ (バイト単位) | |
+| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | msgデータのコピー | |
+| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | 実行中のコントラクトのコードの長さ (バイト単位) | |
+| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | 実行中のコントラクトのバイトコードをコピーする |
+| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | トランザクションのガス価格、単位ガスあたりのwei [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | |
+| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | `addr`にあるコードのサイズ (バイト単位) | |
+| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | `addr`からコードをコピー | |
+| 3D | RETURNDATASIZE | 2 | `.` | `size` | | 最後の外部呼び出しからの戻りデータのサイズ (バイト単位) | |
+| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | 最後の外部呼び出しからの戻りデータをコピーする | |
+| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `ハッシュ` | | ハッシュ = addr.exists ? keccak256(addr.code) : 0 | |
+| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | |
+| 41 | COINBASE | 2 | `.` | `block.coinbase` | | 現在のブロックの提案者アドレス | |
+| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | 現在のブロックのタイムスタンプ | |
+| 43 | NUMBER | 2 | `.` | `block.number` | | 現在のブロックの番号 | |
+| 44 | PREVRANDAO | 2 | `.` | `randomness beacon` | | ランダムネスビーコン | |
+| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | 現在のブロックのガスリミット | |
+| 46 | CHAINID | 2 | `.` | `chain_id` | | 現在の[チェーンID](https://eips.ethereum.org/EIPS/eip-155)をスタックにプッシュする | |
+| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | 実行中のコントラクトの残高 (wei単位) | |
+| 48 | BASEFEE | 2 | `.` | `block.basefee` | | 現在のブロックのベースフィー | |
+| 49 | BLOBHASH | 3 | `idx` | `tx.blob_versioned_hashes[idx]` | | [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) | |
+| 4A | BLOBBASEFEE | 2 | `.` | `block.blobbasefee` | | 現在のブロックのブロブベースフィー ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516)) | |
+| 4B-4F | _無効_ | | | | | | |
+| 50 | POP | 2 | `_anon` | `.` | | スタックの先頭からアイテムを削除して破棄する | |
+| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | オフセット`ost`のメモリからワードを読み取る | |
+| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | メモリにワードを書き込む | |
+| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | メモリに1バイトを書き込む | |
+| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | ストレージからワードを読み取る | |
+| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | ストレージにワードを書き込む | |
+| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` `dst`が有効なjumpdestの場合にのみ`pc`が割り当てられることを示す | |
+| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ?` dst : $pc + 1` | |
+| 58 | PC | 2 | `.` | `$pc` | | プログラムカウンター | |
+| 59 | MSIZE | 2 | `.` | `len(mem)` | | 現在の実行コンテキストにおけるメモリのサイズ (バイト単位) | |
+| 5A | GAS | 2 | `.` | `gasRemaining` | | | |
+| 5B | JUMPDEST | 1 | | | 有効なジャンプ先をマーク | 有効なジャンプ先。例えば、プッシュデータ内にないジャンプ先など | |
+| 5C | TLOAD | 100 | `key` | `tstorage[key]` | | 一時ストレージからワードを読み取る ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | |
+| 5D | TSTORE | 100 | `key, val` | `.` | tstorage[key] := val | 一時ストレージにワードを書き込む ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | |
+| 5E | MCOPY | 3+3\*words+[A0](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `dstOst, ost, len` | `.` | mem[dstOst] := mem[ost:ost+len] | ある領域から別の領域へメモリをコピーする ([EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)) | |
+| 5E | PUSH0 | 2 | `.` | `uint8` | | スタックへ定数値0をプッシュ | |
+| 60 | PUSH1 | 3 | `.` | `uint8` | | 1バイトの値をスタックにプッシュする | |
+| 61 | PUSH2 | 3 | `.` | `uint16` | | 2バイトの値をスタックにプッシュする | |
+| 62 | PUSH3 | 3 | `.` | `uint24` | | 3バイトの値をスタックにプッシュする | |
+| 63 | PUSH4 | 3 | `.` | `uint32` | | 4バイトの値をスタックにプッシュする | |
+| 64 | PUSH5 | 3 | `.` | `uint40` | | 5バイトの値をスタックにプッシュする | |
+| 65 | PUSH6 | 3 | `.` | `uint48` | | 6バイトの値をスタックにプッシュする | |
+| 66 | PUSH7 | 3 | `.` | `uint56` | | 7バイトの値をスタックにプッシュする | |
+| 67 | PUSH8 | 3 | `.` | `uint64` | | 8バイトの値をスタックにプッシュする | |
+| 68 | PUSH9 | 3 | `.` | `uint72` | | 9バイトの値をスタックにプッシュする | |
+| 69 | PUSH10 | 3 | `.` | `uint80` | | 10バイトの値をスタックにプッシュする | |
+| 6A | PUSH11 | 3 | `.` | `uint88` | | 11バイトの値をスタックにプッシュする | |
+| 6B | PUSH12 | 3 | `.` | `uint96` | | 12バイトの値をスタックにプッシュする | |
+| 6C | PUSH13 | 3 | `.` | `uint104` | | 13バイトの値をスタックにプッシュする | |
+| 6D | PUSH14 | 3 | `.` | `uint112` | | 14バイトの値をスタックにプッシュする | |
+| 6E | PUSH15 | 3 | `.` | `uint120` | | 15バイトの値をスタックにプッシュする | |
+| 6F | PUSH16 | 3 | `.` | `uint128` | | 16バイトの値をスタックにプッシュする | |
+| 70 | PUSH17 | 3 | `.` | `uint136` | | 17バイトの値をスタックにプッシュする | |
+| 71 | PUSH18 | 3 | `.` | `uint144` | | 18バイトの値をスタックにプッシュする | |
+| 72 | PUSH19 | 3 | `.` | `uint152` | | 19バイトの値をスタックにプッシュする | |
+| 73 | PUSH20 | 3 | `.` | `uint160` | | 20バイトの値をスタックにプッシュする | |
+| 74 | PUSH21 | 3 | `.` | `uint168` | | 21バイトの値をスタックにプッシュする | |
+| 75 | PUSH22 | 3 | `.` | `uint176` | | 22バイトの値をスタックにプッシュする | |
+| 76 | PUSH23 | 3 | `.` | `uint184` | | 23バイトの値をスタックにプッシュする | |
+| 77 | PUSH24 | 3 | `.` | `uint192` | | 24バイトの値をスタックにプッシュする | |
+| 78 | PUSH25 | 3 | `.` | `uint200` | | 25バイトの値をスタックにプッシュする | |
+| 79 | PUSH26 | 3 | `.` | `uint208` | | 26バイトの値をスタックにプッシュする | |
+| 7A | PUSH27 | 3 | `.` | `uint216` | | 27バイトの値をスタックにプッシュする | |
+| 7B | PUSH28 | 3 | `.` | `uint224` | | 28バイトの値をスタックにプッシュする | |
+| 7C | PUSH29 | 3 | `.` | `uint232` | | 29バイトの値をスタックにプッシュする | |
+| 7D | PUSH30 | 3 | `.` | `uint240` | | 30バイトの値をスタックにプッシュする | |
+| 7E | PUSH31 | 3 | `.` | `uint248` | | 31バイトの値をスタックにプッシュする | |
+| 7F | PUSH32 | 3 | `.` | `uint256` | | 32バイトの値をスタックにプッシュする | |
+| 80 | DUP1 | 3 | `a` | `a, a` | | スタック上の1番目の値を複製する | |
+| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | スタック上の2番目の値を複製する | |
+| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | スタック上の3番目の値を複製する | |
+| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | スタック上の4番目の値を複製する | |
+| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | スタック上の5番目の値を複製する | |
+| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | スタック上の6番目の値を複製する | |
+| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | スタック上の7番目の値を複製する | |
+| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | スタック上の8番目の値を複製する | |
+| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | スタック上の9番目の値を複製する | |
+| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | スタック上の10番目の値を複製する | |
+| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | スタック上の11番目の値を複製する | |
+| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | スタック上の12番目の値を複製する | |
+| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | スタック上の13番目の値を複製する | |
+| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | スタック上の14番目の値を複製する | |
+| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | スタック上の15番目の値を複製する | |
+| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | スタック上の16番目の値を複製する | |
+| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | |
+| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | |
+| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | |
+| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | |
+| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | |
+| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | |
+| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | |
+| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG2(memory[ost:ost+len-1], topic0, topic1) | |
+| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | |
+| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | |
+| A5-EF | _無効_ | | | | | | |
+| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | |
+| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `成功しました` | mem[retOst:retOst+retLen-1] := returndata | | |
+| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `成功しました` | mem[retOst:retOst+retLen-1] = returndata | DELEGATECALLと同じですが、元のmsg.senderとmsg.valueは伝播しません | |
+| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | mem[ost:ost+len-1]を返す | |
+| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `成功しました` | mem[retOst:retOst+retLen-1] := returndata | | |
+| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | |
+| F6-F9 | _無効_ | | | | | | |
+| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `成功しました` | mem[retOst:retOst+retLen-1] := returndata | | |
+| FB-FC | _無効_ | | | | | | |
+| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len-1]) | |
+| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | 指定された無効なオペコード - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | | |
+| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | すべてのETHを`addr`に送信します。コントラクトが作成されたのと同じトランザクションで実行された場合、そのコントラクトは破棄されます。 | |
diff --git a/public/content/translations/ja/developers/docs/frameworks/index.md b/public/content/translations/ja/developers/docs/frameworks/index.md
index d761d5d42e6..3018cf30898 100644
--- a/public/content/translations/ja/developers/docs/frameworks/index.md
+++ b/public/content/translations/ja/developers/docs/frameworks/index.md
@@ -1,141 +1,155 @@
---
-title: Dapp開発フレームワーク
-description: フレームワークの利点を調査し、利用可能なオプションを比較します。
+title: "Dapp開発フレームワーク"
+description: "フレームワークの利点を調査し、利用可能なオプションを比較します。"
lang: ja
---
## フレームワーク入門 {#introduction-to-frameworks}
-本格的なdappを構築するには、 さまざまな技術が必要になります。 ソフトウェアフレームワークには、必要な機能の多くが含まれています。 あるいは、好きなツールで作業できるように簡単なプラグインシステムが備わっています。
+本格的なdappを構築するには、
+さまざまな技術が必要になります。 ソフトウェアフレームワークには、必要な機能の多くが含まれています。
+あるいは、好きなツールで作業できるように簡単なプラグインシステムが備わっています。
フレームワークには、すぐに使用できる機能が数多く用意されています。例えば、以下のようなものです。
- ローカルブロックチェーンのインスタンスをスピンアップする機能
- スマートコントラクトをコンパイルしてテストするためのユーティリティ
-- 同じプロジェクト/リポジトリ内でユーザー側のアプリケーションを構築するために使用できる、クライアント開発アドオン
-- イーサリアムネットワーク(ローカルで実行されているインスタンスまたはイーサリアムのパブリックネットワーク)に接続し、コントラクトをデプロイするための設定
-- 分散型アプリケーションの配布 - IPFSなどのストレージオプションとの統合
+- ユーザー向けのアプリケーションを、同じプロジェクト/リポジトリ内で構築するための
+ クライアント開発アドオン。
+- Ethereumネットワークに接続しコントラクトをデプロイするための設定。
+ ローカル実行インスタンス、またはEthereumの
+ パブリックネットワークのいずれかで使用。
+- 分散型アプリの配布 - IPFSなどのストレージ
+ オプションとの統合。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-フレームワークの使用を開始する前に、[dapp](/developers/docs/dapps/)と[イーサリアムスタック](/developers/docs/ethereum-stack/)の入門を最初に読むことをお勧めします。
+フレームワークを深く掘り下げる前に、まず[dapps](/developers/docs/dapps/)と[Ethereumスタック](/developers/docs/ethereum-stack/)の入門ガイドに目を通すことをお勧めします。
## 利用可能なフレームワーク {#available-frameworks}
-**Foundry -** **_Foundryは、イーサリアムアプリケーション開発のための、迅速でポータブルなモジュラー型ツールキットです。_**
+**Foundry** - **_Foundryは、Ethereumアプリケーション開発のための、超高速でポータブルなモジュラーツールキットです_**
-- [Foundryをインストールする](https://book.getfoundry.sh/)
+- [Foundryのインストール](https://book.getfoundry.sh/)
- [Foundryブック](https://book.getfoundry.sh/)
-- [テレグラムのFoundryコミュニティチャット](https://t.me/foundry_support)
+- [Foundryコミュニティチャット (Telegram)](https://t.me/foundry_support)
- [Awesome Foundry](https://github.com/crisgarner/awesome-foundry)
-**Hardhat -** **_プロフェッショナルのためのイーサリアム開発環境_**
+**Hardhat -** **_プロフェッショナル向けのEthereum開発環境。_**
- [hardhat.org](https://hardhat.org)
- [GitHub](https://github.com/nomiclabs/hardhat)
-**Ape -** **_パイソニスタ、データサイエンティスト、セキュリティプロフェッショナル向けのスマートコントラクト開発ツール_**
+**Ape -** **_Pythonista、データサイエンティスト、セキュリティプロフェッショナル向けのスマートコントラクト開発ツール。_**
- [ドキュメント](https://docs.apeworx.io/ape/stable/)
- [GitHub](https://github.com/ApeWorX/ape)
-**Web3j -** **_JVM上でブロックチェーンアプリケーションを開発するためのプラットフォーム_**
+**Web3j -** **_JVM上でブロックチェーンアプリケーションを開発するためのプラットフォーム。_**
- [ホームページ](https://www.web3labs.com/web3j-sdk)
- [ドキュメント](https://docs.web3j.io)
- [GitHub](https://github.com/web3j/web3j)
-**ethers-kt -** **_EVMベースのブロックチェーン用の非同期、ハイパフォーマンスのKotlin/Java/Androidライブラリ_**
+**ethers-kt -** **_EVMベースのブロックチェーン向けの、非同期で高性能なKotlin/Java/Androidライブラリ。_**
- [GitHub](https://github.com/Kr1ptal/ethers-kt)
-- [実例:](https://github.com/Kr1ptal/ethers-kt/tree/master/examples)
+- [サンプル](https://github.com/Kr1ptal/ethers-kt/tree/master/examples)
- [Discord](https://discord.gg/rx35NzQGSb)
-**Create Eth App -** **_単一のコマンドで、イーサリアムで稼動するアプリケーションを作成可能。 豊富な選択肢を提供するUIフレームワークとDeFiテンプレートが付属。_**
+**Create Eth App -** **_単一のコマンドでEthereumを利用したアプリを作成。 豊富なUIフレームワークとDeFiテンプレートから選択できます。_**
- [GitHub](https://github.com/paulrberg/create-eth-app)
- [テンプレート](https://github.com/PaulRBerg/create-eth-app/tree/develop/templates)
-**Scaffold-Eth -** **_Scaffold-Eth - Ethers.js + Hardhat + React components and hooks for web3: スマートコントラクトを利用した分散型アプリケーションの構築を始めるために必要なすべてを網羅。_**
+**Scaffold-Eth -** **_Ethers.js + Hardhat + web3用Reactコンポーネントとフック:スマートコントラクトを搭載した分散型アプリケーションの構築を始めるために必要なすべてが揃っています。_**
- [GitHub](https://github.com/scaffold-eth/scaffold-eth-2)
-**Tenderly -** **_ブロックチェーンデベロッパーがスマートコントラクトを構築、テスト、デバッグ、監視、操作し、dApp UXを改善できるWeb3開発プラットフォーム。_**
+**Tenderly -** **_ブロックチェーンデベロッパーがスマートコントラクトの構築、テスト、デバッグ、監視、運用を行い、dappのUXを向上させることを可能にするWeb3開発プラットフォーム。_**
- [ウェブサイト](https://tenderly.co/)
- [ドキュメント](https://docs.tenderly.co/)
-**The Graph -** **_ブロックチェーンデータのクエリを効率化。_**
+**The Graph -** **_ブロックチェーンデータを効率的にクエリするためのThe Graph。_**
- [ウェブサイト](https://thegraph.com/)
- [チュートリアル](/developers/tutorials/the-graph-fixing-web3-data-querying/)
-**Alchemy -** **_イーサリアム開発プラットフォーム_**
+**Alchemy -** **_Ethereum開発プラットフォーム。_**
- [alchemy.com](https://www.alchemy.com/)
- [GitHub](https://github.com/alchemyplatform)
- [Discord](https://discord.com/invite/alchemyplatform)
-**NodeReal -** **_イーサリアム開発プラットフォーム。_**
+**NodeReal -** **_Ethereum開発プラットフォーム。_**
- [Nodereal.io](https://nodereal.io/)
- [GitHub](https://github.com/node-real)
- [Discord](https://discord.gg/V5k5gsuE)
-**サードウェブSDK -** **_強力なSDKとCLIを使ってスマートコントラクトとやり取りするWeb3アプリケーションを構築。_**
+**thirdweb SDK -** **_強力なSDKとCLIを使用して、スマートコントラクトと対話できるweb3アプリケーションを構築します。_**
- [ドキュメント](https://portal.thirdweb.com/sdk/)
- [GitHub](https://github.com/thirdweb-dev/)
-**Chainstack -** **_Web3(イーサリアム他)開発プラットフォーム。_**
+**Chainstack -** **_Web3 (Ethereumなど) 開発プラットフォーム。_**
- [chainstack.com](https://www.chainstack.com/)
- [GitHub](https://github.com/chainstack)
- [Discord](https://discord.gg/BSb5zfp9AT)
-**Crossmint -** **_エンタープライズグレードのweb3開発プラットで、すべての主要なEVMチェーン(および他のチェーン)でNFTアプリケーションをビルドすることができます。_**
+**Crossmint -** **_エンタープライズグレードのweb3開発プラットフォームで、すべての主要なEVMチェーン (およびその他) でNFTアプリケーションを構築できます。_**
- [ウェブサイト](https://www.crossmint.com)
- [ドキュメント](https://docs.crossmint.com)
- [Discord](https://discord.com/invite/crossmint)
-**Brownie -** **_Pythonベースの開発環境とテストフレームワーク。_**
+**Brownie -** **_Pythonベースの開発環境およびテストフレームワーク。_**
- [ドキュメント](https://eth-brownie.readthedocs.io/en/latest/)
- [GitHub](https://github.com/eth-brownie/brownie)
- **Brownieのメンテナンス終了**
-**OpenZeppelin SDK -** **_究極のスマートコントラクトツールキット。スマートコントラクトの開発、コンパイル、アップグレード、デプロイ、インタラクションを支援するツール群。_**
+**OpenZeppelin SDK -** **_究極のスマートコントラクトツールキット:スマートコントラクトの開発、コンパイル、アップグレード、デプロイ、操作を支援する一連のツール。_**
-- [OpenZeppelin SDK](https://openzeppelin.com/sdk/)
+- [OpenZeppelin Defender SDK](https://docs.openzeppelin.com/defender/sdk)
- [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk)
- [コミュニティフォーラム](https://forum.openzeppelin.com/c/support/17)
- **OpenZeppelin SDK開発の終了**
-**Catapulta -** **_マルチチェーン・スマートコントラクト・デプロイメントツール、ブロックエクスプローラでの自動検証、デプロイしたスマートコントラクトの追跡、デプロイメントレポートの共有、FoundryやHardhatのプラグ・アンド・プレイ。_**
+**Catapulta -** **_マルチチェーンのスマートコントラクトデプロイツール。ブロックエクスプローラーでの検証の自動化、デプロイ済みスマートコントラクトの追跡、デプロイレポートの共有、FoundryおよびHardhatプロジェクトへのプラグアンドプレイに対応。_**
- [ウェブサイト](https://catapulta.sh/)
- [ドキュメント](https://catapulta.sh/docs)
- [GitHub](https://github.com/catapulta-sh)
-**Covalent -** **_200以上のチェーンで使えるリッチなブロックチェーンAPI_**
+**GoldRush (powered by Covalent) -** **_GoldRushは、デベロッパー、アナリスト、企業向けに、最も包括的なブロックチェーンデータAPIスイートを提供します。 DeFiダッシュボード、ウォレット、取引ボット、AIエージェント、コンプライアンスプラットフォームのいずれを構築している場合でも、データAPIは、必要不可欠なオンチェーンデータへの高速で正確、かつデベロッパーフレンドリーなアクセスを提供します_**
-- [covalenthq.com](https://www.covalenthq.com/)
-- [ドキュメント](https://www.covalenthq.com/docs/api/)
+- [ウェブサイト](https://goldrush.dev/)
+- [ドキュメント](https://goldrush.dev/docs/chains/ethereum)
- [GitHub](https://github.com/covalenthq)
- [Discord](https://www.covalenthq.com/discord/)
-**Wake -** **_コントラクトのテスト、ファジング、デプロイ、脆弱性スキャン、コードナビゲーションが可能なオールインワンPythonフレームワーク。_**
+**Wake -** **_コントラクトのテスト、ファジング、デプロイ、脆弱性スキャン、コードナビゲーションのためのオールインワンPythonフレームワーク。_**
- [ホームページ](https://getwake.io/)
- [ドキュメント](https://ackeeblockchain.com/wake/docs/latest/)
- [GitHub](https://github.com/Ackee-Blockchain/wake)
-- [VS Codeエクステンション](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity)
+- [VS Code拡張機能](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity)
-## 参考文献 {#further-reading}
+**Veramo -** **_分散型アプリケーションのデベロッパーが、分散型アイデンティティと検証可能なクレデンシャルをアプリケーションに簡単に組み込むことができる、オープンソースでモジュール式の、特定のテクノロジーに依存しないフレームワーク。_**
-_役に立ったコミュニティリソースがあれば、 ぜひこのページに追加してください。_
+- [ホームページ](https://veramo.io/)
+- [ドキュメント](https://veramo.io/docs/basics/introduction)
+- [GitHub](https://github.com/uport-project/veramo)
+- [Discord](https://discord.com/invite/FRRBdjemHV)
+- [NPMパッケージ](https://www.npmjs.com/package/@veramo/core)
+
+## 参考リンク {#further-reading}
+
+_役に立つコミュニティリソースを知っていますか? Edit this page and add it!_
## 関連トピック {#related-topics}
-- [ローカル開発環境のセットアップ](/developers/local-environment/)
+- [ローカル開発環境をセットアップする](/developers/local-environment/)
diff --git a/public/content/translations/ja/developers/docs/gas/index.md b/public/content/translations/ja/developers/docs/gas/index.md
index a56f31e1c80..7f6b35c74c9 100644
--- a/public/content/translations/ja/developers/docs/gas/index.md
+++ b/public/content/translations/ja/developers/docs/gas/index.md
@@ -1,14 +1,15 @@
---
-title: ガスとフィー(手数料)
-description:
+title: "ガスとフィー(手数料)"
+metaTitle: "イーサリアムのガスと手数料:技術概要"
+description: "イーサリアムのガス手数料、その計算方法、そしてネットワークのセキュリティとトランザクション処理における役割について学びます。"
lang: ja
---
イーサリアムネットワークにとってガスは切り離せないものです。 ガスは車にとってのガソリンのようにイーサリアムを稼働させるための燃料として使われます。
-## 前提知識 {#prerequisites}
+## 前提条件 {#prerequisites}
-このページをよく理解するためには、まず[トランザクション](/developers/docs/transactions/)、[EVM](/developers/docs/evm/)を読むことをお勧めします。
+このページをよりよく理解するために、まず[トランザクション](/developers/docs/transactions/)と[EVM](/developers/docs/evm/)についてお読みになることをお勧めします。
## ガスとは {#what-is-gas}
@@ -16,25 +17,26 @@ lang: ja
イーサリアムでは、トランザクションを実行するには計算リソースが必要です。そのため、そのリソースの対価として料金を支払う必要があります。これにより、イーサリアムはスパム攻撃に対する脆弱性を解消し、無限の計算ループに陥ることを防ぎます。 計算料金は、ガス代として支払われます。
-ガス代は、**操作のガス使用量に、ガス単位当たりのコストを乗じた額**です。 この料金は、トランザクションが成功したか失敗したかに関係なく支払われます。
+ガス手数料とは、**ある操作を行うために使用されるガスの量に、ガス単位あたりのコストを乗じたもの**です。 この料金は、トランザクションが成功したか失敗したかに関係なく支払われます。
- _ [イーサリアムEVM](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)からの図解_
+
+_図は[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)を参考に作成_
実際にはガス代はイーサリアムのネイティブ通貨であるイーサ(ETH)で支払う必要があります。 ガス価格は通常、ETHの単位の1つであるgweiで見積もられます。 gweiは、ETHの10億分の1(0.000000001 ETHすなわち10-9 ETH)に相当します。
例えば、0.000000001 ETHのガス代は、1 gweiとなります。
-「gwai」とは、「10億wei」を意味する「giga-wei」の略語であり、 1 gweiは、10億weiに相当します。 weiは[b-money](https://www.investopedia.com/terms/b/bmoney.asp)の創始者である[Wei Dai](https://wikipedia.org/wiki/Wei_Dai)氏にちなんで名付けられ、ETHの最小単位です。
+「gwai」とは、「10億wei」を意味する「giga-wei」の略語であり、 1 gweiは、10億weiに相当します。 Wei自体([b-money](https://www.investopedia.com/terms/b/bmoney.asp)の作成者である[Wei Dai](https://wikipedia.org/wiki/Wei_Dai)にちなんで名付けられました)は、ETHの最小単位です。
## ガス代の計算方法 {#how-are-gas-fees-calculated}
ガス量を設定してトランザクションを送信できます。 ガス量をいくらか支払うことで、次のブロックに含まれるトランザクションに入札することになります。 ガス量が少なすぎると、バリデータがトランザクションを処理する可能性が低くなります。つまり、トランザクションが遅れて実行されたり、まったく実行されなかったりすることがあります。 一方で、ガス量が多すぎると、ETHを無駄にすることになります。 それでは、どのようにして適切なガス代を決めればよいのでしょうか。その方法について説明します。
-支払うガス代の合計は、`base fee`と`priority fee`(チップ) の2つのコンポーネントに分けられます。
+支払うガスの総額は、`base fee`と`priority fee`(チップ)の2つの要素に分かれています。
-`base fee`は、プロトコルで定められています。トランザクションを有効にするには、必ずこの手数料を支払う必要があります。 `priority fee`は、ベースフィーに追加して支払うチップです。この手数料を支払うことで、バリデータにとって、あなたのトランザクションが魅力的になり、次のブロックに選ばれるようになります。
+`base fee`はプロトコルによって設定されます。トランザクションが有効とみなされるためには、少なくともこの金額を支払う必要があります。 `priority fee`は、バリデータが次のブロックに含めるトランザクションとして選択するよう、トランザクションを魅力的にするために`base fee`に追加するチップです。
-トランザクションにおいて`base fee`のみを支払うことは、技術的には有効であるものの、バリデータにとって他のトランザクションよりも優先させるインセンティブがなく、そのトランザクションが選ばれる可能性は低くなります。 「正確な」`priority fee`は、トランザクション送信時のネットワーク使用状況で決定します。需要が高い場合は、`priority fee`を高めに設定する必要があります。需要が低い場合は、より安く設定できます。
+`base fee`のみを支払うトランザクションは技術的には有効ですが、バリデータが他のトランザクションよりも優先して選択するインセンティブがないため、ブロックに含まれる可能性は低いです。 「適切な」`priority fee`は、トランザクションを送信する時点でのネットワークの使用状況によって決まります。需要が多い場合は`priority fee`を高く設定する必要があるかもしれませんが、需要が少ない場合はより低い料金で済みます。
例えば、JordanがTaylorに1 ETHを支払わなければならない場合、 ガス単位で21,000が必要になります。基本料金は10 gweiですが、 Jordanはチップとして2 gweiを追加します。
@@ -42,54 +44,58 @@ lang: ja
`使用されるガス単位 × (ベースフィー + プライオリティフィー)`
-この式の`base fee`は、プロトコルで設定された値です。また、`priority fee`は、バリデータへのチップとしてユーザーが設定した値です。
+ここで、`base fee`はプロトコルによって設定される値で、`priority fee`はユーザーがバリデータへのチップとして設定する値です。
-つまり、`21,000 * (10 + 2) = 252,000 gwei` (0.000252 ETH)
+例: `21,000 * (10 + 2) = 252,000 gwei` (0.000252 ETH)。
-Jordanが送金すると、Jordanの口座から1.000252 ETHが差し引かれ、 Tayloの口座に1.0000ETHが入金されます。 また、バリデータには0.000042 ETHのチップが支払われ、 `base fee`である0.00021ETHはバーンされます。
+Jordanが送金すると、Jordanの口座から1.000252 ETHが差し引かれ、 Tayloの口座に1.0000ETHが入金されます。 また、バリデータには0.000042 ETHのチップが支払われ、 0.00021 ETHの`base fee`はバーンされます。
### ベースフィー {#base-fee}
-ブロックごとに、最低価格となるベースフィーが設定されています。 トランザクションをブロックに含めるには、ガスあたりの提供価格がベースフィー以上である必要があります。 ベースフィーは、現在のブロックとは別個に計算され、前のブロックによって決定されます。これにより、おおよそのトランザクションフィーを予測できます。 ブロックが作成されると、この**ベースフィーは「バーン」され**、流通から削除されます。
+ブロックごとに、最低価格となるベースフィーが設定されています。 トランザクションをブロックに含めるには、ガスあたりの提供価格がベースフィー以上である必要があります。 ベースフィーは現在のブロックとは無関係に計算され、その前のブロックによって決定されるため、ユーザーはトランザクション手数料をより予測しやすくなります。 ブロックが作成されると、この**ベースフィーは「バーン」**され、流通から削除されます。
-ベースフィーは、前のブロックのサイズ(すべてのトランザクションに使用されるガスの量)とターゲットサイズを比較して計算されます。 ターゲットブロックサイズを超えると、ベースフィーは1ブロックあたり最大12.5%増加します。 この指数的な増加により、ブロックサイズを無制限に高くすることは、経済的に不可能になります。
+ベースフィーは、前のブロックのサイズ(すべてのトランザクションに使用されたガスの量)をターゲットサイズ(ガスリミットの半分)と比較する数式によって計算されます。 ターゲットブロックサイズがターゲットを上回るか下回るかによって、ベースフィーはブロックごとに最大12.5%増減します。 この指数的な増加により、ブロックサイズを無制限に高くすることは、経済的に不可能になります。
-| ブロック数 | 含有ガス | 増加されるフィー | 現在のベースフィー |
-| ----- | ----:| --------:| ----------:|
-| 1 | 15M | 0% | 100 gwei |
-| 2 | 30M | 0% | 100 gwei |
-| 3 | 30M | 12.5% | 112.5 gwei |
-| 4 | 30M | 12.5% | 126.6 gwei |
-| 5 | 30M | 12.5% | 142.4 gwei |
-| 6 | 30M | 12.5% | 160.2 gwei |
-| 7 | 30M | 12.5% | 180.2 gwei |
-| 8 | 30M | 12.5% | 202.7 gwei |
+| ブロック数 | 含有ガス | 増加されるフィー | 現在のベースフィー |
+| ----- | ---: | --------------------: | -------------------------: |
+| 1 | 18M | 0% | 100 gwei |
+| 2 | 36M | 0% | 100 gwei |
+| 3 | 36M | 12.5% | 112.5 gwei |
+| 4 | 36M | 12.5% | 126.6 gwei |
+| 5 | 36M | 12.5% | 142.4 gwei |
+| 6 | 36M | 12.5% | 160.2 gwei |
+| 7 | 36M | 12.5% | 180.2 gwei |
+| 8 | 36M | 12.5% | 202.7 gwei |
-上の表によると、ブロック数9のトランザクションを行う場合、次のブロックに追加される**最大ベースフィー**は、`current base fee * 112.5%`、つまり`202.7 gwei * 112.5% = 228.1 gwei`となります。この情報がウォレットからユーザーに通知されます。
+上の表では、ガスリミットとして3,600万を使用した例が示されています。 この例に従い、ブロック番号9でトランザクションを作成する場合、ウォレットはユーザーに対し、次のブロックに追加される**最大ベースフィー**が `現在のベースフィー * 112.5%` または `202.7 gwei * 112.5% = 228.1 gwei` であることを確実に通知します。
また、フルブロックの状態になるとベースフィーの上昇速度が上がるため、フルブロックのスパイクが長続きしないことにも注意が必要です。
-| ブロック数 | 含有ガス | 増加されるフィー | 現在のベースフィー |
-| ----- | ----:| --------:| ---------------:|
-| 30 | 30M | 12.5% | 2705.6 gwei |
-| ... | ... | 12.5% | ... |
-| 50 | 30M | 12.5% | 28531.3 gwei |
-| ... | ... | 12.5% | ... |
-| 100 | 30M | 12.5% | 10302608.6 gwei |
+| ブロック数 | 含有ガス | 増加されるフィー | 現在のベースフィー |
+| --------------------------------------------------- | --------------------------------------------------: | --------------------: | --------------------------------------------------: |
+| 30 | 36M | 12.5% | 2705.6 gwei |
+| ... | ... | 12.5% | ... |
+| 50 | 36M | 12.5% | 28531.3 gwei |
+| ... | ... | 12.5% | ... |
+| 100 | 36M | 12.5% | 10302608.6 gwei |
-### プライオリティフィー(チップ) {#priority-fee}
+### 優先手数料(チップ) {#priority-fee}
-バリデータは、プライオリティフィー(チップ)を受け取ることで、ブロック内にトランザクションを含めるインセンティブを得ます。 チップがなければ、空のブロックをマイニングした方が、同じブロック報酬を得られるので経済的に有利となります。 チップが少ないと、バリデータにとってトランザクションを含めるインセンティブは小さくなります。 そのため、競合するトランザクションよりも高いチップを支払うことで、同じブロック内の他のトランザクションよりも優先的にトランザクションが実行されるようになります。
+優先手数料(チップ)は、ブロックガスリミットによってのみ制約されるブロック内のトランザクション数を最大化するよう、バリデータにインセンティブを与えます。 チップがなければ、合理的なバリデータは、実行レイヤーやコンセンサスレイヤーからの直接的なペナルティなしに、より少ない、あるいはゼロのトランザクションを含めることができます。これは、ステーキング報酬がブロック内のトランザクション数に依存しないためです。 さらに、チップにより、ユーザーは同じブロック内での優先権を他者より高く入札することができ、事実上の緊急性を示すことができます。
-### 最大フィー {#maxfee}
+### 最大手数料 {#maxfee}
-ネットワーク上でトランザクションを実行する場合、ユーザーはトランザクション実行に支払うフィーの上限を指定できます。 このオプションのパラメータは、`maxFeePerGas`として知られています。 トランザクションを実行するには、最大フィーがベースフィーとチップの合計額を上回る必要があります。 トランザクションの送信者には、最大フィーからベースフィーとチップの合計額を差し引いた差額が返金されます。
+ネットワーク上でトランザクションを実行する場合、ユーザーはトランザクション実行に支払うフィーの上限を指定できます。 このオプションパラメータは`maxFeePerGas`として知られています。 トランザクションを実行するには、最大フィーがベースフィーとチップの合計額を上回る必要があります。 トランザクションの送信者には、最大フィーからベースフィーとチップの合計額を差し引いた差額が返金されます。
### ブロックサイズ {#block-size}
-各ブロックの目標サイズは3,000万ガスですが、ブロックの上限である6,000万ガス(目標ブロックサイズの2倍)までは、ネットワークの需要に応じてブロックのサイズが増減します。 このプロトコルは、 _tâtonnement_のプロセスを通じて平均1,500万の平衡ブロックサイズを実現します。 つまり、ブロックサイズがターゲットブロックサイズよりも大きい場合、プロトコルは次のブロックのベースフィーを増加させます。 同様に、ブロックサイズがターゲットブロックサイズより小さい場合、プロトコルはベースフィーを減らします。 ベースフィーが調整される金額は、現在のブロックサイズとターゲットまでの差に比例します。 [ブロックの詳細](/developers/docs/blocks/)
+各ブロックは現在のガスリミットの半分のターゲットサイズを持ちますが、ブロックのサイズはネットワークの需要に応じて、ブロックリミット(ターゲットブロックサイズの2倍)に達するまで増減します。 プロトコルは、_tâtonnement_ (手探り)のプロセスを通じて、ターゲットで平均ブロックサイズの均衡を達成します。 つまり、ブロックサイズがターゲットブロックサイズよりも大きい場合、プロトコルは次のブロックのベースフィーを増加させます。 同様に、ブロックサイズがターゲットブロックサイズより小さい場合、プロトコルはベースフィーを減らします。
-### ガス代を実際に計算する {#calculating-fees-in-practice}
+ベースフィーが調整される金額は、現在のブロックサイズとターゲットまでの差に比例します。 これは、空のブロックで-12.5%、ターゲットサイズで0%、ガスリミットに達したブロックで最大+12.5%という線形計算です。 ガスリミットは、バリデータのシグナリングやネットワークのアップグレードによって、時間とともに変動する可能性があります。 ガスリミットの経時的な変化は[こちらで確認できます](https://eth.blockscout.com/stats/averageGasLimit?interval=threeMonths)。
+
+[ブロックについての詳細](/developers/docs/blocks/)
+
+### ガス手数料を実際に計算する {#calculating-fees-in-practice}
トランザクションを実行するために支払う金額を具体的に指定できますが、 ほとんどのウォレットプロバイダーは、ユーザーへの負担を軽減するため、推奨トランザクションフィー(ベースフィー + 推奨プライオリティフィー)を自動で計算しています。
@@ -97,42 +103,49 @@ Jordanが送金すると、Jordanの口座から1.000252 ETHが差し引かれ
簡単に説明すると、ガス代はイーサリアムネットワークを安全に保つのに役立ちます。 ネットワーク上のそれぞれの計算処理に手数料を課すことで、ネットワークに対する攻撃を防止します。 コード内の偶発的または敵対的な無限ループ、またはその他の過剰計算による損失を防ぐために、 各トランザクションはコード実行の計算ステップ数(1トランザクションにおける計算量)を制限する必要があります。 計算の基本単位は「ガス」になります。
-トランザクションには制限がありますが、トランザクションで使用されなかったガスはユーザーに返却されます(例: `max fee - (base fee + tip)`が返金)。
+トランザクションには上限が含まれますが、トランザクションで使用されなかったガスはユーザーに返還されます(例: `max fee - (base fee + tip)`が返還)。
- _ [イーサリアムEVM](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)からの図解_
+
+_図は[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)を参考に作成_
## ガスリミットとは {#what-is-gas-limit}
-ガスリミットとは、1回のトランザクションで消費できるガスの最大量のことです。 [スマートコントラクト](/developers/docs/smart-contracts/)を含む複雑なトランザクションでは、単純な支払いよりもより多くの計算作業が必要なため、高いガスリミットを必要とします。 標準のETH送金には、21,000ユニットのガスリミットが必要です。
+ガスリミットとは、1回のトランザクションで消費できるガスの最大量のことです。 [スマートコントラクト](/developers/docs/smart-contracts/)を伴うより複雑なトランザクションは、より多くの計算作業を必要とするため、単純な支払いよりも高いガスリミットが必要です。 標準のETH送金には、21,000ユニットのガスリミットが必要です。
-例えば、簡単なETH送金に50,000のガスリミットを設定した場合、EVMは21,000を消費し、残りの29,000が戻されます。 ただしETH送金に、例えば20,000など少なすぎるガスリミットを指定すると、EVMはトランザクションを満たそうとして20,000のガスユニットを消費しますが、完了はしません。 EVMは変更を元に戻しますが、バリデータがすでに20,000ガスユニット分の作業を実施済みのため、その分のガスは消費されます。
+例えば、簡単なETH送金に50,000のガスリミットを設定した場合、EVMは21,000を消費し、残りの29,000が戻されます。 しかし、例えば単純なETH送金に対して20,000のガスリミットのように、指定するガスが少なすぎると、トランザクションは検証フェーズで失敗します。 ブロックに含まれる前に拒否され、ガスは消費されません。 一方、実行中にトランザクションのガスが尽きた場合(例えば、スマートコントラクトが途中でガスをすべて使い果たした場合)、EVMはすべての変更を元に戻しますが、提供されたガスはすべて実行された作業に対して消費されます。
## ガス代が高い理由 {#why-can-gas-fees-get-so-high}
高いガス代はイーサリアムの人気の高さが原因です。 需要が高すぎると、他のユーザーのトランザクションよりも高いチップをオファーする必要があり、 高いチップを払うほど、トランザクションが次のブロックに入る可能性が高くなります。 また、より複雑なスマートコントラクトアプリは、その機能を維持するために多くの操作を実行し、大量のガスを消費することがあります。
-## ガス代削減への取り組み {#initiatives-to-reduce-gas-costs}
+## ガス代を削減するための取り組み {#initiatives-to-reduce-gas-costs}
+
+イーサリアムの[スケーラビリティアップグレード](/roadmap/)は、最終的にガス手数料の問題の一部を解決するはずです。これにより、プラットフォームは毎秒数千のトランザクションを処理し、世界規模でスケールできるようになります。
-イーサリアムの[スケーラビリティ・アップグレード](/roadmap/)は、最終的にいくつかのガス代の問題を解決し、ひいてはプラットフォームが毎秒数千のトランザクションを処理し、グローバルにスケールアップできるはずです。
+レイヤー2のスケーリングは、ガス代、ユーザーエクスペリエンス、スケーラビリティを大幅に向上させるための主要なイニシアチブです。
-レイヤー2のスケーリングは、ガス代、ユーザーエクスペリエンス、スケーラビリティを大幅に向上させるための主要なイニシアチブです。 [レイヤー2スケーリングの詳細](/developers/docs/scaling/#layer-2-scaling)
+[レイヤー2スケーリングについての詳細](/developers/docs/scaling/#layer-2-scaling)
-## ガス代のモニタリング {#monitoring-gas-fees}
+## ガス手数料のモニタリング {#monitoring-gas-fees}
ETHをより安く送れるようにガス代を節約したい場合は、次のような様々なツールを利用できます。
-- [Etherscan](https://etherscan.io/gastracker)_トランザクションガス価格見積もりツール_
-- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _タイプ0のレガシートランザクションとタイプ2のEIP-1559トランザクションの両方をサポートするChrome拡張機能のガス見積もりツール。_
-- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator)_メインネット、Arbitrum、Polygonで異なるトランザクションタイプのガス代をローカル通貨で計算_
+- [Etherscan](https://etherscan.io/gastracker) _トランザクションのガス価格見積りツール_
+- [Blockscout](https://eth.blockscout.com/gas-tracker) _オープンソースのトランザクションガス価格見積もりツール_
+- [ETH Gas Tracker](https://www.ethgastracker.com/) _イーサリアムとL2のガス価格を監視・追跡し、トランザクション手数料を削減してコストを節約_
+- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _タイプ0のレガシートランザクションとタイプ2のEIP-1559トランザクションの両方をサポートするガス見積もりChrome拡張機能。_
+- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _メインネット、Arbitrum、Polygonにおけるさまざまなトランザクションタイプのガス手数料を自国通貨で計算。_
## 関連ツール {#related-tools}
-- [Blocknative's Gas Platform](https://www.blocknative.com/gas) _Blocknativeのグローバルmempoolデータプラットフォームを搭載したガス見積もりAPI_
+- [Blocknative's Gas Platform](https://www.blocknative.com/gas) _Blocknativeのグローバルなメンプールデータプラットフォームを利用したガス見積もりAPI_
+- [Gas Network](https://gas.network) オンチェーンのガスオラクル。 35以上のチェーンをサポート。
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [イーサリアムガスの説明](https://defiprime.com/gas)
-- [スマートコントラクトのガス消費量の削減](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a)
-- [デベロッパーのためのガス最適化戦略](https://www.alchemy.com/overviews/solidity-gas-optimization)
-- [EIP-1559のドキュメント](https://eips.ethereum.org/EIPS/eip-1559)
-- [Tim BeikoによるEIP-1559のリソース](https://hackmd.io/@timbeiko/1559-resources)
+- [イーサリアムのガス解説](https://defiprime.com/gas)
+- [スマートコントラクトのガス消費量を削減する](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a)
+- [開発者向けガス最適化戦略](https://www.alchemy.com/overviews/solidity-gas-optimization)
+- [EIP-1559のドキュメント](https://eips.ethereum.org/EIPS/eip-1559)。
+- [Tim BeikoのEIP-1559関連資料](https://hackmd.io/@timbeiko/1559-resources)
+- [EIP-1559:メカニズムとミームを切り離す](https://web.archive.org/web/20241126205908/https://research.2077.xyz/eip-1559-separating-mechanisms-from-memes)
diff --git a/public/content/translations/ja/developers/docs/ides/index.md b/public/content/translations/ja/developers/docs/ides/index.md
index f14f8f97516..30033e81e88 100644
--- a/public/content/translations/ja/developers/docs/ides/index.md
+++ b/public/content/translations/ja/developers/docs/ides/index.md
@@ -1,16 +1,16 @@
---
-title: 統合開発環境 (IDE)
-description:
+title: "統合開発環境 (IDE)"
+description: "Remix、VS Code、人気のプラグインなど、イーサリアム開発のためのウェブベース及びデスクトップIDEについて学ぶ。"
lang: ja
---
-[統合開発環境(IDE)](https://wikipedia.org/wiki/Integrated_development_environment)のセットアップに関して言えば、イーサリアム上のアプリケーションのプログラミングは、他のソフトウェアプロジェクトのプログラミングと類似しています。 多くの選択肢があるので、最終的には自分の好みに合ったIDEやコードエディタを選んでください。 イーサリアムの開発に最適なIDEは、ほとんどの場合、従来のソフトウェア開発ですでに使用しているIDEです。
+[統合開発環境 (IDE)](https://wikipedia.org/wiki/Integrated_development_environment) のセットアップに関して言えば、イーサリアム上のアプリケーションのプログラミングは、他のソフトウェアプロジェクトのプログラミングと類似しています。 多くの選択肢があるので、最終的には自分の好みに合ったIDEやコードエディタを選んでください。 イーサリアムの開発に最適なIDEは、ほとんどの場合、従来のソフトウェア開発ですでに使用しているIDEです。
-## WebベースのIDE {#web-based-ides}
+## ウェブベースのIDE {#web-based-ides}
-[ローカル開発環境のセットアップ](/developers/local-environment/)を行う前にコードを触りたい場合、以下のウェブアプリがイーサリアムのスマートコントラクト開発用にカスタムビルドされています。
+[ローカル開発環境をセットアップする](/developers/local-environment/)前にコードを試したいのであれば、これらのウェブアプリはイーサリアムのスマートコントラクト開発用にカスタムビルドされています。
-**[Remix](https://remix.ethereum.org/) ** - **_組み込みの静的解析とテストブロックチェーンの仮想マシンを備えた、ウェブベースのIDE_**
+**[Remix](https://remix.ethereum.org/)** - **_静的解析機能とテスト用ブロックチェーン仮想マシンを内蔵したウェブベースのIDE_**
- [ドキュメント](https://remix-ide.readthedocs.io/en/latest/#)
- [Gitter](https://gitter.im/ethereum/remix)
@@ -20,7 +20,7 @@ lang: ja
- [ドキュメント](https://chainide.gitbook.io/chainide-english-1/)
- [ヘルプフォーラム](https://forum.chainide.com/)
-**[Replit (Solidityスターター - ベータ版)](https://replit.com/@replit/Solidity-starter-beta)** - **_ホットリロード、エラーチェック、最高級のテストネットサポートを提供する、イーサリアムのためのカスタマイズ可能な開発環境_**
+**[Replit (Solidityスターター - ベータ版)](https://replit.com/@replit/Solidity-starter-beta)** - **_ホットリロード、エラーチェック、優れたテストネットサポートを備えた、イーサリアム向けのカスタマイズ可能な開発環境_**
- [ドキュメント](https://docs.replit.com/)
@@ -30,18 +30,17 @@ lang: ja
- [Gitter](https://gitter.im/loomnetwork/ethfiddle)
-## デスクトップのIDE {#desktop-ides}
+## デスクトップIDE {#desktop-ides}
-ほとんどの定番IDEでは、イーサリアムの開発体験を向上させるプラグインが構築されています。 少なくとも、[スマートコントラクト言語](/developers/docs/smart-contracts/languages/)の構文強調表示は使用できます。
+ほとんどの定番IDEでは、イーサリアムの開発体験を向上させるプラグインが構築されています。 最低限、[スマートコントラクト言語](/developers/docs/smart-contracts/languages/)のシンタックスハイライトを提供します。
-**Visual Studio Code -** **_イーサリアムから公式にサポートされている、プロフェッショナルなクロスプラットフォームIDE_**
+**Visual Studio Code -** **_イーサリアムの公式サポートを備えた、プロフェッショナルなクロスプラットフォームIDE_**
- [Visual Studio Code](https://code.visualstudio.com/)
-- [Azure Blockchain Workbench](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/microsoft-azure-blockchain.azure-blockchain-workbench?tab=Overview)
-- [サンプルコード](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md)
+- [コードサンプル](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md)
- [GitHub](https://github.com/microsoft/vscode)
-**JetBrains IDE (IntelliJ IDEAなど) -** **_ソフトウェアデベロッパーやチームに不可欠なツール_**
+**JetBrains IDEs (IntelliJ IDEA, etc.) -** **_ソフトウェアデベロッパーやチームに不可欠なツール_**
- [JetBrains](https://www.jetbrains.com/)
- [GitHub](https://github.com/JetBrains)
@@ -54,12 +53,12 @@ lang: ja
## プラグインと拡張機能 {#plugins-extensions}
-- [Solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) - Visual Studio CodeのためのイーサリアムのSolidity言語
-- [VS CodeのためのSolidityとHardhat](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) - HardhatチームによるSolidityとHardhatのサポート
-- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) - Prettierを使用するコードフォーマッター
+- [solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) - Visual Studio Code向けイーサリアムSolidity言語
+- [Solidity + Hardhat for VS Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) - HardhatチームによるSolidityおよびHardhatサポート
+- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) - Prettierを使用したコードフォーマッター
-## 参考文献 {#further-reading}
+## 参考リンク {#further-reading}
-- [Ethereum IDEs](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _- Alchemyのイーサリアム統合開発環境のリスト_
+- [Ethereum IDEs](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _- AlchemyによるイーサリアムIDEのリスト_
-_役に立つコミュニティリソースをご存知の場合は、 ページを編集して追加してください。_
+_役に立つコミュニティリソースを知っていますか? Edit this page and add it!_
diff --git a/public/content/translations/ja/developers/docs/index.md b/public/content/translations/ja/developers/docs/index.md
index 204575f5275..085d1c83083 100644
--- a/public/content/translations/ja/developers/docs/index.md
+++ b/public/content/translations/ja/developers/docs/index.md
@@ -1,18 +1,18 @@
---
-title: イーサリアムの開発ドキュメント
-description: ethereum.orgのデベロッパー向けドキュメントの紹介
+title: "イーサリアムの開発ドキュメント"
+description: "ethereum.orgのデベロッパー向けドキュメントの紹介"
lang: ja
---
このドキュメントは、イーサリアムでの構築を支援するためのものです。 コンセプトとしてのイーサリアムを紹介し、イーサリアムの技術スタックに加えて、より複雑なアプリケーションやユースケース向けの高度なトピックを説明しています。
-これはオープンソースのコミュニティ活動ですので、役に立つと思われる場合は、新しいトピックの提案、新しいコンテンツの追加、または例を提供してください。 すべてのドキュメントはGitHubで編集できます。編集方法がわからない場合は、[こちらの手順](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md)に従ってください。
+これはオープンソースのコミュニティ活動ですので、役に立つと思われる場合は、新しいトピックの提案、新しいコンテンツの追加、または例を提供してください。 すべてのドキュメントはGitHubで編集できます – 方法がわからない場合は、[こちらの手順に従ってください](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md)。
## 開発モジュール {#development-modules}
初めてイーサリアムの開発に挑戦される方は、最初から本のように読み進めていくことをお勧めします。
-### 基本的なトピック {#foundational-topics}
+### 基礎的なトピック {#foundational-topics}
+ {JSON.stringify(attrs.object, null, 2)}
+```
+
+ほとんどのフィールドは、[`JSON.stringify`](https://www.w3schools.com/js/js_json_stringify.asp)を使用して表示されます。
+
+```tsx
+
+ { funs.length > 0 &&
+ <>
+ Functions:
+ @`を含むコメントは、 [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) を通じて人間が読みやすいドキュメントに変換されます。
+Vyperのコメントは、Pythonと同様に、ハッシュ記号(`#`)で始まり、行末まで続きます。 `@<キーワード>`を含むコメントは、[NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html)によって、人間が読める
+ドキュメントを生成するために使用されます。
```python
from vyper.interfaces import ERC721
@@ -33,176 +35,206 @@ from vyper.interfaces import ERC721
implements: ERC721
```
-ERC-721インターフェイスは、Vyper言語に組み込まれています。 [コードの定義はこちら](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py)をご覧ください。 インターフェイスの定義は、VyperではなくPythonで書かれています。これは、インターフェイスがブロックチェーン内だけでなく、Pythonで書かれた外部クライアントからブロックチェーンにトランザクションを送る際にも使われるからです。
+ERC-721インターフェイスはVyper言語に組み込まれています。
+[コードの定義はこちらで確認できます](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py)。
+インターフェイスの定義はVyperではなくPythonで書かれています。なぜなら、インターフェイスはブロックチェーン内で使用されるだけでなく、Pythonで書かれている可能性のある外部クライアントからブロックチェーンにトランザクションを送信する際にも使用されるからです。
-第1行はインターフェイスをインポートし、第2行はここで実装することを指示します。
+最初の行でインターフェイスをインポートし、2行目でここで実装することを指定しています。
-### ERC-721のReceiverインターフェイス {#receiver-interface}
+### ERC721Receiverインターフェイス {#receiver-interface}
```python
-# Interface for the contract called by safeTransferFrom()
+# safeTransferFrom()によって呼び出されるコントラクトのインターフェイス
interface ERC721Receiver:
def onERC721Received(
```
-ERC-721は、2つの送信方法をサポートしています。
+ERC-721は2種類の送金をサポートしています。
-- `transferFrom`は、送信者が任意の送信先アドレスを指定するもので、送信の責任は送信者が担います。 このため無効なアドレスにも送信できますが、その場合はNFTは永遠に失われます。
-- `safeTransferFrom`は、送信先アドレスがコントラクトかどうかを確認します。 送信先アドレスがコントラクトであることを確認すると、ERC-721コントラクトが受信側のコントラクトにNFTを受け取りたいかどうかを尋ねます。
+- `transferFrom`: 送信者が任意の宛先アドレスを指定でき、
+ 送金の責任は送信者にあります。 これは、無効なアドレスに送金できることを意味し、その場合
+ NFTは永久に失われます。
+- `safeTransferFrom`: 宛先アドレスがコントラクトであるかどうかをチェックします。 もしそうであれば、ERC-721コントラクトは
+ 受信側のコントラクトにNFTを受け取りたいかどうかを尋ねます。
-`safeTransferFrom`リクエストに応答するには、受信側コントラクトが`ERC721Receiver`を実装していなければなりません。
+`safeTransferFrom`リクエストに応答するには、受信側コントラクトが`ERC721Receiver`を実装する必要があります。
```python
_operator: address,
_from: address,
```
-`_from`のアドレスは、トークンの現在の所有者のアドレスです。 `_operator`のアドレスは、 送信を要求したアドレスです(アローワンスにより、これらの 2 つが同一でない場合があります)。
+`_from`アドレスは、トークンの現在の所有者です。 `_operator`アドレスは、
+送金をリクエストしたアドレスです(アローワンスのため、この2つは同じでない場合があります)。
```python
_tokenId: uint256,
```
-ERC-721トークンのIDは、256ビットです。 通常トークンIDは、トークンの内容をハッシュ化して生成されます。
+ERC-721トークンIDは256ビットです。 通常、トークンIDはトークンが表すものの説明を
+ハッシュ化して作成されます。
```python
_data: Bytes[1024]
```
-このリクエストには、最大1024バイトのユーザーデータを含めることができます。
+リクエストには最大1024バイトのユーザーデータを含めることができます。
```python
) -> bytes32: view
```
-コントラクトが誤送信を受け入れるケースを防止するため、戻り値はブール値ではなく、256ビットの特定の値になっています。
+コントラクトが誤って送金を受け入れるケースを防ぐため、戻り値はブール値ではなく、
+特定の価を持つ256ビットです。
-この関数は`view`関数であるため、ブロックチェーンの状態を読み取るだけで、変更はできません。
+この関数は`view`であり、ブロックチェーンの状態を読み取ることはできますが、変更することはできません。
### イベント {#events}
-[イベント](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e)は、ブロックチェーン外のユーザーおよびサーバーにイベントを通知するために発行されます。 イベントの内容は、ブロックチェーン上のコントラクトでは利用できないことに注意してください。
+[イベント](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e)は、ブロックチェーン外のユーザーやサーバーにイベントを通知するために発行されます。 イベントの内容は、ブロックチェーン上のコントラクトからは
+利用できないことに注意してください。
```python
-# @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
-# created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
-# number of NFTs may be created and assigned without emitting Transfer. At the time of any
-# transfer, the approved address for that NFT (if any) is reset to none.
-# @param _from Sender of NFT (if address is zero address it indicates token creation).
-# @param _to Receiver of NFT (if address is zero address it indicates token destruction).
-# @param _tokenId The NFT that got transferred.
+# @dev 何らかのメカニズムによってNFTの所有権が変更されたときに発行されます。このイベントは、NFTが作成
+# (`from` == 0)および破棄(`to` == 0)されたときに発行されます。例外:コントラクト作成中、任意の
+# 数のNFTがTransferを発行せずに作成および割り当てられる場合があります。任意の
+# 送金時、そのNFTの承認済みアドレス(もしあれば)はnoneにリセットされます。
+# @param _from NFTの送信者(アドレスがゼロアドレスの場合、トークンの作成を示します)。
+# @param _to NFTの受信者(アドレスがゼロアドレスの場合、トークンの破棄を示します)。
+# @param _tokenId 送金されたNFT。
event Transfer:
sender: indexed(address)
receiver: indexed(address)
tokenId: indexed(uint256)
```
-これは、金額の代わりに`tokenId`を伝える点を除くとERC-20のTransferイベントと類似しています。 アドレスを所有しないユーザーはいないので、慣習的に、このイベントを使ってトークンの発行と破壊を報告しています。
+これは、金額の代わりに`tokenId`を報告する点を除けば、ERC-20のTransferイベントと似ています。
+ゼロアドレスを所有する者はいないため、慣例的にトークンの作成と破棄を報告するために使用します。
```python
-# @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
-# address indicates there is no approved address. When a Transfer event emits, this also
-# indicates that the approved address for that NFT (if any) is reset to none.
-# @param _owner Owner of NFT.
-# @param _approved Address that we are approving.
-# @param _tokenId NFT which we are approving.
+# @dev NFTの承認済みアドレスが変更または再確認されたときに発行されます。ゼロ
+# アドレスは、承認済みアドレスがないことを示します。Transferイベントが発行されると、これも
+# そのNFTの承認済みアドレス(もしあれば)がnoneにリセットされることを示します。
+# @param _owner NFTの所有者。
+# @param _approved 承認するアドレス。
+# @param _tokenId 承認するNFT。
event Approval:
owner: indexed(address)
approved: indexed(address)
tokenId: indexed(uint256)
```
-ERC-721の承認は、ERC-20におけるアローワンスに類似した機能です。 特定のアドレスから、特定のトークンを送信することが可能です。 これにより、コントラクトがトークンを受け入れる際に対応するためのメカニズムが実現します。 コントラクトは、イベントをリッスンできないため、トークンが送信されてもそれを「把握」できないのです。 つまり、所有者はまず承認を提出してから、コントラクトに対して「私はあなたがトークンXを送信することを承認しましたので、〜を実行してください」というリクエストを送信するわけです。
+ERC-721の承認はERC-20のアローワンスに似ています。 特定のアドレスが特定の
+トークンを送金することが許可されます。 これにより、コントラクトがトークンを受け入れる際に応答するためのメカニズムが提供されます。 コントラクトは
+イベントをリッスンできないため、トークンを送金しただけでは、コントラクトはそのことを「知り」ません。 この方法では、
+所有者はまず承認を送信し、次にコントラクトに「トークン
+Xの送金を承認しました。どうぞ...」というリクエストを送信します。
-これは、ERC-721標準をERC-20と類似の標準にするための設計上の選択によるものです。 ERC-721トークンは非代替性であるため、コントラクトは、トークンの所有権を調べて特定のトークンを受け取ったかどうかを確認できます。
+これは、ERC-721標準をERC-20標準と類似させるための設計上の選択です。 ERC-721トークンは非代替性であるため、
+コントラクトはトークンの所有権を見ることで、特定のトークンを受け取ったことを
+識別することもできます。
```python
-# @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
-# all NFTs of the owner.
-# @param _owner Owner of NFT.
-# @param _operator Address to which we are setting operator rights.
-# @param _approved Status of operator rights(true if operator rights are given and false if
-# revoked).
+# @dev 所有者のオペレーターが有効または無効になったときに発行されます。オペレーターは
+# 所有者のすべてのNFTを管理できます。
+# @param _owner NFTの所有者。
+# @param _operator オペレーター権限を設定するアドレス。
+# @param _approved オペレーター権限のステータス(権限が付与された場合はtrue、
+# 取り消された場合はfalse)。
event ApprovalForAll:
owner: indexed(address)
operator: indexed(address)
approved: bool
```
-場合によっては、委任状の機能のように、アカウントが所有する特定タイプのトークン(特定のコントラクトが管理するトークン)をすべて管理できる_オペレーター_ を持つことが便利な場合もあります。 例えば、私がコントラクトに対して、6カ月にわたりそのコントラクトとのやりとりを行っていないかどうかを確認する権限を与え、もしやりとりがない場合には、私のアセットを相続人に分配するように設定したいとします(相続人の一人が遺産分配を求めても、トランザクションによって呼び出されない限りコントラクトは何も実行できません)。 ERC-20では、継承コントラクトに対して大きなアローワンスを設定できますが、ERC-721の場合、非代替性を持つために不可能です。 そこで、オペレーターが同等の機能を提供します。
+委任状のように、特定タイプの(特定のコントラクトによって管理される)アカウントの全トークンを管理できる_オペレーター_がいると便利な場合があります。 例えば、私が6ヶ月間連絡を取っていないかどうかをチェックし、もしそうであれば私の資産を相続人に分配する権限をコントラクトに与えたいかもしれません(相続人の一人が要求した場合、コントラクトはトランザクションによって呼び出されない限り何もできません)。 ERC-20では、継承コントラクトに高いアローワンスを与えることができますが、
+ERC-721ではトークンが非代替性であるため、これは機能しません。 これが同等の機能です。
-`approved`の値を通じて、当該イベントが承認を求めるものか、承認を取り消したものかを確認することができます。
+`approved`の値は、イベントが承認のためのものか、承認の取り消しのためのものかを示します。
### 状態変数 {#state-vars}
-状態変数には、トークンの現在の状態、つまりどのトークンが存在し、誰が所有するかの情報が含まれます。 大部分の状態変数は`HashMap`オブジェクトであり、[2つのタイプ間に存在する一方向のマッピング](https://vyper.readthedocs.io/en/latest/types.html#mappings)です。
+これらの変数には、トークンの現在の状態、つまりどのトークンが利用可能で誰が所有しているかの情報が含まれています。 これらのほとんどは`HashMap`オブジェクトであり、[2つの型間に存在する一方向のマッピング](https://vyper.readthedocs.io/en/latest/types.html#mappings)です。
```python
-# @dev Mapping from NFT ID to the address that owns it.
+# @dev NFT IDからそれを所有するアドレスへのマッピング。
idToOwner: HashMap[uint256, address]
-# @dev Mapping from NFT ID to approved address.
+# @dev NFT IDから承認済みアドレスへのマッピング。
idToApprovals: HashMap[uint256, address]
```
-イーサリアムにおいて、ユーザーおよびコントラクトのIDは160ビットのアドレスで表示されます。 これら2つの変数は、トークンIDから、所有者および送信することを承認された者(それぞれにつき最大1つの変数)がマッピングされます。 イーサリアムでは、未初期化データは常にゼロであるため、所有者または承認済み送信者が存在しなければ、トークンの値はゼロになります。
+イーサリアムでは、ユーザーとコントラクトのIDは160ビットのアドレスで表されます。 これら2つの変数は、トークンIDから、
+その所有者と送金を承認された者(それぞれ最大1つ)にマッピングします。 イーサリアムでは、未初期化データは常にゼロであるため、
+所有者または承認済み送金者がいない場合、そのトークンの値はゼロになります。
```python
-# @dev Mapping from owner address to count of his tokens.
+# @dev 所有者アドレスからそのトークン数へのマッピング。
ownerToNFTokenCount: HashMap[address, uint256]
```
-この変数は、各所有者ごとのトークン数を保持します。 所有者とトークンはマッピングされないため、特定の所有者が持つトークンを特定するには、ブロックチェーンのイベント履歴を過去に遡って確認し、当該の`Transfer`イベントを確認するしかありません。 この変数を使用して、すべてのNFTでいつ取得したか知ることができ、それ以上調べる必要がありません。
+この変数は、各所有者のトークン数を保持します。 所有者からトークンへのマッピングはないため、
+特定の所有者が所有するトークンを識別する唯一の方法は、ブロックチェーンのイベント履歴を遡り、
+適切な`Transfer`イベントを見ることです。 この変数を使用して、すべてのNFTをいつ取得したかを知ることができ、
+それ以上調べる必要がありません。
-ただし、このアルゴリズムはユーザーインターフェイスおよび外部サーバーのみを対象とする点に注意してください。 ブロックチェーン上で実行されるコード自体は、過去イベントを読み込むことができません。
+このアルゴリズムは、ユーザーインターフェイスと外部サーバーに対してのみ機能することに注意してください。 ブロックチェーン上で実行されるコード
+自体は、過去のイベントを読み取ることはできません。
```python
-# @dev Mapping from owner address to mapping of operator addresses.
+# @dev 所有者アドレスからオペレーターアドレスのマッピングへのマッピング。
ownerToOperators: HashMap[address, HashMap[address, bool]]
```
-1つのアカウントには、複数のオペレーターを含めることができます。 しかし、単純な`HashMap`では、各キーごとに単一の値を持つため、複数のオペレーターを追跡するのに十分ではありません。 その代わりに、`HashMap[address, bool]`を値として使用します。 デフォルトでは、各アドレスの値は`False`になっていますが、これはオペレーターでないことを示します。 オペレーターに設定するには、値を`True`に変更してください。
+1つのアカウントに複数のオペレーターがいる場合があります。 単純な`HashMap`では、各キーが単一の値につながるため、
+それらを追跡するには不十分です。 代わりに、値として
+`HashMap[address, bool]`を使用できます。 デフォルトでは、各アドレスの値は`False`であり、
+オペレーターではないことを意味します。 必要に応じて値を`True`に設定できます。
```python
-# @dev Address of minter, who can mint a token
+# @dev トークンをミントできるミンターのアドレス
minter: address
```
-何らかの方法で、新規トークンを作成する必要があります。 このコントラクトでは、新規トークンを作成する権限を持つ唯一のエンティティは`minter`です。 使用事例がゲームなどの場合は、これで十分でしょう。 その他の目的の場合、より複雑なビジネスロジックを作成する必要があるでしょう。
+新しいトークンは何らかの方法で作成されなければなりません。 このコントラクトには、それを許可された単一のエンティティ、
+`minter`が存在します。 例えば、ゲームにとってはこれで十分でしょう。 他の目的のためには、
+より複雑なビジネスロジックを作成する必要があるかもしれません。
```python
-# @dev Mapping of interface id to bool about whether or not it's supported
+# @dev インターフェイスIDから、それがサポートされているかどうかを示すbool値へのマッピング
supportedInterfaces: HashMap[bytes32, bool]
-# @dev ERC165 interface ID of ERC165
+# @dev ERC165のERC165インターフェイスID
ERC165_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000001ffc9a7
-# @dev ERC165 interface ID of ERC721
+# @dev ERC721のERC165インターフェイスID
ERC721_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000080ac58cd
```
-[ERC-165](https://eips.ethereum.org/EIPS/eip-165)では、コントラクトにおいてアプリケーションがどのようなやりとりを行うか、およびどのERC規格に準拠するのかを開示するメカニズムの仕様が規定されています。 このコントラクトの場合、ERC-165とERC-721に準拠しています。
+[ERC-165](https://eips.ethereum.org/EIPS/eip-165)は、コントラクトがアプリケーションと
+通信する方法、つまりどのERCに準拠しているかを公開するためのメカニズムを指定します。 この場合、コントラクトはERC-165とERC-721に準拠しています。
### 関数 {#functions}
-以下は、実際にERC-721で実装できる関数です。
+これらは、実際にERC-721を実装する関数です。
-#### コンストラクタ関数 {#constructor}
+#### コンストラクタ {#constructor}
```python
@external
def __init__():
```
-Pythonの場合と同様に、Vyperでもコンストラクタ関数は`__init__`で呼び出します。
+Vyperでは、Pythonと同様に、コンストラクタ関数は`__init__`と呼ばれます。
```python
"""
- @dev Contract constructor.
+ @dev コントラクトコンストラクタ。
"""
```
-PythonおよびVyperでは、複数行の文字列(文頭および文末を`"""`に付ける)を指定し、この文字列を利用しないことでもコメントを作成できます。 これらのコメントには、 [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html)を含めることも可能です。
+PythonやVyperでは、複数行の文字列(`"""`で始まり終わる)を指定し、それを一切使用しないことでコメントを作成することもできます。 これらのコメントには、
+[NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html)も含まれる場合があります。
```python
self.supportedInterfaces[ERC165_INTERFACE_ID] = True
@@ -210,57 +242,64 @@ PythonおよびVyperでは、複数行の文字列(文頭および文末を`""
self.minter = msg.sender
```
-状態変数にアクセスするには、`self.`を使用します(これも、Pythonと同様です)。
+状態変数にアクセスするには`self.<変数名>`を使用します(これもPythonと同じです)。
#### ビュー関数 {#views}
-ビュー関数は、ブロックチェーンの状態を変更しない関数であり、外部から呼び出されると無料で実行されます。 一方、コントラクトがビュー関数を呼び出す場合は全ノードで実行する必要があるため、ガス代が発生します。
+これらはブロックチェーンの状態を変更しない関数であり、したがって外部から
+呼び出された場合は無料で実行できます。 ビュー関数がコントラクトによって呼び出された場合でも、
+すべてのノードで実行する必要があるため、ガス代がかかります。
```python
@view
@external
```
-アットマーク (`@`)で始まる関数定義の前に置かれたこれらのキーワードを、_デコレータ_と呼びます。 デコレータは、関数を呼び出せる状況を特定します。
+関数定義の前にある、アットマーク(`@`)で始まるこれらのキーワードは、_デコレータ_と呼ばれます。 これらは
+関数を呼び出すことができる状況を指定します。
-- `@view`は、関数がビューであることを規定します。
-- `@external`は、関数がトランザクションおよび他のコントラクトで呼び出し可能であることを規定します。
+- `@view`は、この関数がビューであることを指定します。
+- `@external`は、この特定の関数がトランザクションや他のコントラクトによって呼び出されることを指定します。
```python
def supportsInterface(_interfaceID: bytes32) -> bool:
```
-Pythonとは異なり、Vyperは[静的型付け言語](https://wikipedia.org/wiki/Type_system#Static_type_checking)です。 つまり、[データ型](https://vyper.readthedocs.io/en/latest/types.html)を指定しないと変数、つまり関数のパラメータを宣言できません。 この場合では、入力パラメータは、256ビット値の`bytes32`です (256ビットは、[イーサリアム仮想マシン](/developers/docs/evm/)のネイティブワードサイズです) 。 出力は、ブール値です。 慣習により、関数におけるパラメータの名称はアンダースコア (`_`) で開始します。
+Pythonとは対照的に、Vyperは[静的型付け言語](https://wikipedia.org/wiki/Type_system#Static_type_checking)です。
+[データ型](https://vyper.readthedocs.io/en/latest/types.html)を特定せずに、変数や関数パラメータを宣言することはできません。 この場合、入力パラメータは`bytes32`、つまり256ビット値です
+(256ビットは[イーサリアム仮想マシン](/developers/docs/evm/)のネイティブワードサイズです)。 出力はブール
+値です。 慣例により、関数パラメータの名前はアンダースコア(`_`)で始まります。
```python
"""
- @dev Interface identification is specified in ERC-165.
- @param _interfaceID Id of the interface
+ @dev インターフェイスの識別はERC-165で指定されています。
+ @param _interfaceID インターフェイスのID
"""
return self.supportedInterfaces[_interfaceID]
```
-コンストラクタ(`__init__`)で設定した`self.supportedInterfaces`ハッシュマップが値を返します。
+コンストラクタ(`__init__`)で設定された`self.supportedInterfaces` HashMapから値を返します。
```python
-### VIEW FUNCTIONS ###
+### ビュー関数 ###
+
```
-これらは、ユーザーや他のコントラクトが利用できるトークンについての情報を提供するビュー関数です。
+これらは、トークンに関する情報をユーザーや他のコントラクトが利用できるようにするビュー関数です。
```python
@view
@external
def balanceOf(_owner: address) -> uint256:
"""
- @dev Returns the number of NFTs owned by `_owner`.
- Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid.
- @param _owner Address for whom to query the balance.
+ @dev `_owner`が所有するNFTの数を返します。
+ `_owner`がゼロアドレスの場合はスローします。ゼロアドレスに割り当てられたNFTは無効と見なされます。
+ @param _owner 残高を照会するアドレス。
"""
assert _owner != ZERO_ADDRESS
```
-この行は、`_owner`値がゼロでないことを[宣言](https://vyper.readthedocs.io/en/latest/statements.html#assert)します。 値がゼロの場合、エラーが発生し操作が元に戻されます。
+この行は、`_owner`がゼロでないことを[アサート](https://vyper.readthedocs.io/en/latest/statements.html#assert)します。 もしゼロであれば、エラーが発生し、操作は取り消されます。
```python
return self.ownerToNFTokenCount[_owner]
@@ -269,70 +308,74 @@ def balanceOf(_owner: address) -> uint256:
@external
def ownerOf(_tokenId: uint256) -> address:
"""
- @dev Returns the address of the owner of the NFT.
- Throws if `_tokenId` is not a valid NFT.
- @param _tokenId The identifier for an NFT.
+ @dev NFTの所有者のアドレスを返します。
+ `_tokenId`が有効なNFTでない場合はスローします。
+ @param _tokenId NFTの識別子。
"""
owner: address = self.idToOwner[_tokenId]
- # Throws if `_tokenId` is not a valid NFT
+ # `_tokenId`が有効なNFTでない場合はスローします
assert owner != ZERO_ADDRESS
return owner
```
-イーサリアム仮想マシン(EVM)では、値が格納されていないストレージはゼロになります。 `_tokenId`にトークンが含まれない場合、`self.idToOwner[_tokenId]`の値はゼロになります。 その場合、関数は元に戻されます。
+イーサリアム仮想マシン(EVM)では、値が格納されていないストレージはゼロになります。
+`_tokenId`にトークンがない場合、`self.idToOwner[_tokenId]`の値はゼロになります。 その場合、
+関数は元に戻されます。
```python
@view
@external
def getApproved(_tokenId: uint256) -> address:
"""
- @dev Get the approved address for a single NFT.
- Throws if `_tokenId` is not a valid NFT.
- @param _tokenId ID of the NFT to query the approval of.
+ @dev 単一のNFTの承認済みアドレスを取得します。
+ `_tokenId`が有効なNFTでない場合はスローします。
+ @param _tokenId 承認を照会するNFTのID。
"""
- # Throws if `_tokenId` is not a valid NFT
+ # `_tokenId`が有効なNFTでない場合はスローします
assert self.idToOwner[_tokenId] != ZERO_ADDRESS
return self.idToApprovals[_tokenId]
```
-`getApproved`は、ゼロの値を返す_可能性_がある点に注意してください。 有効なトークンが存在する場合、`self.idToApprovals[_tokenId]`の値が返されます。 承認者が存在しない場合、値はゼロになります。
+`getApproved`はゼロを返す_可能性がある_ことに注意してください。 トークンが有効な場合、`self.idToApprovals[_tokenId]`を返します。
+承認者がいない場合、その値はゼロです。
```python
@view
@external
def isApprovedForAll(_owner: address, _operator: address) -> bool:
"""
- @dev Checks if `_operator` is an approved operator for `_owner`.
- @param _owner The address that owns the NFTs.
- @param _operator The address that acts on behalf of the owner.
+ @dev `_operator`が`_owner`の承認済みオペレーターであるかどうかをチェックします。
+ @param _owner NFTを所有するアドレス。
+ @param _operator 所有者の代わりに機能するアドレス。
"""
return (self.ownerToOperators[_owner])[_operator]
```
-この関数は、「`_operator`」がこのコントラクト内の「`_owner`」のトークンをすべて管理できるかどうかをチェックします。 複数のオペレーターが存在する可能性があるため、ハッシュマップも2つのレベルが存在します。
+この関数は、`_operator`がこのコントラクト内の`_owner`のすべてのトークンを管理できるかどうかをチェックします。
+複数のオペレーターが存在する可能性があるため、これは2レベルのHashMapです。
-#### 送信ヘルパー関数 {#transfer-helpers}
+#### 送金ヘルパー関数 {#transfer-helpers}
-これらの関数は、トークンの送信またはトークン管理の一部のオペレーションを実装しています。
+これらの関数は、トークンの送金または管理の一部である操作を実装します。
```python
-### TRANSFER FUNCTION HELPERS ###
+### 送金関数ヘルパー ###
@view
@internal
```
-`@internal`のデコレータは、関数が同一コントラクト内の他の関数からのみアクセス可能であることを意味します。 これらの関数も、慣習によりアンダースコア (`_`) で開始します。
+このデコレータ`@internal`は、この関数が同じコントラクト内の他の関数からのみアクセス可能であることを意味します。 慣例により、これらの関数名もアンダースコア(`_`)で始まります。
```python
def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool:
"""
- @dev Returns whether the given spender can transfer a given token ID
- @param spender address of the spender to query
- @param tokenId uint256 ID of the token to be transferred
- @return bool whether the msg.sender is approved for the given token ID,
- is an operator of the owner, or is the owner of the token
+ @dev 指定されたスペンダーが指定されたトークンIDを送金できるかどうかを返します
+ @param spender 照会するスペンダーのアドレス
+ @param tokenId 送金されるトークンのuint256 ID
+ @return bool msg.senderが指定されたトークンIDに対して承認されているか、
+ 所有者のオペレーターであるか、トークンの所有者であるかどうか
"""
owner: address = self.idToOwner[_tokenId]
spenderIsOwner: bool = owner == _spender
@@ -341,117 +384,122 @@ def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool:
return (spenderIsOwner or spenderIsApproved) or spenderIsApprovedForAll
```
-アドレスからトークンを送信できるようにするには、次の3通りの方法があります:
+アドレスがトークンを送金できるようにするには、3つの方法があります。
-1. アドレスが、トークンの所有者であること
-2. アドレスが、トークンの使用を承認されていること
-3. アドレスが、トークンの所有者のオペレーターであること
+1. アドレスがトークンの所有者である
+2. アドレスがそのトークンを使用することを承認されている
+3. アドレスがトークンの所有者のオペレーターである
-上記の機能は、状態を変更しないためビュー機能とすることもできます。 オペレーションコストを軽減するには、ビュー機能と_指定できる_関数はビュー機能に_するべき_です。
+上記の関数は状態を変更しないため、ビューにすることができます。 運用コストを削減するために、ビューに_できる_関数は
+すべてビューに_すべき_です。
```python
@internal
def _addTokenTo(_to: address, _tokenId: uint256):
"""
- @dev Add a NFT to a given address
- Throws if `_tokenId` is owned by someone.
+ @dev 指定されたアドレスにNFTを追加します
+ `_tokenId`が誰かによって所有されている場合はスローします。
"""
- # Throws if `_tokenId` is owned by someone
+ # `_tokenId`が誰かによって所有されている場合はスローします
assert self.idToOwner[_tokenId] == ZERO_ADDRESS
- # Change the owner
+ # 所有者を変更
self.idToOwner[_tokenId] = _to
- # Change count tracking
+ # カウント追跡を変更
self.ownerToNFTokenCount[_to] += 1
@internal
def _removeTokenFrom(_from: address, _tokenId: uint256):
"""
- @dev Remove a NFT from a given address
- Throws if `_from` is not the current owner.
+ @dev 指定されたアドレスからNFTを削除します
+ `_from`が現在の所有者でない場合はスローします。
"""
- # Throws if `_from` is not the current owner
+ # `_from`が現在の所有者でない場合はスローします
assert self.idToOwner[_tokenId] == _from
- # Change the owner
+ # 所有者を変更
self.idToOwner[_tokenId] = ZERO_ADDRESS
- # Change count tracking
+ # カウント追跡を変更
self.ownerToNFTokenCount[_from] -= 1
```
-送信に問題が発生した場合、呼び出しは取り消されます。
+送金に問題がある場合、呼び出しを元に戻します。
```python
@internal
def _clearApproval(_owner: address, _tokenId: uint256):
"""
- @dev Clear an approval of a given address
- Throws if `_owner` is not the current owner.
+ @dev 指定されたアドレスの承認をクリアします
+ `_owner`が現在の所有者でない場合はスローします。
"""
- # Throws if `_owner` is not the current owner
+ # `_owner`が現在の所有者でない場合はスローします
assert self.idToOwner[_tokenId] == _owner
if self.idToApprovals[_tokenId] != ZERO_ADDRESS:
- # Reset approvals
+ # 承認をリセット
self.idToApprovals[_tokenId] = ZERO_ADDRESS
```
-必要な場合のみ、値を変更してください。 状態変数は、ストレージ上に保存されます。 ストレージへの書き込みは、EVM(イーサリアム仮想マシン)において[ガス代](/developers/docs/gas/)が最も高価なオペレーションの1つです。 既存の値の書き込みもコストが高いため、ストレージへの書き込みは最低限に抑えることをお勧めします。
+必要な場合のみ、値を変更してください。 状態変数はストレージに存在します。 ストレージへの書き込みは、
+EVM (イーサリアム仮想マシン) が行う最も高価な操作の1つです([ガス](/developers/docs/gas/)の観点から)。 したがって、既存の値を書き込むだけでも
+コストが高いため、これを最小限に抑えることをお勧めします。
```python
@internal
def _transferFrom(_from: address, _to: address, _tokenId: uint256, _sender: address):
"""
- @dev Execute transfer of a NFT.
- Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
- address for this NFT. (NOTE: `msg.sender` not allowed in private function so pass `_sender`.)
- Throws if `_to` is the zero address.
- Throws if `_from` is not the current owner.
- Throws if `_tokenId` is not a valid NFT.
+ @dev NFTの送金を実行します。
+ `msg.sender`が現在の所有者、承認されたオペレーター、またはこのNFTの承認
+ 済みアドレスでない限り、スローします。(注:`msg.sender`はプライベート関数では許可されていないため、`_sender`を渡します。)
+ `_to`がゼロアドレスの場合はスローします。
+ `_from`が現在の所有者でない場合はスローします。
+ `_tokenId`が有効なNFTでない場合はスローします。
"""
```
-トークンの送信には2つの方法(通常モードと安全モード)が存在するため、この内部関数が提供されていますが、監査を容易にするために、コード内で送信するロケーションは1つだけにする必要があります。
+トークンを送金するには2つの方法(通常と安全)があるため、この内部関数がありますが、
+監査を容易にするために、コード内の1つの場所でのみ実行するようにしています。
```python
- # Check requirements
+ # 要件をチェック
assert self._isApprovedOrOwner(_sender, _tokenId)
- # Throws if `_to` is the zero address
+ # `_to`がゼロアドレスの場合はスローします
assert _to != ZERO_ADDRESS
- # Clear approval. Throws if `_from` is not the current owner
+ # 承認をクリアします。`_from`が現在の所有者でない場合はスローします
self._clearApproval(_from, _tokenId)
- # Remove NFT. Throws if `_tokenId` is not a valid NFT
+ # NFTを削除します。`_tokenId`が有効なNFTでない場合はスローします
self._removeTokenFrom(_from, _tokenId)
- # Add NFT
+ # NFTを追加
self._addTokenTo(_to, _tokenId)
- # Log the transfer
+ # 送金をログに記録
log Transfer(_from, _to, _tokenId)
```
-Vyper上でイベントを発行するには、`log`ステートメントを使用します(詳細は、[こちら](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging)をご覧ください)。
+Vyperでイベントを発行するには、`log`ステートメントを使用します([詳細はこちら](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging))。
-#### 送信関数 {#transfer-funs}
+#### 送金関数 {#transfer-funs}
```python
-### TRANSFER FUNCTIONS ###
+### 送金関数 ###
@external
def transferFrom(_from: address, _to: address, _tokenId: uint256):
"""
- @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
- address for this NFT.
- Throws if `_from` is not the current owner.
- Throws if `_to` is the zero address.
- Throws if `_tokenId` is not a valid NFT.
- @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
- they maybe be permanently lost.
- @param _from The current owner of the NFT.
- @param _to The new owner.
- @param _tokenId The NFT to transfer.
+ @dev `msg.sender`が現在の所有者、承認されたオペレーター、またはこのNFTの承認
+ 済みアドレスでない限り、スローします。
+ `_from`が現在の所有者でない場合はスローします。
+ `_to`がゼロアドレスの場合はスローします。
+ `_tokenId`が有効なNFTでない場合はスローします。
+ @notice 呼び出し元は、`_to`がNFTを受信できることを確認する責任があります。さもないと、
+ 永久に失われる可能性があります。
+ @param _from NFTの現在の所有者。
+ @param _to 新しい所有者。
+ @param _tokenId 送金するNFT。
"""
self._transferFrom(_from, _to, _tokenId, msg.sender)
```
-この関数は、任意のアドレスに送信する機能を提供します。 送信先のアドレスがユーザーであるか、トークンの送信方法が分かっているコントラクトでない場合、送信するトークンはそのアドレスに置かれたまま利用できない状態になります。
+この関数を使用すると、任意のアドレスに送金できます。 アドレスがユーザーであるか、トークンの送金方法を知っているコントラクトでない限り、
+送金したトークンはそのアドレスでスタックし、使用できなくなります。
```python
@external
@@ -462,75 +510,80 @@ def safeTransferFrom(
_data: Bytes[1024]=b""
):
"""
- @dev Transfers the ownership of an NFT from one address to another address.
- Throws unless `msg.sender` is the current owner, an authorized operator, or the
- approved address for this NFT.
- Throws if `_from` is not the current owner.
- Throws if `_to` is the zero address.
- Throws if `_tokenId` is not a valid NFT.
- If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if
- the return value is not `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
- NOTE: bytes4 is represented by bytes32 with padding
- @param _from The current owner of the NFT.
- @param _to The new owner.
- @param _tokenId The NFT to transfer.
- @param _data Additional data with no specified format, sent in call to `_to`.
+ @dev NFTの所有権をあるアドレスから別のアドレスに送金します。
+ `msg.sender`が現在の所有者、承認されたオペレーター、またはこの
+ NFTの承認済みアドレスでない限り、スローします。
+ `_from`が現在の所有者でない場合はスローします。
+ `_to`がゼロアドレスの場合はスローします。
+ `_tokenId`が有効なNFTでない場合はスローします。
+ `_to`がスマートコントラクトの場合、`_to`で`onERC721Received`を呼び出し、
+ 戻り値が`bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`でない場合にスローします。
+ 注:bytes4はパディング付きのbytes32で表されます
+ @param _from NFTの現在の所有者。
+ @param _to 新しい所有者。
+ @param _tokenId 送金するNFT。
+ @param _data 指定されたフォーマットのない追加データで、`_to`への呼び出しで送信されます。
"""
self._transferFrom(_from, _to, _tokenId, msg.sender)
```
-問題が発生した場合にはトランザクションが元に戻され、コールに含まれるすべての事項が取り消されるため、先に送信を行っても構いません。
+問題が発生した場合はとにかく元に戻すので、先に送金しても問題ありません。
+呼び出しで行われたことはすべてキャンセルされます。
```python
- if _to.is_contract: # check if `_to` is a contract address
+ if _to.is_contract: # `_to`がコントラクトアドレスかどうかをチェック
```
-まず、アドレスがコントラクトであるか(コードを持つか)を確認してください。 アドレスがコントラクトでない場合、ユーザーのアドレスであれば、そのトークンを使用/送信できるようになります。 しかし、これがセキュリティを強化すると考えるべきではありません。 `safeTransferFrom`を使用した場合でも、秘密鍵が不明なアドレスに送信したトークンは失われる場合があります。
+まず、アドレスがコントラクト(コードがある場合)かどうかを確認します。 そうでない場合は、それがユーザーアドレスであり、ユーザーが
+トークンを使用または送金できると想定します。 しかし、それで
+安心しきってはいけません。 `safeTransferFrom`を使用しても、誰も秘密鍵を知らないアドレスに
+送金すると、トークンを失う可能性があります。
```python
returnValue: bytes32 = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data)
```
-ERC-721トークンを受信できるかどうかを確認するには、送信先のコントラクトを呼び出します。
+ターゲットコントラクトを呼び出して、ERC-721トークンを受信できるかどうかを確認します。
```python
- # Throws if transfer destination is a contract which does not implement 'onERC721Received'
+ # 送金先が'onERC721Received'を実装していないコントラクトの場合はスローします
assert returnValue == method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes32)
```
-送信先がコントラクトであるが、ERC-721トークンを受け付けない場合(または、この特定の送信を受け付けないと選択した場合)、操作を取り消してください。
+宛先がコントラクトであっても、ERC-721トークンを受け付けない(またはこの特定の
+送金を受け付けないと決定した)場合は、元に戻します。
```python
@external
def approve(_approved: address, _tokenId: uint256):
"""
- @dev Set or reaffirm the approved address for an NFT. The zero address indicates there is no approved address.
- Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner.
- Throws if `_tokenId` is not a valid NFT. (NOTE: This is not written the EIP)
- Throws if `_approved` is the current owner. (NOTE: This is not written the EIP)
- @param _approved Address to be approved for the given NFT ID.
- @param _tokenId ID of the token to be approved.
+ @dev NFTの承認済みアドレスを設定または再確認します。ゼロアドレスは、承認済みアドレスがないことを示します。
+ `msg.sender`が現在のNFT所有者または現在の所有者の承認済みオペレーターでない限り、スローします。
+ `_tokenId`が有効なNFTでない場合はスローします。(注:これはEIPには書かれていません)
+ `_approved`が現在の所有者である場合はスローします。(注:これはEIPには書かれていません)
+ @param _approved 指定されたNFT IDに対して承認されるアドレス。
+ @param _tokenId 承認されるトークンのID。
"""
owner: address = self.idToOwner[_tokenId]
- # Throws if `_tokenId` is not a valid NFT
+ # `_tokenId`が有効なNFTでない場合はスローします
assert owner != ZERO_ADDRESS
- # Throws if `_approved` is the current owner
+ # `_approved`が現在の所有者である場合はスローします
assert _approved != owner
```
-慣習により、承認者を設定したくない場合、自分のアドレスではなく、ゼロのアドレスを指定してください。
+慣例により、承認者を設定したくない場合は、自分自身ではなくゼロアドレスを指定します。
```python
- # Check requirements
+ # 要件をチェック
senderIsOwner: bool = self.idToOwner[_tokenId] == msg.sender
senderIsApprovedForAll: bool = (self.ownerToOperators[owner])[msg.sender]
assert (senderIsOwner or senderIsApprovedForAll)
```
-承認を設定するには、所有者であるか、所有者が承認したオペレーターである必要があります。
+承認を設定するには、所有者であるか、所有者によって承認されたオペレーターである必要があります。
```python
- # Set the approval
+ # 承認を設定
self.idToApprovals[_tokenId] = _approved
log Approval(owner, _approved, _tokenId)
@@ -538,95 +591,110 @@ def approve(_approved: address, _tokenId: uint256):
@external
def setApprovalForAll(_operator: address, _approved: bool):
"""
- @dev Enables or disables approval for a third party ("operator") to manage all of
- `msg.sender`'s assets. It also emits the ApprovalForAll event.
- Throws if `_operator` is the `msg.sender`. (NOTE: This is not written the EIP)
- @notice This works even if sender doesn't own any tokens at the time.
- @param _operator Address to add to the set of authorized operators.
- @param _approved True if the operators is approved, false to revoke approval.
+ @dev サードパーティ(「オペレーター」)が`msg.sender`の
+ すべての資産を管理するための承認を有効または無効にします。また、ApprovalForAllイベントも発行します。
+ `_operator`が`msg.sender`である場合はスローします。(注:これはEIPには書かれていません)
+ @notice これは、送信者がその時点でトークンを所有していなくても機能します。
+ @param _operator 承認済みオペレーターのセットに追加するアドレス。
+ @param _approved オペレーターが承認されている場合はTrue、承認を取り消す場合はfalse。
"""
- # Throws if `_operator` is the `msg.sender`
+ # `_operator`が`msg.sender`である場合はスローします
assert _operator != msg.sender
self.ownerToOperators[msg.sender][_operator] = _approved
log ApprovalForAll(msg.sender, _operator, _approved)
```
-#### 新しいトークンのミントと既存トークンの破壊 {#mint-burn}
+#### 新しいトークンのミントと既存トークンの破棄 {#mint-burn}
-コントラクトを作成したアカウントは`minter`となり、新規のNFTをミントする承認を受けたスーパーユーザーとなります。 ただし、ミンターは既存トークンをバーンすることはできません。 バーンできるのは、所有者および所有者の承認を受けたエンティティのみです。
+コントラクトを作成したアカウントは`minter`であり、新しいNFTをミントする権限を持つ
+スーパーユーザーです。 ただし、既存のトークンをバーンすることは許可されていません。 所有者、または所有者によって承認された
+エンティティのみがそれを行うことができます。
```python
-### MINT & BURN FUNCTIONS ###
+### ミント&バーン関数 ###
@external
def mint(_to: address, _tokenId: uint256) -> bool:
```
-操作が実行されない場合は常に元に戻されるため、この関数は常に`True`の値が返されます。
+操作が失敗した場合は元に戻されるため、この関数は常に`True`を返します。
```python
"""
- @dev Function to mint tokens
- Throws if `msg.sender` is not the minter.
- Throws if `_to` is zero address.
- Throws if `_tokenId` is owned by someone.
- @param _to The address that will receive the minted tokens.
- @param _tokenId The token id to mint.
- @return A boolean that indicates if the operation was successful.
+ @dev トークンをミントする関数
+ `msg.sender`がミンターでない場合はスローします。
+ `_to`がゼロアドレスの場合はスローします。
+ `_tokenId`が誰かによって所有されている場合はスローします。
+ @param _to ミントされたトークンを受け取るアドレス。
+ @param _tokenId ミントするトークンID。
+ @return 操作が成功したかどうかを示すブール値。
"""
- # Throws if `msg.sender` is not the minter
+ # `msg.sender`がミンターでない場合はスローします
assert msg.sender == self.minter
```
-新たなトークンをミントできるのは、このミンター(この ERC-721コントラクトを作成したアカウント)のみです。 ミンターの身元を変更したい場合、この点は将来的に問題になる可能性があります。 本番環境のコントラクトでは、ミンターがミンター特権を他のユーザーに譲渡できる機能が必要になるでしょう。
+ミンター(ERC-721コントラクトを作成したアカウント)のみが新しいトークンをミントできます。 これは、将来ミンターの
+IDを変更したい場合に問題になる可能性があります。 本番環境のコントラクトでは、ミンターが
+ミンター権限を他の誰かに譲渡できる関数が必要になるでしょう。
```python
- # Throws if `_to` is zero address
+ # `_to`がゼロアドレスの場合はスローします
assert _to != ZERO_ADDRESS
- # Add NFT. Throws if `_tokenId` is owned by someone
+ # NFTを追加します。`_tokenId`が誰かによって所有されている場合はスローします
self._addTokenTo(_to, _tokenId)
log Transfer(ZERO_ADDRESS, _to, _tokenId)
return True
```
-慣習により、新規トークンのミントは、ゼロアドレスからの送信としてカウントされます。
+慣例により、新しいトークンのミントはゼロアドレスからの送金としてカウントされます。
```python
@external
def burn(_tokenId: uint256):
"""
- @dev Burns a specific ERC721 token.
- Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
- address for this NFT.
- Throws if `_tokenId` is not a valid NFT.
- @param _tokenId uint256 id of the ERC721 token to be burned.
+ @dev 特定のERC721トークンをバーンします。
+ `msg.sender`が現在の所有者、承認されたオペレーター、またはこのNFTの承認
+ 済みアドレスでない限り、スローします。
+ `_tokenId`が有効なNFTでない場合はスローします。
+ @param _tokenId バーンされるERC721トークンのuint256 ID。
"""
- # Check requirements
+ # 要件をチェック
assert self._isApprovedOrOwner(msg.sender, _tokenId)
owner: address = self.idToOwner[_tokenId]
- # Throws if `_tokenId` is not a valid NFT
+ # `_tokenId`が有効なNFTでない場合はスローします
assert owner != ZERO_ADDRESS
self._clearApproval(owner, _tokenId)
self._removeTokenFrom(owner, _tokenId)
log Transfer(owner, ZERO_ADDRESS, _tokenId)
```
-トークンの送信が許可されているユーザーは、そのトークンをバーンすることができます。 バーンは、ゼロアドレスへの送信と同じ外見を持ちますが、このゼロアドレスは実際にはこのトークンを受け取りません。 バーンを通じて、このトークンに使用されたすべてのストレージを解放できるため、トランザクションのガス代を軽減することができます。
+トークンの送金を許可されている人は誰でも、それをバーンすることが許可されています。 バーンはゼロアドレスへの送金と
+同等に見えますが、ゼロアドレスは実際にはトークンを受け取りません。 これにより、トークンに使用されていたすべてのストレージを
+解放でき、トランザクションのガス代を削減できます。
+
+## このコントラクトの使用 {#using-contract}
+
+Solidityとは対照的に、Vyperには継承がありません。 これは、コードをより明確にし、
+したがってセキュリティを確保しやすくするための意図的な設計上の選択です。 したがって、独自のVyper ERC-721コントラクトを作成するには、この
+コントラクトを取得し、
+必要なビジネスロジックを実装するように変更します。
-## コントラクトの使用方法 {#using-contract}
+## 結論 {#conclusion}
-Solidityとは異なり、Viperは相続機能を提供しません。 これは、コードをより明確にし、セキュリティを確保しやすくするための意図的な設計上の選択によるものです。 このため、あなた自身がVyperでERC-721コントラクトを作成する際は、[このコントラクト](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy)を用いて修正し、必要なビジネスロジックを実装してください。
+復習のために、このコントラクトの最も重要なアイデアをいくつか紹介します。
-### まとめ {#conclusion}
+- 安全な送金でERC-721トークンを受信するには、コントラクトは`ERC721Receiver`インターフェイスを実装する必要があります。
+- 安全な送金を使用しても、秘密鍵が不明なアドレスに送信すると、
+ トークンがスタックする可能性があります。
+- 操作に問題がある場合は、単に失敗値を返すのではなく、
+ 呼び出しを`revert`することをお勧めします。
+- ERC-721トークンは、所有者がいる場合に存在します。
+- NFTの送金を承認するには、3つの方法があります。 所有者であるか、特定のトークンに対して承認されているか、
+ または所有者のすべてのトークンのオペレーターであることができます。
+- 過去のイベントはブロックチェーンの外部からのみ表示されます。 ブロックチェーン内で実行されるコードは、それらを表示できません。
-このコントラクトにつき、最も重要なポイントを以下にまとめました:
+では、セキュアなVyperコントラクトを実装してみましょう。
-- 安全モードの送信を使ってERC-721トークンを受け取るには、コントラクトに`ERC721Receiver`インターフェイスを実装する必要があります。
-- 安全モードの送信を実行した場合でも、秘密鍵が不明なアドレスに送信したトークンは行方不明になる可能性があります。
-- 操作に問題が発生した場合、単に失敗値をリターンするのではなく、コール自体を`取り消す`ことをお勧めします。
-- ERC-721トークンには、必ず所有者が必要です。
-- NFTの送信を承認するには、3通りの方法があります。 承認できるのは、所有者であるか、特定トークンの送信を承認されているか、所有者のトークンすべてに対するオペレーターであるユーザーのみです。
-- 過去のイベントは、ブロックチェーン外でのみ表示されます。 ブロックチェーン内で実行されるコードは、表示できません。
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
-それではさっそく、セキュアなVyperコントラクトを実装してみましょう。
diff --git a/public/content/translations/ja/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/ja/developers/tutorials/erc20-annotated-code/index.md
index 56cf9b6b772..1f647c1bdba 100644
--- a/public/content/translations/ja/developers/tutorials/erc20-annotated-code/index.md
+++ b/public/content/translations/ja/developers/tutorials/erc20-annotated-code/index.md
@@ -1,30 +1,28 @@
---
-title: "ERC-20コントラクトの詳細"
-description: OpenZeppelinのERC-20コントラクトの内容とそれが存在する理由
+title: "ERC-20コントラクトのウォークスルー"
+description: "OpenZeppelinのERC-20コントラクトには何が含まれており、それはなぜ存在するのでしょうか?"
author: Ori Pomerantz
lang: ja
-tags:
- - "Solidity"
- - "erc-20"
+tags: [ "Solidity", "ERC-20" ]
skill: beginner
published: 2021-03-09
---
## はじめに {#introduction}
-イーサリアムの最も一般的な用途の1つは、グループが取引可能なトークン、いわば独自の通貨を作ることです。 これらのトークンは通常、[ERC-20](/developers/docs/standards/tokens/erc-20/)という規格に準拠しています。 この規格により、流動性プールやウォレットなど、すべてのERC-20トークンで利用できるツールの作成が可能になります。 今回は、[OpenZeppelin Solidity ERC-20の実装](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)と、[インターフェース定義](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)について分析していきます。
+イーサリアムの最も一般的な用途の1つは、グループが取引可能なトークン、いわば独自の通貨を作ることです。 これらのトークンは、通常[ERC-20](/developers/docs/standards/tokens/erc-20/)という規格に従います。 この規格により、流動性プールやウォレットなど、すべてのERC-20トークンで利用できるツールの作成が可能になります。 この記事では、[OpenZeppelinのSolidityによるERC20実装](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)と、[インターフェース定義](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)を分析します。
-ここではアノテーション付きのソースコードを見ていきます。 ERC-20を実装する場合は、[こちらのチュートリアル](https://docs.openzeppelin.com/contracts/2.x/erc20-supply)をご覧ください。
+ここではアノテーション付きのソースコードを見ていきます。 ERC-20を実装したい場合は、[このチュートリアル](https://docs.openzeppelin.com/contracts/2.x/erc20-supply)をお読みください。
## インターフェース {#the-interface}
-ERC-20のような規格の目的は、ウォレットや分散型取引所のようなアプリケーション間で相互運用可能な多くのトークンの実装を可能にすることです。 しかしその実現には[インターフェース](https://www.geeksforgeeks.org/solidity-basics-of-interface/)が必要です。 トークンコントラクトを使用する必要があるすべてのコードは、インターフェースで同じ定義を使用することができ、その定義を使用するすべてのトークンコントラクトと互換性があります。それらにはMetaMaskなどのウォレット、etherscan.ioなどの分散型アプリケーション(Dapp)、流動性プールなどの異なるコントラクトが含まれます。
+ERC-20のような規格の目的は、ウォレットや分散型取引所のようなアプリケーション間で相互運用可能な多くのトークンの実装を可能にすることです。 それを実現するために、[インターフェース](https://www.geeksforgeeks.org/solidity/solidity-basics-of-interface/)を作成します。 トークンコントラクトを使用する必要があるコードは、それがMetaMaskのようなウォレット、etherscan.ioのようなdapp、または流動性プールのような別のコントラクトであっても、インターフェースで同じ定義を使用でき、そのインターフェースを使用するすべてのトークンコントラクトと互換性があります。

-経験豊富なプログラマーであれば、[Java](https://www.w3schools.com/java/java_interface.asp)や[C言語のヘッダーファイル](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html)で同様の構造を見たことがあるのではないでしょうか。
+経験豊富なプログラマーであれば、[Java](https://www.w3schools.com/java/java_interface.asp)や[Cのヘッダーファイル](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html)で同様の構造を見たことがあるかもしれません。
-これはOpenZeppelinによる[ERC-20インターフェースの定義](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)です。 [人間が読めるように](https://eips.ethereum.org/EIPS/eip-20)Solidityのコードにしています。 もちろん、インターフェースそのものは、_何をするか_を定義していません。 これは後述のコントラクトのソースコードで説明されています。
+これはOpenZeppelinによる[ERC-20インターフェース](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)の定義です。 これは、[人間が読める標準規格](https://eips.ethereum.org/EIPS/eip-20)をSolidityコードに変換したものです。 もちろん、インターフェース自体は、何かを行う_方法_を定義するものではありません。 これは後述のコントラクトのソースコードで説明されています。
@@ -32,7 +30,7 @@ ERC-20のような規格の目的は、ウォレットや分散型取引所の
// SPDX-License-Identifier: MIT
```
-Solidityのファイルには、ライセンス識別子が含まれているはずです。 ライセンス一覧は[こちら](https://spdx.org/licenses/)でご覧いただけます。 別のライセンスが必要な場合は、コメントしてください。
+Solidityのファイルには、ライセンス識別子が含まれているはずです。 [ライセンスのリストはこちら](https://spdx.org/licenses/)で確認できます。 別のライセンスが必要な場合は、コメントでその旨を説明してください。
@@ -40,13 +38,13 @@ Solidityのファイルには、ライセンス識別子が含まれているは
pragma solidity >=0.6.0 <0.8.0;
```
-Solidity言語は現在も急速に進化しており、新しいバージョンは古いコードと互換性がない場合があります(詳しくは[こちら](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html))。 そのため、この言語の最小バージョンだけでなく、コードをテストした最新バージョンも指定することをお勧めします。
+Solidity言語は現在も急速に進化しており、新しいバージョンは古いコードと互換性がない場合があります([詳しくはこちら](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html))。 そのため、言語の最小バージョンだけでなく、最大バージョン、つまりコードをテストした最新のバージョンも指定することをお勧めします。
```solidity
/**
- * @dev Interface of the ERC20 standard as defined in the EIP.
+ * @dev EIPで定義されているERC20標準のインターフェース。
*/
```
@@ -58,135 +56,135 @@ Solidity言語は現在も急速に進化しており、新しいバージョン
interface IERC20 {
```
-慣例では、インターフェース名は「`I`」で始まります。
+慣例では、インターフェース名は`I`で始まります。
```solidity
/**
- * @dev Returns the amount of tokens in existence.
+ * @dev 存在するトークンの総量を返します。
*/
function totalSupply() external view returns (uint256);
```
-この関数は`external`です。つまり、[コントラクトの外部からのみ呼び出すことができます](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2)。 コントラクト内のトークンの総供給量を返します。 この値は、イーサリアムで最も一般的な型である符号なし256ビット(イーサリアム仮想マシン(EVM)のネイティブワードサイズ)で返されます。 この関数も`view`であり、状態を変更しないため、ブロックチェーンのすべてのノードで実行するのではなく、単一のノードで実行できます。 このような関数はトランザクションを発生させず、[ガス代](/developers/docs/)もかかりません。
+この関数は`external`であり、[コントラクトの外部からのみ呼び出すことができる](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2)ことを意味します。
+コントラクト内のトークンの総供給量を返します。 この値は、イーサリアムで最も一般的な型である符号なし256ビット(256ビットはEVMのネイティブワードサイズ)で返されます。 この関数も`view`であり、状態を変更しないため、ブロックチェーンのすべてのノードで実行するのではなく、単一のノードで実行できます。 このような関数はトランザクションを生成せず、[ガス](/developers/docs/gas/)代もかかりません。
-**注:** 理論的には、コントラクト作成者が、実際の値よりも少ない総供給量を返し、各トークンを実際の価格よりも高価に見せることで、不正を行うことが出来るように思えるかもしれません。 しかし、そのような心配をするということは、ブロックチェーンの本質を忘れているということになります。 ブロックチェーン上で起こるすべてのことは、すべてのノードで検証できます。 検証をするためのすべてのコントラクトの機械語コードとストレージは、全ノードで入手可能です。 コントラクトのSolidityコードを公開する必要はありませんが、ソースコードとコンパイルに使用したSolidityのバージョンを公開しない限り、不正への懸念を真剣に受け止めてもらうことはできません。その場合は、提供した機械語コードで検証することができます。 例えば、[このコントラクト](https://etherscan.io/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD#code)をご覧ください。
+**注:** 理論的には、コントラクト作成者が、実際の値よりも少ない総供給量を返し、各トークンを実際の価格よりも高価に見せることで、不正を行うことが出来るように思えるかもしれません。 しかし、そのような心配をするということは、ブロックチェーンの本質を忘れているということになります。 ブロックチェーン上で起こるすべてのことは、すべてのノードで検証できます。 これを実現するため、すべてのコントラクトの機械語コードとストレージは、全ノードで入手可能です。 コントラクトのSolidityコードを公開する必要はありませんが、提供した機械語コードと照合して検証できるように、ソースコードとそれをコンパイルしたSolidityのバージョンを公開しない限り、誰もあなたのコントラクトを本気で相手にしないでしょう。
+例えば、[このコントラクト](https://eth.blockscout.com/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD?tab=contract)をご覧ください。
```solidity
/**
- * @dev Returns the amount of tokens owned by `account`.
+ * @dev `account`が所有するトークンの量を返します。
*/
function balanceOf(address account) external view returns (uint256);
```
-その名の通り、`balanceOf`はアカウントの残高を返します。 Solidityでは、イーサリアムアカウントは160ビットを保持する`address`型で識別されます。 また、`external`や`view`もあります。
+その名の通り、`balanceOf`はアカウントの残高を返します。 Solidityでは、イーサリアムアカウントは160ビットを保持する`address`型で識別されます。
+この関数も`external`かつ`view`です。
```solidity
/**
- * @dev Moves `amount` tokens from the caller's account to `recipient`.
+ * @dev `amount`のトークンを呼び出し元のアカウントから`recipient`に移動させます。
*
- * Returns a boolean value indicating whether the operation succeeded.
+ * 操作が成功したかどうかを示すブール値を返します。
*
- * Emits a {Transfer} event.
+ * {Transfer}イベントを発行します。
*/
function transfer(address recipient, uint256 amount) external returns (bool);
```
-`transfer`関数は、呼び出し元から別のアドレスにトークンを転送します。 これは状態の変化を伴うので、`view`ではありません。 ユーザーがこの関数を呼び出すと、トランザクションが作成され、ガス代がかかります。 さらに、`Transfer`というイベントが発行され、ブロックチェーン上の全ノードにそのイベントが通知されます。
+`transfer`関数は、呼び出し元から別のアドレスにトークンを転送します。 これは状態の変化を伴うので、`view`ではありません。
+ユーザーがこの関数を呼び出すと、トランザクションが作成され、ガス代がかかります。 さらに、`Transfer`というイベントが発行され、ブロックチェーン上の全員にそのイベントが通知されます。
この関数には、2つの異なる呼び出し元のタイプに応じて、2つのタイプの出力があります。
-- ユーザーがユーザーインターフェースから関数を直接呼び出す場合。 通常、トランザクションを送信したユーザーは、その応答を待ちません。応答にどれくらいの時間がかかるか分からないからです。 ユーザーは、トランザクションレシート(トランザクションハッシュによって識別可能)を探すか、`Transfer`イベントを探すことで状況を把握できます。
-- 他のコントラクトがトランザクション全体の一部として関数を呼び出す場合。 これらのコントラクトは、すぐに結果を得ることができます。関数が同じトランザクション内で実行されるため、関数の戻り値を使用できるからです。
+- ユーザーがユーザーインターフェースから関数を直接呼び出す場合。 通常、ユーザーはトランザクションを送信すると、応答を待ちません。応答には不確定な時間がかかる可能性があるためです。 ユーザーは、トランザクションレシート(トランザクションハッシュによって識別される)を探すか、`Transfer`イベントを探すことで状況を把握できます。
+- 他のコントラクトが、全体的なトランザクションの一部として関数を呼び出す場合。 これらのコントラクトは、同じトランザクション内で実行されるため、関数の戻り値を使用でき、すぐに結果を得ることができます。
同じタイプの出力は、コントラクトの状態を変更する他の関数によって作成されます。
-割当量(allowance)を設定すると、あるアカウントが別の所有者に属しているトークンの一部を使えるようになります。 これは、コントラクトが売り手として機能する場合などに役立ちます。 コントラクトはイベントを監視できないため、買い手が売り手のコントラクトにトークンを直接転送した場合、売り手のコントラクトはその支払いを認識できません。 代わりに、買い手が売り手のコントラクトに一定量の使用を許可し、売り手がその量を転送するようにします。 この処理は売り手のコントラクトが呼び出した関数を通して行われるため、売り手のコントラクトは処理が成功したかどうかを確認できます。
+割当量(`allowance`)により、あるアカウントが別の所有者に属しているトークンの一部を使えるようになります。
+これは、例えば、コントラクトが売り手として機能する場合などに役立ちます。 コントラクトはイベントを監視できないため、買い手が売り手のコントラクトにトークンを直接転送した場合、売り手のコントラクトはその支払いを認識できません。 代わりに、買い手が売り手のコントラクトに一定量の使用を許可し、売り手がその量を転送します。
+この処理は売り手のコントラクトが呼び出す関数を通して行われるため、売り手のコントラクトは処理が成功したかどうかを確認できます。
```solidity
/**
- * @dev Returns the remaining number of tokens that `spender` will be
- * allowed to spend on behalf of `owner` through {transferFrom}. これは
- * デフォルトでゼロです。
+ * @dev {transferFrom}を通じて`spender`が`owner`に代わって使用できる、残りのトークン数を返します。これは
+ * デフォルトではゼロです。
*
- * This value changes when {approve} or {transferFrom} are called.
+ * この値は、{approve}または{transferFrom}が呼び出されると変化します。
*/
function allowance(address owner, address spender) external view returns (uint256);
```
-`allowance`関数を使用すると、誰でも、あるアドレス(`owner`)が別のアドレス(`spender`)に使用を許可している割当量(allowance)を照会できます。
+`allowance`関数により、誰でも、あるアドレス(`owner`)が別のアドレス(`spender`)に使用を許可している割当量を照会できます。
```solidity
/**
- * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
+ * @dev `spender`が呼び出し元のトークンに対して持つ割当量を`amount`に設定します。
*
- * Returns a boolean value indicating whether the operation succeeded.
+ * 操作が成功したかを示すブール値を返します。
*
- * IMPORTANT: Beware that changing an allowance with this method brings the risk
- * that someone may use both the old and the new allowance by unfortunate
- * transaction ordering. One possible solution to mitigate this race
- * condition is to first reduce the spender's allowance to 0 and set the
- * desired value afterwards:
+ * 重要: このメソッドで割当量を変更すると、不運なトランザクションの順序によって、誰かが古い割当量と新しい割当量の両方を使用するリスクがあります。
+ * この競合状態を緩和するための一つの解決策は、まずspenderの割当量を0に減らしてから、目的の値を設定することです。
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
- * Emits an {Approval} event.
+ * {Approval}イベントを発行します。
*/
function approve(address spender, uint256 amount) external returns (bool);
```
-`approve`関数は、割当量を作成します。 これがどのように悪用される可能性があるのかについて、該当のメッセージを必ず読んでください。 イーサリアムでは、自分のトランザクションの順序は制御できますが、他のユーザーのトランザクションが発生したことを確認してからトランザクションを送信しない限り、他のユーザーのトランザクションが実行される順序を制御することはできません。
+`approve`関数は、割当量を作成します。 これがどのように悪用される可能性があるのかについて、該当のメッセージを必ず読んでください。 イーサリアムでは、自分のトランザクションの順序は制御できますが、相手方のトランザクションが発生したことを確認してから自分のトランザクションを送信しない限り、他のユーザーのトランザクションが実行される順序を制御することはできません。
```solidity
/**
- * @dev Moves `amount` tokens from `sender` to `recipient` using the
- * allowance mechanism. `amount` is then deducted from the caller's
- * allowance.
+ * @dev 割当メカニズムを使用して、`amount`のトークンを`sender`から`recipient`に移動させます。`amount`は呼び出し元の割当量から差し引かれます。
*
- * Returns a boolean value indicating whether the operation succeeded.
+ * 操作が成功したかを示すブール値を返します。
*
- * Emits a {Transfer} event.
+ * {Transfer}イベントを発行します。
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
```
-最後に、使用者(spender)が`transferFrom`を使用して、割当量 (allowance)を実際に使用します。
+最後に、使用者(`spender`)が`transferFrom`を使用して、割当量(`allowance`)を実際に使用します。
```solidity
/**
- * @dev Emitted when `value` tokens are moved from one account (`from`) to
- * another (`to`).
+ * @dev `value`のトークンがあるアカウント(`from`)から
+ * 別のアカウント(`to`)に移動したときに発行されます。
*
- * Note that `value` may be zero.
+ * `value`はゼロになる場合があることに注意してください。
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
- * @dev Emitted when the allowance of a `spender` for an `owner` is set by
- * a call to {approve}. `value` is the new allowance.
+ * @dev {approve}の呼び出しによって`owner`に対する`spender`の割当量が設定されたときに発行されます。`value`は新しい割当量です。
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
```
-これらのイベントは、ERC-20コントラクトの状態が変更されるタイミングで発行されます。
+これらのイベントは、ERC-20コントラクトの状態が変更されると発行されます。
## 実際のコントラクト {#the-actual-contract}
-以下は、[こちらから取得した](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)、ERC-20規格を採用している実際のコントラクトです。 そのまま使うためのものではありませんが、[継承](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm)することで使用可能なコントラクトに拡張することができます。
+これはERC-20規格を実装した実際のコントラクトで、[こちら](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)から引用しました。
+これはそのまま使用するためのものではありませんが、それから[継承](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm)して、使えるものに拡張することができます。
```solidity
// SPDX-License-Identifier: MIT
@@ -195,7 +193,7 @@ pragma solidity >=0.6.0 <0.8.0;
-### インポートステートメント {#import-statements}
+### インポート文 {#import-statements}
コントラクト定義では、上記のインターフェース定義に加え、別の2つのファイルをインポートします。
@@ -206,48 +204,43 @@ import "./IERC20.sol";
import "../../math/SafeMath.sol";
```
-- `GSN/Context.sol`は、イーサ(ETH)を持たないユーザーがブロックチェーンを使用できるようにするシステムである、[OpenGSN](https://www.opengsn.org/)を使用するために必要な定義です。 これは古いバージョンであることに注意してください。OpenGSNと統合する場合は、[こちらのチュートリアルをご覧ください](https://docs.opengsn.org/javascript-client/tutorial.html)。
-- [ SafeMathライブラリ](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/)は、オーバーフローを起こさずに加算と減算を実行できるようにするために使用されます。 このライブラリが必要な理由は、これがないと、1つのトークンを持っているユーザーが何らかの方法で2つのトークンを使用した場合、2^256-1のトークンを持ってしまう可能性があるためです。
+- `GSN/Context.sol`は、etherを持たないユーザーがブロックチェーンを使用できるようにするシステムである[OpenGSN](https://www.opengsn.org/)を使用するために必要な定義です。 これは古いバージョンであることに注意してください。OpenGSNと統合する場合は、[このチュートリアル](https://docs.opengsn.org/javascript-client/tutorial.html)を使用してください。
+- [SafeMathライブラリ](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/)は、Solidityバージョン**<0.8.0**の算術オーバーフロー/アンダーフローを防ぎます。 Solidity ≥0.8.0では、算術演算はオーバーフロー/アンダーフローで自動的にリバートするため、SafeMathは不要です。 このコントラクトは、古いコンパイラバージョンとの後方互換性のためにSafeMathを使用しています。
-以下のコメントは、コントラクトの目的を説明しています。
+このコメントは、コントラクトの目的を説明しています。
```solidity
/**
- * @dev Implementation of the {IERC20} interface.
+ * @dev {IERC20}インターフェースの実装。
*
- * This implementation is agnostic to the way tokens are created. This means
- * that a supply mechanism has to be added in a derived contract using {_mint}.
- * For a generic mechanism see {ERC20PresetMinterPauser}.
+ * この実装は、トークンが作成される方法には依存しません。これは
+ * 供給メカニズムを、{_mint}を使用して派生コントラクトに追加する必要があることを意味します。
+ * 一般的なメカニズムについては、{ERC20PresetMinterPauser}を参照してください。
*
- * TIP: For a detailed writeup see our guide
- * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
- * to implement supply mechanisms].
+ * ヒント: 詳細な解説については、ガイド
+ * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[供給メカニズムの実装方法]を参照してください。
*
- * We have followed general OpenZeppelin guidelines: functions revert instead
- * of returning `false` on failure. This behavior is nonetheless conventional
- * and does not conflict with the expectations of ERC20 applications.
+ * OpenZeppelinの一般的なガイドラインに従っています。関数は失敗時に`false`を返すのではなく、リバートします。この動作は慣例的であり、ERC20アプリケーションの期待と矛盾しません。
*
- * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
- * This allows applications to reconstruct the allowance for all accounts just
- * by listening to said events. Other implementations of the EIP may not emit
- * these events, as it isn't required by the specification.
+ * さらに、{transferFrom}の呼び出し時に{Approval}イベントが発行されます。
+ * これにより、アプリケーションは、これらのイベントをリッスンするだけで、すべてのアカウントの割当量を再構築できます。EIPの他の実装では、
+ * 仕様で要求されていないため、これらのイベントを発行しない場合があります。
*
- * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
- * functions have been added to mitigate the well-known issues around setting
- * allowances. See {IERC20-approve}.
+ * 最後に、割当量設定に関する既知の問題を緩和するために、非標準の{decreaseAllowance}および{increaseAllowance}関数が追加されています。
+ * {IERC20-approve}を参照してください。
*/
```
-### コントラクトの定義 {#contract-definition}
+### コントラクト定義 {#contract-definition}
```solidity
contract ERC20 is Context, IERC20 {
```
-この行では、継承を指定しています。ここでは、`IERC20`とOpenGSNのための`Context`を継承しています。
+この行では、継承を指定しています。ここでは、上記の`IERC20`と、OpenGSNのための`Context`を継承しています。
@@ -257,19 +250,19 @@ contract ERC20 is Context, IERC20 {
```
-この行では、`SafeMath`ライブラリを`uint256`型にアタッチしています。 このライブラリの詳細については、[こちら](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol)をご覧ください。
+この行では、`SafeMath`ライブラリを`uint256`型にアタッチしています。 このライブラリは[こちら](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol)で確認できます。
-### 変数の定義 {#variable-definitions}
+### 変数定義 {#variable-definitions}
-これらの定義では、コントラクトの状態変数を指定します。 変数には、`private`で宣言しているものがありますが、ブロックチェーン上の他のコントラクトから読み取れないというだけです。 _ブロックチェーンに秘密はありません_。すべてのノードのソフトウェアは、すべてのブロックのすべてのコントラクトの状態を保持します。 状態変数は、慣例として`_`のように命名されます。
+これらの定義では、コントラクトの状態変数を指定します。 これらの変数は`private`で宣言されていますが、これはブロックチェーン上の他のコントラクトから読み取れないというだけです。 _ブロックチェーンに秘密はありません_。すべてのノードのソフトウェアは、すべてのブロックですべてのコントラクトの状態を保持します。 慣例として、状態変数は`_`と命名されます。
-最初の2つの変数は、[マッピング](https://www.tutorialspoint.com/solidity/solidity_mappings.htm)であり、キーが数値であることを除いて、[連想配列](https://wikipedia.org/wiki/Associative_array)とほぼ同じような振る舞いをします。 ストレージは、デフォルト(ゼロ)とは異なる値を持つエントリのみに割り当てられます。
+最初の2つの変数は[マッピング](https://www.tutorialspoint.com/solidity/solidity_mappings.htm)であり、キーが数値である点を除けば、おおよそ[連想配列](https://wikipedia.org/wiki/Associative_array)と同じように動作します。 ストレージは、デフォルト(ゼロ)とは異なる値を持つエントリにのみ割り当てられます。
```solidity
mapping (address => uint256) private _balances;
```
-最初のマッピングである`_balances`は、トークンを保持しているアドレスとそれぞれの残高です。 残高にアクセスするには、`_balances[]`という構文を使用します。
+最初のマッピングである`_balances`は、アドレスとそれぞれのこのトークンの残高です。 残高にアクセスするには、`_balances[]`という構文を使用します。
@@ -277,7 +270,7 @@ contract ERC20 is Context, IERC20 {
mapping (address => mapping (address => uint256)) private _allowances;
```
-この変数`_allowances`には、前述の割当量(allowance)が格納されます。 最初のインデックスは、トークンの所有者であり、2番目のインデックスは割当量(allowance)を使用するコントラクトです。 アドレスAが、アドレスBのアカウントから使える量にアクセスするには、`_allowances[B][A]`のようにします。
+この変数`_allowances`には、前述の割当量が格納されます。 最初のインデックスはトークンの所有者であり、2番目のインデックスは割当量を持つコントラクトです。 アドレスAがアドレスBのアカウントから使える量にアクセスするには、`_allowances[B][A]`を使用します。
@@ -297,78 +290,77 @@ contract ERC20 is Context, IERC20 {
この3つの変数は、可読性を向上させるために使用されます。 最初の2つの変数は自明ですが、`_decimals`はそうではありません。
-イーサリアムには浮動小数点変数も小数変数もない一方で、 ユーザーはトークンの分割を好みます。 人々が金を通貨にすると決めた理由の一つとして、誰かがアヒル一羽の値段の分だけ牛を買おうとしたときに、お金を崩すのが難しかったことが挙げられます。
+一方で、イーサリアムには浮動小数点変数も小数変数もありません。 他方で、人間はトークンを分割できることを好みます。 人々が金を通貨に決めた理由の一つは、誰かが牛の価値のアヒル分を買おうとしたときに、お釣りを作るのが難しかったからです。
-これを解決するには整数で追跡すればよいのですが、実際のトークンの代わりに、価値が非常に小さな小数トークンで計算します。 イーサ(ETH)の場合、小数トークンはウェイ(wei)と呼ばれており、10^18 weiが 1 ETHと等価です。 執筆時点では、10,000,000,000,000 weiが、約1米ドルまたは約1ユーロセントです。
+解決策は、整数で追跡し、実際のトークンの代わりに、ほとんど価値のない小数トークンを数えることです。 etherの場合、小数トークンはweiと呼ばれ、10^18 weiが1 ETHと等価です。 執筆時点で、10,000,000,000,000 weiは、約1米ドルまたは1ユーロセントです。
-アプリケーションには、トークンの残高を表示する方法が必要です。 ユーザーが3,14,000,000,000,000,000,000,000weiを持っている場合、それは3.14 ETHでしょうか? それとも、31.41 ETHでしょうか? 3,141 ETHでしょうか? イーサ (ETH) の場合、1 ETHが10^18 weiと定義されていますが、トークンでは別の値を選択可能です。 トークンを分割する必要がなければ、値がゼロの`_decimals`を使用できます。 ETHと同じ基準を使用したい場合は、**18**の値を指定してください。
+アプリケーションは、トークンの残高を表示する方法を知る必要があります。 ユーザーが3,141,000,000,000,000,000 weiを持っている場合、それは3.14 ETHでしょうか? 31.41 ETHでしょうか? 3,141 ETHでしょうか? etherの場合、10^18 weiが1 ETHと定義されていますが、あなたのトークンでは別の値を選択できます。 トークンを分割する必要がなければ、値がゼロの`_decimals`を使用できます。 ETHと同じ基準を使用したい場合は、値**18**を使用してください。
### コンストラクタ {#the-constructor}
```solidity
/**
- * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
- * a default value of 18.
+ * @dev {name}と{symbol}の値を設定し、{decimals}を
+ * デフォルト値の18で初期化します。
*
- * To select a different value for {decimals}, use {_setupDecimals}.
+ * {decimals}に別の値を選択するには、{_setupDecimals}を使用します。
*
- * All three of these values are immutable: they can only be set once during
- * construction.
+ * これら3つの値はすべて不変です。構築時に一度しか設定できません。
*/
constructor (string memory name_, string memory symbol_) public {
+ // Solidity ≥0.7.0では、'public'は暗黙的であり、省略できます。
+
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
```
-コンストラクタは、コントラクトが最初に作成されたときに呼び出されます。 慣例として関数パラメータは、 `_`のように命名されます。
+コンストラクタは、コントラクトが最初に作成されたときに呼び出されます。 慣例として関数パラメータは、`_`のように命名されます。
### ユーザーインターフェース関数 {#user-interface-functions}
```solidity
/**
- * @dev Returns the name of the token.
+ * @dev トークンの名前を返します。
*/
function name() public view returns (string memory) {
return _name;
}
/**
- * @dev Returns the symbol of the token, usually a shorter version of the
- * name.
+ * @dev トークンのシンボルを返します。通常は名前の短いバージョンです。
+ * 名前です。
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
- * @dev Returns the number of decimals used to get its user representation.
- * For example, if `decimals` equals `2`, a balance of `505` tokens should
- * be displayed to a user as `5,05` (`505 / 10 ** 2`).
+ * @dev ユーザー表現を取得するために使用される小数点以下の桁数を返します。
+ * 例えば、`decimals`が`2`の場合、`505`トークンの残高は
+ * `5,05` (`505 / 10 ** 2`)としてユーザーに表示されるべきです。
*
- * Tokens usually opt for a value of 18, imitating the relationship between
- * ether and wei. This is the value {ERC20} uses, unless {_setupDecimals} is
- * called.
+ * トークンは通常、etherとweiの関係を模倣して、値18を選択します。これは、{_setupDecimals}が呼び出されない限り、{ERC20}が使用する値です。
*
- * NOTE: This information is only used for _display_ purposes: it in
- * no way affects any of the arithmetic of the contract, including
- * {IERC20-balanceOf} and {IERC20-transfer}.
+ * 注: この情報は_表示_目的でのみ使用されます。これは
+ * {IERC20-balanceOf}や{IERC20-transfer}を含む、コントラクトのどの算術にも
+ * 影響を与えません。
*/
function decimals() public view returns (uint8) {
return _decimals;
}
```
-これらの関数(`name`、`symbol`、`decimals`)は、ユーザーインターフェースがコントラクトの情報を入手できるようするため、ユーザーインターフェースにコントラクトの情報が正しく表示されるようになります。
+これらの関数`name`、`symbol`、`decimals`は、ユーザーインターフェースがあなたのコントラクトについて知り、正しく表示できるようにするのに役立ちます。
-戻り値の型は、 `string memory`です。メモリに格納されている文字列が返されることを意味します。 文字列などの変数は、以下の3つの場所に格納できます。
+戻り値の型は`string memory`で、メモリに格納されている文字列を返すことを意味します。 文字列などの変数は、3つの場所に格納できます。
-| | 存続期間 | コントラクトアドレス | ガス代 |
-| ------ | -------- | ---------- | ------------------------ |
-| メモリ | 関数呼び出しの間 | 読み取り/書き込み | 数十または数百(上位のロケーションほど高い) |
-| コールデータ | 関数呼び出しの間 | 読み取り専用 | 戻り値型としては使用できず、関数パラメータ型のみ |
-| ストレージ | 変更されるまで | 読み取り/書き込み | 高額(読み取りに800、書き込みに20 k) |
+| | 存続期間 | コントラクトアクセス | ガス代 |
+| ------ | ------- | ---------- | ----------------------------------------- |
+| Memory | 関数呼び出し中 | 読み取り/書き込み | 数十または数百(上位のロケーションほど高い) |
+| コールデータ | 関数呼び出し中 | 読み取り専用 | 戻り値型としては使用できず、関数パラメータ型のみ |
+| ストレージ | 変更されるまで | 読み取り/書き込み | 高額(読み取りに800、書き込みに20k) |
このケースでは、`memory`の使用が最善の選択肢です。
@@ -378,7 +370,7 @@ contract ERC20 is Context, IERC20 {
```solidity
/**
- * @dev See {IERC20-totalSupply}.
+ * @dev {IERC20-totalSupply}を参照してください。
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
@@ -391,30 +383,30 @@ contract ERC20 is Context, IERC20 {
```solidity
/**
- * @dev See {IERC20-balanceOf}.
+ * @dev {IERC20-balanceOf}を参照してください。
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
```
-アカウントの残高を読み取ります。 誰でも他のユーザーのアカウント残高を取得できることに注意してください。 どのノードでも取得可能な情報であるため、隠そうとしても無駄です。 _ブロックチェーンに秘密はありません_。
+アカウントの残高を読み取ります。 誰でも他の人のアカウント残高を取得できることに注意してください。 この情報はどのノードでも入手可能であるため、隠そうとしても無駄です。 _ブロックチェーンに秘密はありません。_
### トークンの転送 {#transfer-tokens}
```solidity
/**
- * @dev See {IERC20-transfer}.
+ * @dev {IERC20-transfer}を参照してください。
*
- * Requirements:
+ * 要件:
*
- * - `recipient` cannot be the zero address.
- * - the caller must have a balance of at least `amount`.
+ * - `recipient`はゼロアドレスであってはなりません。
+ * - 呼び出し元は少なくとも`amount`の残高を持っている必要があります。
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
```
-`transfer`関数は、送信者のアカウントから別のアカウントにトークンを転送するために呼び出します。 戻り値がブール値になっていますが、この値は常に**true**を返すことに注意してください。 転送が失敗した場合、コントラクトは、呼び出しを取り消します。
+`transfer`関数は、送信者のアカウントから別のアカウントにトークンを転送するために呼び出します。 戻り値がブール値ですが、その値は常に**true**であることに注意してください。 転送が失敗した場合、コントラクトは呼び出しをリバートします。
@@ -424,44 +416,44 @@ contract ERC20 is Context, IERC20 {
}
```
-`_transfer`関数は、実際の作業を行います。 これはprivate関数であり、他のコントラクト関数からのみ呼び出せます。 慣例として、private関数は状態変数と同様に、`_`のように命名されます。
+`_transfer`関数が実際の作業を行います。 これはprivate関数であり、他のコントラクト関数からのみ呼び出せます。 慣例として、private関数は状態変数と同様に`_`と命名されます。
-通常、Solidityでは、メッセージ送信者に`msg.sender`を使用します。 しかし、[OpenGSN](http://opengsn.org/)では使えません。 イーサ(ETH)無しのトークンのトランザクションを許可したい場合は、`_msgSender()`を使用しなければなりません。 通常のトランザクションでは、`msg.sender`を返しますが、イーサ(ETH)無しのトランザクションの場合は、メッセージを中継したコントラクトではなく、元の署名者を返します。
+通常、Solidityでは、メッセージ送信者に`msg.sender`を使用します。 しかし、それでは[OpenGSN](http://opengsn.org/)が機能しません。 トークンでetherレスのトランザクションを許可したい場合は、`_msgSender()`を使用する必要があります。 通常のトランザクションでは`msg.sender`を返しますが、etherレスのトランザクションの場合は、メッセージを中継したコントラクトではなく、元の署名者を返します。
-### 割当量(allowance)関連の関数 {#allowance-functions}
+### 割当量関数 {#allowance-functions}
-割当量機能を実装した関数には、`allowance`、`approve`、 `transferFrom`、`_approve`があります。 さらに、OpenZeppelin実装には、基本的な標準に加えてセキュリティを向上させる `increaseAllowance`や`decreaseAllowance`などの複数の機能が含まれます。
+これらは割当量機能を実装する関数です: `allowance`、`approve`、`transferFrom`、`_approve`。 さらに、OpenZeppelin実装は、セキュリティを向上させる機能である`increaseAllowance`と`decreaseAllowance`を含むように、基本的な標準を超えています。
#### allowance関数 {#allowance}
```solidity
/**
- * @dev See {IERC20-allowance}.
+ * @dev {IERC20-allowance}を参照してください。
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
```
-`allowance`関数を使用すると、誰でも割当量を確認することができます。
+`allowance`関数を使用すると、誰でも任意の割当量を確認することができます。
#### approve関数 {#approve}
```solidity
/**
- * @dev See {IERC20-approve}.
+ * @dev {IERC20-approve}を参照してください。
*
- * Requirements:
+ * 要件:
*
- * - `spender` cannot be the zero address.
+ * - `spender`はゼロアドレスであってはなりません。
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
```
-この関数は、割当量を作成するときに呼び出します。 上述の`transfer`関数と似ています。
+この関数は、割当量を作成するときに呼び出します。 上記の`transfer`関数と似ています。
-- この関数は、単に実際に作業を行うinternal関数(この場合は`_approve`)を呼び出します。
-- この関数は、成功した場合は`true`を返し、失敗した場合は取り消します。
+- この関数は、単に実際に作業を行う内部関数(この場合は`_approve`)を呼び出します。
+- この関数は、成功した場合は`true`を返し、失敗した場合はリバートします。
@@ -471,25 +463,25 @@ contract ERC20 is Context, IERC20 {
}
```
-internal関数を使用して、状態変更が起こる場所の数を最小限にしています。 状態を変更する_すべての_関数には、潜在的なセキュリティリスクがあり、セキュリティ監査が必要です。 このような方法で、間違いを犯す可能性を下げています。
+内部関数を使用して、状態変更が起こる場所の数を最小限にしています。 状態を変更する_すべての_関数には潜在的なセキュリティリスクがあり、セキュリティ監査が必要です。 この方法で、間違いを犯す可能性を下げています。
#### transferFrom関数 {#transferFrom}
-これは、使用者(spender)が割当量(allowance)を使用するために呼び出す関数です。 これには、使う量の転送操作と、その量を割当量(allowance)から減らす操作の、2つの操作が必要になります。
+これは、使用者(`spender`)が割当量を使用するために呼び出す関数です。 これには、使用される量を転送し、その量だけ割当量を減らすという2つの操作が必要です。
```solidity
/**
- * @dev See {IERC20-transferFrom}.
+ * @dev {IERC20-transferFrom}を参照してください。
*
- * Emits an {Approval} event indicating the updated allowance. これは
- * EIPでは必要ありません。 {ERC20}の最初にある注意事項を参照してください。
+ * 更新された割当量を示す{Approval}イベントを発行します。これは
+ * EIPでは要求されていません。{ERC20}の冒頭の注記を参照してください。
*
- * Requirements:
+ * 要件:
*
- * - `sender` and `recipient` cannot be the zero address.
- * - `sender` must have a balance of at least `amount`.
- * - the caller must have allowance for ``sender``'s tokens of at least
- * `amount`.
+ * - `sender`と`recipient`はゼロアドレスであってはなりません。
+ * - `sender`は少なくとも`amount`の残高を持っている必要があります。
+ * - 呼び出し元は、`sender`のトークンに対して少なくとも
+ * `amount`の割当量を持っている必要があります。
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual
override returns (bool) {
@@ -498,7 +490,8 @@ internal関数を使用して、状態変更が起こる場所の数を最小限
-`a.sub(b, "message")`関数の呼び出しでは、次の2つのことを行います。 まず、`a-b`を計算します。これが新しい割当量になります。 次に、この結果が負の数になっていないかをチェックします。 負になっている場合、提供されているメッセージを表示して、呼び出しが取り消されます。 呼び出しが取り消されると、呼び出し中に実行されたすべての処理が無効になるため、`_transfer`を元に戻す必要がないことに注意してください。
+`a.sub(b, "message")`関数の呼び出しでは、次の2つのことを行います。 まず、`a-b`を計算します。これが新しい割当量になります。
+次に、この結果が負の数になっていないかをチェックします。 負になっている場合、提供されているメッセージを表示して呼び出しがリバートされます。 呼び出しがリバートされると、その呼び出し中に以前に実行されたすべての処理は無視されるため、`_transfer`を元に戻す必要はありません。
```solidity
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount,
@@ -507,50 +500,49 @@ internal関数を使用して、状態変更が起こる場所の数を最小限
}
```
-#### OpenZeppelinによる安全性の向上 {#openzeppelin-safety-additions}
+#### OpenZeppelinの安全追加機能 {#openzeppelin-safety-additions}
-ゼロ以外の割当量を別のゼロ以外の値に設定することには、リスクが伴います。自分が制御できるのは自分のトランザクションの順序のみであり、他のユーザーのトランザクションの順序を制御することはできないからです。 アリスという初心者ユーザーと、ビルという誠実さに欠けるユーザーがいるとします。 アリスは、ビルが提供しているサービスを購入することにしました。購入には5トークンの費用がかかるため、アリスは5トークンの割当量(allowance)をビルに付与しました。
+ゼロ以外の割当量を別のゼロ以外の値に設定することにはリスクが伴います。なぜなら、自分が制御できるのは自分のトランザクションの順序のみであり、他のユーザーのトランザクションの順序は制御できないからです。 経験の浅いアリスと、不誠実なビルという2人のユーザーがいるとします。 アリスはビルからサービスを受けたいと考えており、その費用は5トークンだと思っています。そこで、彼女はビルに5トークンの割当量を与えます。
-その後、ビルの設定した価格が何らかの理由で10トークンに上がりました。 アリスは依然としてそのサービスの購入を希望しており、ビルへの割当量を10に設定したトランザクションを送信しました。 ビルは、トランザクションプールでこの新しいトランザクションを確認した瞬間に、より早くマイニングされるようにかなり高いガス代を設定した、アリスの5トークンを使うトランザクションを送信します。 この方法で、ビルは5トークンを使います。その後、アリスが送信した新しい割当量がマイニングされたら、さらに10トークンを使います。こうして、アリスが承認するつもりだった量を超える、合計15トークンを使えることになります。 この手法は、[フロントランニング](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/#front-running)と呼ばれます。
+その後、何かが変わり、ビルの価格は10トークンに上がりました。 まだサービスを受けたいアリスは、ビルの割当量を10に設定するトランザクションを送信します。 ビルはこの新しいトランザクションをトランザクションプールで確認した瞬間に、アリスの5トークンを使うトランザクションを送信し、より早くマイニングされるように非常に高いガス価格を設定します。 この方法で、ビルは最初に5トークンを使い、アリスの新しい割当量がマイニングされたら、さらに10トークンを使って合計15トークンを得ることができます。これはアリスが承認するつもりだった額よりも多いです。 このテクニックは[フロントランニング](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/#front-running)と呼ばれます。
-| アリスのトランザクション | アリスのノンス | ビルのトランザクション | ビルのノンス | ビルの割当量 | ビルのアリスからの総収入 |
-| ----------------- | ------- | ----------------------------- | ------ | ------ | ------------ |
-| approve(Bill, 5) | 10 | | | 5 | 0 |
-| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 |
-| approve(Bill, 10) | 11 | | | 10 | 5 |
-| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 15 |
+| アリスのトランザクション | アリスのノンス | ビルのトランザクション | ビルのノンス | ビルの割当量 | ビルのアリスからの総収入 |
+| ------------------------------------ | ------- | ------------------------------------------------ | ------ | ------ | ------------ |
+| approve(Bill, 5) | 10 | | | 5 | 0 |
+| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 |
+| approve(Bill, 10) | 11 | | | 10 | 5 |
+| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 15 |
-この問題を回避するには、割当量を特定の量に変更できる2つの関数(`increaseAllowance`と`decreaseAllowance`)を使用します。 これらの関数を使用すれば、ビルがすでに5トークンを使用していた場合、その後に使用できるのは残りの5トークンのみとなります。 タイミングに応じて、次のような2つの動作が考えられますが、いずれの場合でもビルが取得するのは10トークンのみです。
+この問題を回避するには、2つの関数(`increaseAllowance`と`decreaseAllowance`)を使用して、割当量を特定の量だけ変更します。 これにより、ビルがすでに5トークンを使用していた場合でも、その後に使用できるのは追加の5トークンのみとなります。 タイミングに応じて、次のような2つの動作が考えられますが、いずれの場合でもビルが取得するのは10トークンのみです。
A:
-| アリスのトランザクション | アリスのノンス | ビルのトランザクション | ビルのノンス | ビルの割当量 | ビルのアリスからの総収入 |
-| -------------------------- | -------:| ---------------------------- | ------:| -------:| ------------ |
-| approve(Bill, 5) | 10 | | | 5 | 0 |
-| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 |
-| increaseAllowance(Bill, 5) | 11 | | | 0+5 = 5 | 5 |
-| | | transferFrom(Alice, Bill, 5) | 10,124 | 0 | 10 |
+| アリスのトランザクション | アリスのノンス | ビルのトランザクション | ビルのノンス | ビルの割当量 | ビルのアリスからの総収入 |
+| --------------------------------------------- | ------: | ----------------------------------------------- | -----: | ------: | ------------ |
+| approve(Bill, 5) | 10 | | | 5 | 0 |
+| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 |
+| increaseAllowance(Bill, 5) | 11 | | | 0+5 = 5 | 5 |
+| | | transferFrom(Alice, Bill, 5) | 10,124 | 0 | 10 |
B:
-| アリスのトランザクション | アリスのノンス | ビルのトランザクション | ビルのノンス | ビルの割当量 | ビルのアリスからの総収入 |
-| -------------------------- | -------:| ----------------------------- | ------:| --------:| ------------:|
-| approve(Bill, 5) | 10 | | | 5 | 0 |
-| increaseAllowance(Bill, 5) | 11 | | | 5+5 = 10 | 0 |
-| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 10 |
+| アリスのトランザクション | アリスのノンス | ビルのトランザクション | ビルのノンス | ビルの割当量 | ビルのアリスからの総収入 |
+| --------------------------------------------- | ------: | ------------------------------------------------ | -----: | -------: | -----------: |
+| approve(Bill, 5) | 10 | | | 5 | 0 |
+| increaseAllowance(Bill, 5) | 11 | | | 5+5 = 10 | 0 |
+| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 10 |
```solidity
/**
- * @dev Atomically increases the allowance granted to `spender` by the caller.
+ * @dev 呼び出し元によって付与された`spender`への割当量をアトミックに増加させます。
*
- * This is an alternative to {approve} that can be used as a mitigation for
- * problems described in {IERC20-approve}.
+ * これは{approve}の代替手段であり、{IERC20-approve}で説明されている問題を緩和するために使用できます。
*
- * Emits an {Approval} event indicating the updated allowance.
+ * 更新された割当量を示す{Approval}イベントを発行します。
*
- * Requirements:
+ * 要件:
*
- * - `spender` cannot be the zero address.
+ * - `spender`はゼロアドレスであってはなりません。
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
@@ -558,23 +550,22 @@ B:
}
```
-`a.add(b)`関数は、安全な加算です。 万が一、`a`+`b`>=`2^256`のような計算が行われても、通常の加算で発生してしまうオーバー(アンダー)フローが発生しません。
+`a.add(b)`関数は、安全な加算です。 万が一`a`+`b`>=`2^256`となっても、通常の加算のようにラップアラウンドしません。
```solidity
/**
- * @dev Atomically decreases the allowance granted to `spender` by the caller.
+ * @dev 呼び出し元によって付与された`spender`への割当量をアトミックに減少させます。
*
- * This is an alternative to {approve} that can be used as a mitigation for
- * problems described in {IERC20-approve}.
+ * これは{approve}の代替手段であり、{IERC20-approve}で説明されている問題を緩和するために使用できます。
*
- * Emits an {Approval} event indicating the updated allowance.
+ * 更新された割当量を示す{Approval}イベントを発行します。
*
- * Requirements:
+ * 要件:
*
- * - `spender` cannot be the zero address.
- * - `spender` must have allowance for the caller of at least
- * `subtractedValue`.
+ * - `spender`はゼロアドレスであってはなりません。
+ * - `spender`は呼び出し元に対して、少なくとも
+ * `subtractedValue`の割当量を持っている必要があります。
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue,
@@ -587,27 +578,27 @@ B:
次の4つの関数(`_transfer`、`_mint`、`_burn`、`_approve`)は、実際の処理を行います。
-#### \_transfer関数 {#_transfer}
+#### _transfer関数 {#_transfer}
```solidity
/**
- * @dev Moves tokens `amount` from `sender` to `recipient`.
+ * @dev トークン`amount`を`sender`から`recipient`に移動させます。
*
- * This is internal function is equivalent to {transfer}, and can be used to
- * e.g., implement automatic token fees, slashing mechanisms, etc.
+ * この内部関数は{transfer}と同等であり、
+ * 例えば、自動的なトークン手数料やスラッシングメカニズムなどを実装するために使用できます。
*
- * Emits a {Transfer} event.
+ * {Transfer}イベントを発行します。
*
- * Requirements:
+ * 要件:
*
- * - `sender` cannot be the zero address.
- * - `recipient` cannot be the zero address.
- * - `sender` must have a balance of at least `amount`.
+ * - `sender`はゼロアドレスであってはなりません。
+ * - `recipient`はゼロアドレスであってはなりません。
+ * - `sender`は少なくとも`amount`の残高を持っている必要があります。
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
```
-`_transfer`関数は、トークンをあるアカウントから別のアカウントへ転送します。 この関数は、(送信者自身のアカウントから転送する)`transfer`と、(割当量を使用するために他のユーザーのアカウントから転送する)`transferFrom`の両方から呼び出されます。
+この`_transfer`関数は、トークンをあるアカウントから別のアカウントへ転送します。 この関数は、`transfer`(送信者自身のアカウントからの転送)と`transferFrom`(割当量を使用して他のユーザーのアカウントから転送)の両方から呼び出されます。
@@ -628,11 +619,11 @@ B:
このコントラクトを使用するには2つの方法があります。
1. 自分のコードのテンプレートとして使う
-1. [このコントラクトを継承](https://www.bitdegree.org/learn/solidity-inheritance)し、変更する必要がある関数のみをオーバーライドする
+2. [コントラクトから継承](https://www.bitdegree.org/learn/solidity-inheritance)し、修正が必要な関数のみをオーバーライドする
-OpenZeppelin ERC-20のコードはすでに監査を受けており、安全であることが知られているため、2つ目の方法をお勧めします。 継承を使用すると、変更した関数が明らかになります。他のユーザーは、変更された特定の関数を監査するだけで、そのコントラクトを信頼することができます。
+OpenZeppelinのERC-20コードはすでに監査を受けており、安全であることが示されているため、2つ目の方法がはるかに優れています。 継承を使用すると、変更した関数が明らかになり、人々はコントラクトを信頼するためにそれらの特定の関数のみを監査すればよくなります。
-多くの場合、トークンの所有者が変わるたびに関数を実行すると便利です。 ただし、`_transfer`は非常に重要な関数ですが、安全でない書き込みをしてしまう可能性があるため(下記参照)、オーバーライドしないことをお勧めします。 この解決策として、`_beforeTokenTransfer`という[フック関数](https://wikipedia.org/wiki/Hooking)があります。 この関数をオーバライドすれば、転送のたびに呼び出されるようになります。
+多くの場合、トークンの所有者が変わるたびに関数を実行すると便利です。 しかし、`_transfer`は非常に重要な関数であり、安全でない書き方をしてしまう可能性があるため(下記参照)、オーバーライドしないことをお勧めします。 解決策は、[フック関数](https://wikipedia.org/wiki/Hooking)である`_beforeTokenTransfer`です。 この関数をオーバーライドすれば、転送のたびに呼び出されるようになります。
@@ -641,7 +632,7 @@ OpenZeppelin ERC-20のコードはすでに監査を受けており、安全で
_balances[recipient] = _balances[recipient].add(amount);
```
-この2行で、実際に転送を行っています。 この2行の間に**何もない**ことと、転送する量を送信者から減算してから、その量を受取人に加算していることに注意してください。 この2行の間に別のコントラクトへの呼び出しがある場合、このコントラクトで不正を行うために使用される可能性があるため、このことは非常に重要になります。 こうすることで、転送がアトミックになる(他の操作に割り込まれないようになる)ため、転送の途中で何かが発生することはなくなります。
+この2行で、実際に転送を行っています。 この2行の間には**何も**なく、受取人に加算する前に送信者から転送額を減算していることに注意してください。 この2行の間に別のコントラクトへの呼び出しがある場合、このコントラクトで不正を行うために使用される可能性があるため、このことは非常に重要になります。 こうすることで、転送がアトミックになり、その途中で何も起こらなくなります。
@@ -650,23 +641,25 @@ OpenZeppelin ERC-20のコードはすでに監査を受けており、安全で
}
```
-最後に、`Transfer`イベントを発行します。 イベントは、スマートコントラクトからアクセスできません。しかし、ブロックチェーンの外で実行されているコードは、イベントをリッスンして対応することができます。 例えば、ウォレットで所有者がより多くのトークンを得た時期を追跡できます。
+最後に、`Transfer`イベントを発行します。 イベントはスマートコントラクトからアクセスできませんが、ブロックチェーンの外で実行されているコードは、イベントをリッスンして対応することができます。 例えば、ウォレットは所有者がより多くのトークンを得た時期を追跡できます。
-#### \_mint関数と\_burn関数 {#_mint-and-_burn}
+#### _mint関数と_burn関数 {#_mint-and-_burn}
-この2つの関数(`_mint`と`_burn`)は、トークンの総供給量を変更します。 これらはinternalであり、このコントラクト内にこれらを呼び出す関数はありません。そのため、コントラクトを継承し、新しいトークンのミントや既存のトークンのバーンを実行する条件を決定する独自のロジックを追加する場合にのみ役立ちます。
+この2つの関数(`_mint`と`_burn`)は、トークンの総供給量を変更します。
+これらは内部関数であり、このコントラクト内にこれらを呼び出す関数はありません。そのため、コントラクトを継承し、どのような条件下で新しいトークンをミントし、既存のトークンをバーンするかを決定する独自のロジックを追加する場合にのみ役立ちます。
-**注:** すべてのERC-20トークンには、トークン管理を規定している独自のビジネスロジックがあります。 例えば、固定した供給量のコントラクトでは、コンストラクタ内で `_mint`のみを呼び出す可能性があり、`_burn`を呼び出すことはありません。 トークンを販売するコントラクトは、支払いが行われたタイミングで`_mint`を呼び出し、天井知らずのインフレを避けるために、ある時点で`_burn`を呼び出すことが考えられます。
+**注:** すべてのERC-20トークンには、トークン管理を規定する独自のビジネスロジックがあります。
+例えば、固定供給量のコントラクトでは、コンストラクタ内で`_mint`のみを呼び出し、`_burn`を呼び出すことはありません。 トークンを販売するコントラクトは、支払いが行われたタイミングで`_mint`を呼び出し、おそらく、天井知らずのインフレを避けるためにある時点で`_burn`を呼び出します。
```solidity
- /** @dev Creates `amount` tokens and assigns them to `account`, increasing
- * the total supply.
+ /** @dev `amount`のトークンを作成して`account`に割り当て、
+ * 総供給量を増やします。
*
- * Emits a {Transfer} event with `from` set to the zero address.
+ * `from`がゼロアドレスに設定された{Transfer}イベントを発行します。
*
- * Requirements:
+ * 要件:
*
- * - `to` cannot be the zero address.
+ * - `to`はゼロアドレスであってはなりません。
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
@@ -677,21 +670,21 @@ OpenZeppelin ERC-20のコードはすでに監査を受けており、安全で
}
```
-トークンの総額が変更された場合は、`_totalSupply`を必ずアップデートしてください。
+トークンの総数が変更された場合は、`_totalSupply`を必ずアップデートしてください。
-```
+```solidity
/**
- * @dev Destroys `amount` tokens from `account`, reducing the
- * total supply.
+ * @dev `account`から`amount`のトークンを破棄し、
+ * 総供給量を減らします。
*
- * Emits a {Transfer} event with `to` set to the zero address.
+ * `to`がゼロアドレスに設定された{Transfer}イベントを発行します。
*
- * Requirements:
+ * 要件:
*
- * - `account` cannot be the zero address.
- * - `account` must have at least `amount` tokens.
+ * - `account`はゼロアドレスであってはなりません。
+ * - `account`は少なくとも`amount`のトークンを持っている必要があります。
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
@@ -706,23 +699,23 @@ OpenZeppelin ERC-20のコードはすでに監査を受けており、安全で
`_burn`関数は、方向が逆であることを除き`_mint`とほぼ同じです。
-#### \_approve関数 {#_approve}
+#### _approve関数 {#_approve}
-これは、実際の割当量(allowance)を指定する関数です。 所有者は自身の現在の残高よりも高い割当量を指定できることに注意してください。 残高は転送時にチェックされるため、割当量の作成時の残高と異なっていても問題ありません。
+これは、実際に割当量を指定する関数です。 所有者は自身の現在の残高よりも高い割当量を指定できることに注意してください。 残高は転送時にチェックされ、割当量の作成時の残高と異なる可能性があるため、これは問題ありません。
```solidity
/**
- * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
+ * @dev `owner`のトークンに対する`spender`の割当量を`amount`に設定します。
*
- * This internal function is equivalent to `approve`, and can be used to
- * e.g., set automatic allowances for certain subsystems, etc.
+ * この内部関数は`approve`と同等であり、
+ * 例えば、特定のサブシステムに対する自動的な割当量などを設定するために使用できます。
*
- * Emits an {Approval} event.
+ * {Approval}イベントを発行します。
*
- * Requirements:
+ * 要件:
*
- * - `owner` cannot be the zero address.
- * - `spender` cannot be the zero address.
+ * - `owner`はゼロアドレスであってはなりません。
+ * - `spender`はゼロアドレスであってはなりません。
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
@@ -733,7 +726,7 @@ OpenZeppelin ERC-20のコードはすでに監査を受けており、安全で
-`Approval`イベントを発行します。 アプリケーションがどのように書かれているかによって異なりますが、使用者(spender)のコントラクトには、所有者またはこれらのイベントをリッスンしているサーバーのいずれかによって承認(Approval)が通知されます。
+`Approval`イベントを発行します。 アプリケーションがどのように書かれているかによって異なりますが、使用者(`spender`)のコントラクトには、所有者またはこれらのイベントをリッスンしているサーバーのいずれかによって承認が通知されます。
```solidity
emit Approval(owner, spender, amount);
@@ -741,57 +734,61 @@ OpenZeppelin ERC-20のコードはすでに監査を受けており、安全で
```
-### 小数変数の変更 {#modify-the-decimals-variable}
+### decimals変数の変更 {#modify-the-decimals-variable}
```solidity
/**
- * @dev Sets {decimals} to a value other than the default one of 18.
+ * @dev {decimals}をデフォルト値の18以外の値に設定します。
*
- * WARNING: This function should only be called from the constructor. Most
- * applications that interact with token contracts will not expect
- * {decimals} to ever change, and may work incorrectly if it does.
+ * 警告: この関数はコンストラクタからのみ呼び出すべきです。ほとんどの
+ * トークンコントラクトと対話するアプリケーションは、
+ * {decimals}が変更されることを想定しておらず、変更されると誤動作する可能性があります。
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
```
-この関数は、`_decimals`変数を変更します。`_decimals`変数は、量(金額)の解釈方法をユーザーインターフェースに伝えるのに使用されます。 コンストラクタから呼び出される必要があります。 その後のどの時点においても、この関数を呼び出すと不正になります。アプリケーションは、このような処理をするようには設計されていません。
+この関数は`_decimals`変数を変更します。この変数は、量の解釈方法をユーザーインターフェースに伝えるのに使用されます。
+コンストラクタから呼び出すべきです。 その後のどの時点においてもこの関数を呼び出すと不正になり、アプリケーションはこのような処理をするようには設計されていません。
### フック {#hooks}
```solidity
/**
- * @dev Hook that is called before any transfer of tokens. これには
+ * @dev トークンのあらゆる転送の前に呼び出されるフック。これには
* ミントとバーンが含まれます。
*
- * Calling conditions:
+ * 呼び出し条件:
*
- * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
- * will be to transferred to `to`.
- * - when `from` is zero, `amount` tokens will be minted for `to`.
- * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
- * - `from` and `to` are never both zero.
+ * - `from`と`to`が両方ともゼロでない場合、`from`のトークンの`amount`が
+ * `to`に転送されます。
+ * - `from`がゼロの場合、`amount`のトークンが`to`のためにミントされます。
+ * - `to`がゼロの場合、`from`のトークンの`amount`がバーンされます。
+ * - `from`と`to`が両方ともゼロになることはありません。
*
- * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
+ * フックについてさらに学ぶには、xref:ROOT:extending-contracts.adoc#using-hooks[フックの使用]を参照してください。
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
```
-このフック関数は、転送中に呼び出されます。 空になっていますが、何かを実行するのにこの関数が必要な場合は、オーバーライドしてください。
+このフック関数は、転送中に呼び出されます。 ここでは空になっていますが、何かを実行するのにこの関数が必要な場合は、オーバーライドしてください。
-## まとめ {#conclusion}
+## 結論 {#conclusion}
確認のため、このコントラクトの最も重要な点を以下にまとめています(個人的な意見のため、他者にとって重要な点とは異なる場合があります) 。
-- _ブロックチェーンに秘密はありません_。 スマートコントラクトがアクセスできる情報は、世界中で利用可能であることを意味します。
-- 自分のトランザクションの順序は自分で制御できますが、他のユーザーのトランザクションが発生するタイミングは制御できません。 これが、割当量(allowance)の変更に伴うリスクになります。変更により、使用者(spender)が変更前と変更後の両方の割当量を使用できてしまうためです。
-- `uint256`型の値がオーバー(アンダー)フローします。 つまり、例えば_0-1=2^256-1_です。 これが望ましい動作ではない場合、プログラムで確認する必要があります(または、それを行うSafeMathライブラリを使用します)。 この仕様は、[Solidity 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html)で変更されていることに注意してください。
-- 監査を容易にするため、特定の場所で特定の型のすべての状態変更を行います。 例えば、`_approve`が、`approve`、`transferFrom`、`increaseAllowance`、`decreaseAllowance`などによって呼び出されるのは、この理由です。
-- (`_transfer`で見られるように)状態変更は、処理の途中で他の操作に割り込まれることがないアトミックである必要があります。 これは状態変更中に、一貫性のない状態が存在するためです。 例えば、送信者の残高からトークンを差し引いた時点から、受取人の残高にそのトークンを加えるまでの間は、存在すべき数よりも少ない数のトークンが存在することになります。 この2つの処理の間に別の操作(特に、異なるコントラクトの呼び出しなど)がある場合、このトークンの状態が悪用される可能性があります。
+- ブロックチェーンには秘密はありません。 スマートコントラクトがアクセスできる情報は、全世界で利用可能です。
+- 自分のトランザクションの順序は自分で制御できますが、他のユーザーのトランザクションが発生するタイミングは制御できません。 これが、割当量の変更が危険となりうる理由です。変更により、使用者(`spender`)が両方の割当量の合計を使用できてしまうためです。
+- `uint256`型の値はラップアラウンドします。 言い換えると、_0-1=2^256-1_となります。 これが望ましい動作ではない場合、プログラムで確認する必要があります(または、それを行うSafeMathライブラリを使用します)。 これは[Solidity 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html)で変更されたことに注意してください。
+- 監査を容易にするため、特定の場所で特定の型のすべての状態変更を行います。
+ これが、例えば`approve`、`transferFrom`、`increaseAllowance`、`decreaseAllowance`によって呼び出される`_approve`が存在する理由です。
+- 状態変更は、(`_transfer`で見られるように)処理の途中で他のアクションに割り込まれることがないアトミックである必要があります。 これは状態変更中に、一貫性のない状態が存在するためです。 例えば、送信者の残高から差し引いた時点から、受取人の残高に加えるまでの間は、存在するべき数よりも少ないトークンが存在することになります。 この2つの処理の間に別の操作(特に、異なるコントラクトの呼び出しなど)がある場合、このトークンの状態が悪用される可能性があります。
+
+ここまで、OpenZeppelin ERC-20コントラクトがどのように書かれているか、特に、より安全に記述する方法を学びました。是非自分でも安全なコントラクトとアプリケーションを作成してみてください。
-ここまで、OpenZeppelin ERC-20コントラクトがどのように書かれているかについて見てきました。特に、より安全に記述する方法を学びました。是非自分でも安全なコントラクトとアプリケーションを作成してみてください。
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
diff --git a/public/content/translations/ja/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/ja/developers/tutorials/erc20-with-safety-rails/index.md
index ed97fc06bfd..26fabbd4847 100644
--- a/public/content/translations/ja/developers/tutorials/erc20-with-safety-rails/index.md
+++ b/public/content/translations/ja/developers/tutorials/erc20-with-safety-rails/index.md
@@ -1,10 +1,9 @@
---
-title: ERC-20の安全策
-description: つまらないミスをするのを避ける方法
+title: "安全策を備えたERC-20"
+description: "ユーザーのうっかりミスを防ぐ方法"
author: Ori Pomerantz
lang: ja
-tags:
- - "ERC-20"
+tags: [ "ERC-20" ]
skill: beginner
published: 2022-08-15
---
@@ -13,48 +12,51 @@ published: 2022-08-15
イーサリアムの素晴らしい点の1つとして、トランザクションを変更したり取り消したりできる中央機関が存在しないことがあります。 反対に、イーサリアムでは、ユーザーの間違いや不正なトランザクションを取り消す権限を持つ中央機関が存在しないことがデメリットになりえます。 この記事では、[ERC-20](/developers/docs/standards/tokens/erc-20/)トークンでユーザーがしてしまうよくあるミスや、そのミスを防ぐトークンの作成方法について説明します。また、中央機関に権限を与えることについても説明します (例えば、アカウントの凍結など) 。
-注意: [OpenZeppelin ERC-20トークンコントラクト](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20)を使いますが、このコントラクト自体について詳しくは説明しません。 ERC-20トークンコントラクトの詳細については、[こちら](/developers/tutorials/erc20-annotated-code)をご覧ください。
+この記事では[OpenZeppelin ERC-20トークンコントラクト](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20)を使用しますが、その詳細については説明しませんのでご注意ください。 この情報については、[こちら](/developers/tutorials/erc20-annotated-code)をご覧ください。
-全てのソースコードを表示したい場合は、次のようにします。
+完全なソースコードを確認したい場合は、以下を参照してください。
1. [Remix IDE](https://remix.ethereum.org/)を開きます。
-2. クローンGitHubアイコン () をクリックします。
+2. GitHubのクローンアイコン()をクリックします。
3. GitHubリポジトリ`https://github.com/qbzzt/20220815-erc20-safety-rails`をクローンします。
-4. 「**contracts > erc20-safety-rails.sol**」を開きます。
+4. **contracts > erc20-safety-rails.sol**を開きます。
## ERC-20コントラクトの作成 {#creating-an-erc-20-contract}
-安全策を講じるための機能を追加する前に、ERC-20コントラクトが必要になります。 この記事では、[OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/5.x/wizard)を使って加えます。 もう一つブラウザで開いて、次の手順に従ってください。
+安全策を講じるための機能を追加する前に、ERC-20コントラクトが必要になります。 この記事では、[OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/5.x/wizard)を使用します。 別のブラウザで開き、以下の手順に従ってください。
+
+1. **ERC20**を選択します。
-1. **ERC20**を選びます。
2. 次の設定値を入力します。
| パラメータ | 値 |
| -------------- | ---------------- |
| 名前 | SafetyRailsToken |
- | Symbol | SAFE |
+ | 記号 | SAFE |
| Premint | 1000 |
| 機能 | なし |
| Access Control | Ownable |
| Upgradability | なし |
-3. 上にスクロールして (Remixを使う場合は) **Open in Remix**をクリックしてください。別の環境を使う場合は、**ダウンロード**をクリックしてください。 ここでは、Remixを使用していることとします。他の環境を使用する場合は、適宜変更してください。
-4. これで完全なERC-20コントラクトがあります。 「`.deps` > `npm`」でインポートしたコードを展開して確認できます。
-5. コントラクトをコンパイル、デプロイ、そして操作してERC-20 コントラクトとして機能していることを確認します。 Remixの使用方法を学びたいならば、[このチュートリアルが役立ちます](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth)。
+3. 上にスクロールして、(Remixの場合は) **Open in Remix** を、別の環境を使用する場合は **Download** をクリックします。 ここでは、Remixを使用していることとします。他の環境を使用する場合は、適宜変更してください。
+
+4. これで完全に機能するERC-20コントラクトができました。 `.deps` > `npm` を展開すると、インポートされたコードを確認できます。
-## よくあるミス {#common-mistakes}
+5. コントラクトをコンパイル、デプロイ、そして操作して、ERC-20コントラクトとして機能していることを確認します。 Remixの使い方を学ぶ必要がある場合は、[このチュートリアル](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth)を使用してください。
-### ミスのタイプ {#the-mistakes}
+## よくある間違い {#common-mistakes}
-ユーザーは、間違ったアドレスへトークンを送信してしまうことがあります。 なぜ間違って送ってしまった理由を知ることはできませんが、よく発生するミスのタイプで頻繁に検出できる次のものがあります。
+### 間違い {#the-mistakes}
-1. トークンをコントラクト自身のアドレスに送信する。 例えば、[OptimismのOPトークン](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c)では、[12万](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042#tokentxns)を超えるOPトークンが2か月もしないうちに累積していることがわかります。 これは、人々の膨大な資産がただ単に失われていることを表しています。
+ユーザーは、間違ったアドレスへトークンを送信してしまうことがあります。 ユーザーが何を意図していたかを知ることはできませんが、頻繁に発生し、かつ検出しやすいエラーには2つのタイプがあります。
-2. トークンを[外部所有アカウント](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs)や[スマートコントラクト](/developers/docs/smart-contracts)に相当しない空アドレスへ送信する。 このミスがどのくらいの頻度で発生するかについての統計はありません。[1件のインシデントで2千万トークンを失っているものもあります](https://gov.optimism.io/t/message-to-optimism-community-from-Wintermute/2595)。
+1. トークンをコントラクト自身のアドレスに送信する。 例えば、[OptimismのOPトークン](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c)は、2か月足らずで[120,000](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000042)以上のOPトークンを蓄積してしまいました。 これは、おそらく人々が失ってしまったであろう、かなりの額の資産に相当します。
-### 送金を防止する {#preventing-transfers}
+2. トークンを空のアドレス、つまり[外部所有アカウント](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs)や[スマートコントラクト](/developers/docs/smart-contracts)ではないアドレスに送信してしまうこと。 これがどのくらいの頻度で発生するかについての統計はありませんが、[あるインシデントでは20,000,000トークンが失われる可能性がありました](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595)。
-OpenZeppelinのERC-20コントラクトには、[`_beforeTokenTransfer`というフック](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368)があり、トークンを送金する前に呼び出されます。 デフォルトでは、このフックは何も行いません。しかし、独自の機能をフックに掛けることで、問題がある場合に元に戻すなどのチェックが可能です。
+### 送金の防止 {#preventing-transfers}
+
+OpenZeppelinのERC-20コントラクトには、トークンが送金される前に呼び出される[`_beforeTokenTransfer`というフック](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368)が含まれています。 デフォルトでは、このフックは何も行いませんが、問題がある場合にトランザクションをリバートするチェックなど、独自の機能を実装するために利用できます。
このフックを使用するには、コンストラクタの後に次の関数を加えます。
@@ -67,42 +69,42 @@ OpenZeppelinのERC-20コントラクトには、[`_beforeTokenTransfer`という
}
```
-Solidityにあまり詳しくない人ならば、次の関数の箇所は馴染みがないかもしれません。
+Solidityにあまり詳しくない方には、この関数の一部の要素は目新しいかもしれません。
```solidity
internal virtual
```
-上記の`virtual`キーワードでは、`ERC20`から機能を継承し、関数をオーバーライドして、他のコントラクトも同様にこのコントラクトの機能を継承して、この関数をオーバーライドできるようにしています。
+`virtual`キーワードは、私たちが`ERC20`から機能を継承してこの関数をオーバーライドしたのと同じように、他のコントラクトが私たちのコントラクトから継承してこの関数をオーバーライドできることを意味します。
```solidity
override(ERC20)
```
-ERC20トークンの`_beforeTokenTransfer`の定義を[オーバーライド](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding)することを明示的に指定しなければなりません。 一般的なセキュリティの観点において、暗黙的な定義よりも明示的な定義の方がはるかに良いとされています。記述されていれば、それが実行されることを忘れないからです。 オーバーライドするスーパークラスの `_beforeTokenTransfer`を指定しなければならないのも同様の理由です。
+`_beforeTokenTransfer`のERC20トークン定義を[オーバーライド](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding)していることを明示的に指定する必要があります。 一般的に、セキュリティの観点からは、暗黙的な定義よりも明示的な定義の方がはるかに優れています。目の前にあれば、何かをしたことを忘れることはありません。 これが、どのスーパークラスの`_beforeTokenTransfer`をオーバーライドしているかを指定する必要がある理由でもあります。
```solidity
super._beforeTokenTransfer(from, to, amount);
```
-上記は、継承しているコントラクトから継承元のコントラクトの `_beforeTokenTransfer`関数を呼び出しています。 この場合は、`ERC20`のみであり、`Ownable`にはこのフックがありません。 現時点では、`ERC20._beforeTokenTransfer`は何も行いません。コントラクトはデプロイ後に変更できないため、再デプロイによって将来に機能が追加された場合に備えて呼び出しています。
+この行は、継承元のコントラクトのうち、`_beforeTokenTransfer`関数を持つものの関数を呼び出します。 この場合、それは`ERC20`のみです。`Ownable`にはこのフックはありません。 現在`ERC20._beforeTokenTransfer`は何も行いませんが、将来機能が追加された場合に備えて呼び出します (コントラクトはデプロイ後に変更できないため、その場合はコントラクトを再デプロイすることになります)。
### 要件のコーディング {#coding-the-requirements}
-次の要件を関数に対して加えたいと思います。
+この関数に以下の要件を追加します。
-- `to`アドレスをERC-20コントラクト自体のアドレスである`address(this)`と等しくできないようにすること。
-- `to`アドレスを空にすることができないこと。また、次のいずれかであること。
- - 外部所有アカウント (EOA) 。 アドレスがEOAであるかどうかを直接確認することはできませんが、アドレスのETH残高を確認することはできます。 EOAは、たとえ使用されなくなったとしても、ほとんどの場合、残高が残っています。これは、最後のweiまで使うのは困難だからです。
- - スマートコントラクト。 アドレスがスマートコントラクトであるかどうかのテストは少し大変です。 [`EXTCODESIZE`](https://www.evm.codes/#3b)という外部コードの長さをチェックするオペコードがありますが、Solidityでは直接使用することはできません。 これには、[Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html)というEVMアセンブリを使う必要があります。 Solidityから使用できる他の値 ([ `.code`および `.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)) もありますが、コストがそれよりも高くなります。
+- `to`アドレスは、ERC-20コントラクト自体のアドレスである`address(this)`であってはならない。
+- `to`アドレスは空であってはならず、以下のいずれかでなければならない。
+ - 外部所有アカウント (EOA)。 アドレスがEOAであるかどうかを直接確認することはできませんが、アドレスのETH残高は確認できます。 EOAは、使用されなくなった後でもほとんどの場合、残高が残っています。最後のweiまで使い切るのは困難だからです。
+ - スマートコントラクト。 アドレスがスマートコントラクトであるかどうかのテストは、少し難しくなります。 外部コード長をチェックする[`EXTCODESIZE`](https://www.evm.codes/#3b)というオペコードがありますが、Solidityで直接利用することはできません。 そのためには、EVMアセンブリである[Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html)を使用する必要があります。 Solidityから使用できる他の値 ([`.code` や `.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)) もありますが、それらはより多くのコストがかかります。
-新しいコードを1行ずつ見てみましょう。
+新しいコードを1行ずつ見ていきましょう。
```solidity
- require(to != address(this), "Can't send tokens to the contract address");
+ require(to != address(this), "コントラクトアドレスにトークンを送信することはできません");
```
-これが最初の要件です。`to`と`this(address)`が等しくないことを確認しています。
+これが最初の要件で、`to`と`address(this)`が同じでないことを確認します。
```solidity
bool isToContract;
@@ -111,53 +113,53 @@ ERC20トークンの`_beforeTokenTransfer`の定義を[オーバーライド](ht
}
```
-上記は、アドレスがコントラクトかどうかを確認する方法です。 Yulから出力を直接受け取ることはできません。そのため、代わりに結果を保持する変数を定義しています (この場合は `isToContract`) 。 Yulでは、すべてのオペコードが関数として動作します。 したがって、最初に[`EXTCODESIZE`](https://www.evm.codes/#3b)を呼び出してコントラクトサイズを取得し、次に[`GT`](https://www.evm.codes/#11)でゼロでないことを確認します (符号なし整数を扱っているため、当然、負の値にすることはできません) 。 その後、結果を`isToContract`に書き込んでいます。
+このようにして、アドレスがコントラクトであるかどうかを確認します。 Yulから直接出力を受け取ることはできないので、代わりに結果を保持する変数(この場合は`isToContract`)を定義します。 Yulは、すべてのオペコードが関数としてみなされる仕組みになっています。 そこで、まず[`EXTCODESIZE`](https://www.evm.codes/#3b)を呼び出してコントラクトのサイズを取得し、次に[`GT`](https://www.evm.codes/#11)を使ってそれがゼロでないことを確認します(符号なし整数を扱っているので、もちろん負になることはありません)。 そして、その結果を`isToContract`に書き込みます。
```solidity
- require(to.balance != 0 || isToContract, "Can't send tokens to an empty address");
+ require(to.balance != 0 || isToContract, "空のアドレスにトークンを送信することはできません");
```
-最後に、空アドレスのチェックをしています。
+そして最後に、空のアドレスに対する実際のチェックを行います。
## 管理者アクセス {#admin-access}
-間違いを取り消せる管理者がいると、便利なことがあります。 悪用される可能性を減らすには、管理者を[マルチシグ](https://blog.logrocket.com/security-choices-multi-signature-wallets/)にして、各アクションに対する複数人の同意を必要にします。 この記事では、次の2つの管理機能を持つものとします。
+間違いを取り消せる管理者がいると、便利なことがあります。 悪用の可能性を減らすため、この管理者を[マルチシグ](https://blog.logrocket.com/security-choices-multi-signature-wallets/)にして、あるアクションに対して複数の人が合意しなければならないようにすることができます。 この記事では、2つの管理機能について説明します。
-1. アカウントの凍結と解凍。 これは、アカウントが侵害された可能性がある場合などに役立ちます。
+1. アカウントの凍結と凍結解除。 これは、例えば、アカウントが侵害された可能性がある場合に便利です。
2. アセットのクリーンアップ。
- 時には、詐欺師が正当であると思わせるために、本物のトークンコントラクトに偽物のトークンを送信することがあります。 [こちら](https://optimistic.etherscan.io/token/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe?a=0x4200000000000000000000000000000000000042)に、その例があります。 正当なERC-20コントラクトは、[0x4200....0042](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042)です。 装っているスキャムは、[0x234....bbe](https://optimistic.etherscan.io/address/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe)です。
+ 詐欺師が正当性を装うために、本物のトークンコントラクトに偽のトークンを送ることがあります。 例えば、[こちら](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe?tab=holders)をご覧ください。 正規のERC-20コントラクトは [0x4200....0042](https://optimism.blockscout.com/token/0x4200000000000000000000000000000000000042) です。 それになりすました詐欺コントラクトは [0x234....bbe](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe) です。
- また、正当なERC-20トークンを誤ってコントラクト自体に送信してしまう可能性もあります。これが、アセットのクリーンアップ方法が必要になるもう1つの理由です。
+ また、ユーザーが正規のERC-20トークンを誤って私たちのコントラクトに送ってしまう可能性もあります。これも、それらを取り出す方法が必要となるもう一つの理由です。
-OpenZeppelinでは、管理者アクセスを可能にする次の2つのメカニズムを提供しています。
+OpenZeppelinは、管理者アクセスを可能にする2つのメカニズムを提供しています。
-- [`Ownable`](https://docs.openzeppelin.com/contracts/5.x/access-control#ownership-and-ownable)コントラクトでは、所有者は1人です。 `onlyOwner` [modifier](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm)のある関数は、その所有者のみしか呼び出せません。 所有者は、所有権を他の人に譲渡することも、完全に放棄することもできます。 通常、それ以外のアカウントの権限は変わりません。
-- [`AccessControl`](https://docs.openzeppelin.com/contracts/5.x/access-control#role-based-access-control)コントラクトでは、[ロールベースのアクセス制御 (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control)機能があります。
+- [`Ownable`](https://docs.openzeppelin.com/contracts/5.x/access-control#ownership-and-ownable)コントラクトには、単一の所有者がいます。 `onlyOwner` [修飾子](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm)を持つ関数は、その所有者のみが呼び出すことができます。 所有者は、所有権を他の誰かに譲渡したり、完全に放棄したりすることができます。 他のすべてのアカウントの権限は、通常は同一です。
+- [`AccessControl`](https://docs.openzeppelin.com/contracts/5.x/access-control#role-based-access-control)コントラクトには、[ロールベースのアクセス制御(RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control)があります。
-この記事では、簡潔にするために`Ownable`を使っています。
+この記事では、簡潔にするために`Ownable`を使用します。
-### コントラクトの凍結および解凍 {#freezing-and-thawing-contracts}
+### コントラクトの凍結と凍結解除 {#freezing-and-thawing-contracts}
-コントラクトの凍結と解凍において、次のいくつかの変更が必要になります。
+コントラクトの凍結と凍結解除には、いくつかの変更が必要です。
-- どのアドレスが凍結されているかを追跡するために、アドレスを[ブール値](https://en.wikipedia.org/wiki/Boolean_data_type)で[マッピング](https://www.tutorialspoint.com/solidity/solidity_mappings.htm)します。 すべての値の初期値はゼロです。これは、ブール値でfalseとして解釈されます。 デフォルトでは、アカウントを凍結しないため、このようにしています。
+- どのアドレスが凍結されているかを追跡するための、アドレスから[ブール値](https://en.wikipedia.org/wiki/Boolean_data_type)への[マッピング](https://www.tutorialspoint.com/solidity/solidity_mappings.htm)。 すべての値は最初はゼロで、ブール値の場合はfalseと解釈されます。 デフォルトではアカウントは凍結されていないので、これは望ましい動作です。
```solidity
mapping(address => bool) public frozenAccounts;
```
-- アカウントが凍結または解除されたときに、関係者に対して[イベント](https://www.tutorialspoint.com/solidity/solidity_events.htm)で通知します。 技術的観点では、アカウントの凍結および解除におけるアクションでは、イベントは必要ありません。しかし、オフチェーンのコードで、これらのイベントをリッスンして何が起こっているかわかると便利です。 関係者に対して何かが発生したときに、スマートコントラクトでイベントを発行することは、良いマナーであるとされています。
+- アカウントが凍結または凍結解除されたときに関係者に通知するための[イベント](https://www.tutorialspoint.com/solidity/solidity_events.htm)。 技術的には、これらのアクションにイベントは必須ではありませんが、オフチェーンのコードがこれらのイベントをリッスンして何が起こっているかを知るのに役立ちます。 他の誰かに関連する可能性のあることが起こったときに、スマートコントラクトがイベントを発行することは、良いマナーとされています。
- どのタイミングでアカウントの凍結または解除されたかを検索できるように、イベントにインデックスを付けています。
+ イベントにはインデックスが付けられるため、あるアカウントが凍結または凍結解除されたすべての回を検索できるようになります。
```solidity
- // When accounts are frozen or unfrozen
+ // アカウントが凍結または凍結解除されたとき
event AccountFrozen(address indexed _addr);
event AccountThawed(address indexed _addr);
```
-- アカウントを凍結および解凍するための関数。 これらの2つの関数は、ほぼ同一であるため凍結する関数についてのみ説明します。
+- アカウントを凍結および凍結解除するための関数。 これらの2つの関数はほぼ同一なので、ここでは凍結関数についてのみ説明します。
```solidity
function freezeAccount(address addr)
@@ -165,27 +167,27 @@ OpenZeppelinでは、管理者アクセスを可能にする次の2つのメカ
onlyOwner
```
- [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm)が付けられた関数では、他のスマートコントラクトまたはトランザクションから直接呼び出すことができます。
+ [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm)とマークされた関数は、他のスマートコントラクトから、またはトランザクションによって直接呼び出すことができます。
```solidity
{
- require(!frozenAccounts[addr], "Account already frozen");
+ require(!frozenAccounts[addr], "アカウントはすでに凍結されています");
frozenAccounts[addr] = true;
emit AccountFrozen(addr);
} // freezeAccount
```
- アカウントがすでに凍結されている場合は、処理を取消します。 それ以外の場合は、凍結してイベントを`emit`します。
+ アカウントがすでに凍結されている場合は、リバートします。 そうでなければ、アカウントを凍結し、イベントを`emit`します。
-- `_beforeTokenTransfer`を凍結されたアカウントから資金が移動されないよう変更します。 凍結されたアカウントへの送金は、引き続き可能であることに注意してください。
+- 凍結されたアカウントから資金が移動されないように`_beforeTokenTransfer`を変更します。 凍結されたアカウントへの送金は、引き続き可能であることに注意してください。
```solidity
- require(!frozenAccounts[from], "The account is frozen");
+ require(!frozenAccounts[from], "アカウントは凍結されています");
```
### アセットのクリーンアップ {#asset-cleanup}
-コントラクト自体が保持しているERC-20トークンを解放するには、それに属しているトークンコントラクトの関数である[`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer)または[`approve`](https://eips.ethereum.org/EIPS/eip-20#approve)を呼び出す必要があります。 この場合、Allowanceで無駄にガスを消費するのはもったいないため、直接送金 (transfer) の方がよいでしょう。
+このコントラクトが保有するERC-20トークンを解放するには、それらが属するトークンコントラクトの[`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer)または[`approve`](https://eips.ethereum.org/EIPS/eip-20#approve)のいずれかの関数を呼び出す必要があります。 この場合、Allowanceでガスを無駄にする意味はないので、直接送金した方が良いでしょう。
```solidity
function cleanupERC20(
@@ -198,7 +200,7 @@ OpenZeppelinでは、管理者アクセスを可能にする次の2つのメカ
IERC20 token = IERC20(erc20);
```
-これは、アドレスがトークンを受け取った場合に、コントラクトにオブジェクトを作成するための構文です。 ERC20トークンがソースコード (4行目を参照) の一部として定義されており、OpenZeppelinのERC-20コントラクトのインターフェースである[IERC20の定義](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)がそのファイルに含まれているためこれが可能です。
+これは、アドレスを受け取ったときにコントラクトのオブジェクトを作成するための構文です。 これが可能なのは、ソースコードの一部としてERC20トークンの定義があり(4行目を参照)、そのファイルにはOpenZeppelinのERC-20コントラクトのインターフェースである[IERC20の定義](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)が含まれているためです。
```solidity
uint balance = token.balanceOf(address(this));
@@ -206,8 +208,10 @@ OpenZeppelinでは、管理者アクセスを可能にする次の2つのメカ
}
```
-上記は、すべてのトークンをクリーンアップする関数です。 このプロセスを自動化することで、ユーザーから手動で残高を取得するよりも効率化できます。
+これはクリーンアップ関数なので、トークンを残さないようにします。 ユーザーから手動で残高を取得する代わりに、プロセスを自動化した方が良いでしょう。
+
+## 結論 {#conclusion}
-## まとめ {#conclusion}
+これは完璧な解決策ではありません。「ユーザーの間違い」によって発生する問題に完璧な解決策はないのです。 しかし、この種のチェックを使用することで、少なくともいくつかの間違いを防ぐことができます。 アカウントを凍結する機能は危険を伴いますが、ハッカーから盗まれた資金を奪うことで、特定のハッキングによる被害を限定するために使用できます。
-「ユーザーの間違い」によって発生する問題に完璧な解決策はないため、これらは完全な解決策ではありません。 しかしながら、この記事のようなチェックをすることで、少なくともいくつかのミスを防止できます。 アカウントの凍結機能は危険を伴うものの、ハッカーが資金を盗むことを防ぎ、ハッキングによる被害を特定の範囲内におさめるために使うことができます。
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
diff --git a/public/content/translations/ja/developers/tutorials/ethereum-for-web2-auth/index.md b/public/content/translations/ja/developers/tutorials/ethereum-for-web2-auth/index.md
new file mode 100644
index 00000000000..d5bb7ed4da2
--- /dev/null
+++ b/public/content/translations/ja/developers/tutorials/ethereum-for-web2-auth/index.md
@@ -0,0 +1,886 @@
+---
+title: "Web2認証にイーサリアムを使用する"
+description: "このチュートリアルを読むことで、デベロッパーはイーサリアムログイン (Web3) をSAMLログインと統合できるようになります。SAMLは、Web2でシングルサインオンやその他の関連サービスを提供するために使用される標準です。 これにより、Web2リソースへのアクセスをイーサリアム署名を通じて認証できるようになり、ユーザー属性はアテステーションから取得されます。"
+author: Ori Pomerantz
+tags: [ "web2", "認証", "eas" ]
+skill: beginner
+lang: ja
+published: 2025-04-30
+---
+
+## はじめに
+
+[SAML](https://www.onelogin.com/learn/saml)は、Web2で[IDプロバイダー (IdP)](https://en.wikipedia.org/wiki/Identity_provider#SAML_identity_provider) が[サービスプロバイダー (SP)](https://en.wikipedia.org/wiki/Service_provider_\(SAML\))にユーザー情報を提供するために使用される標準です。
+
+このチュートリアルでは、イーサリアム署名をSAMLと統合し、まだイーサリアムをネイティブにサポートしていないWeb2サービスに対して、ユーザーがイーサリアムウォレットを使用して認証できるようにする方法を学びます。
+
+このチュートリアルは、2つの異なる読者を対象に書かれていることに注意してください。
+
+- イーサリアムを理解していて、SAMLを学ぶ必要があるイーサリアム関係者
+- SAMLとWeb2認証を理解していて、イーサリアムを学ぶ必要があるWeb2関係者
+
+そのため、すでにご存知の入門的な内容が多く含まれています。 適宜読み飛ばしてください。
+
+### イーサリアム関係者向けのSAML
+
+SAMLは中央集権型のプロトコルです。 サービスプロバイダー (SP) は、IDプロバイダー (IdP) との間、またはそのIdPの証明書に署名した[証明書認証局](https://www.ssl.com/article/what-is-a-certificate-authority-ca/)との間に、既存の信頼関係がある場合にのみ、IdPからのアサーション (「これは私のユーザーJohnで、A、B、Cを行う権限を持つべきである」など) を受け入れます。
+
+たとえば、SPは企業に旅行サービスを提供する旅行代理店、IdPは企業の社内ウェブサイトであるとします。 従業員が出張の予約をする際、旅行代理店は、実際に旅行の予約を許可する前に、従業員を会社の認証に送ります。
+
+
+
+これが、ブラウザ、SP、IdPの3つのエンティティがアクセスを交渉する方法です。 SPは、ブラウザを使用しているユーザーについて事前に何も知る必要はなく、IdPを信頼するだけで済みます。
+
+### SAML関係者向けのイーサリアム
+
+イーサリアムは分散型システムです。
+
+
+
+ユーザーは秘密鍵を持っています (通常はブラウザ拡張機能に保存されています)。 秘密鍵から公開鍵を導出し、そこから20バイトのアドレスを導出できます。 ユーザーがシステムにログインする必要がある場合、ノンス (1回限りの値) を持つメッセージに署名するよう要求されます。 サーバーは、署名がそのアドレスによって作成されたことを検証できます。
+
+
+
+署名はイーサリアムアドレスを検証するだけです。 他のユーザー属性を取得するには、通常[アテステーション](https://attest.org/)を使用します。 アテステーションには通常、以下のフィールドがあります。
+
+- **証明者**、アテステーションを行ったアドレス
+- **受取人**、アテステーションが適用されるアドレス
+- **データ**、名前や権限など、証明されるデータ
+- **スキーマ**、データの解釈に使用されるスキーマのID。
+
+イーサリアムの分散型の性質により、どのユーザーでもアテステーションを作成できます。 どのアテステーションが信頼できるかを判断するには、証明者のIDが重要です。
+
+## セットアップ
+
+最初のステップは、SAML SPとSAML IdPが互いに通信できるようにすることです。
+
+1. ソフトウェアをダウンロードします。 この記事のサンプルソフトウェアは、[github](https://github.com/qbzzt/250420-saml-ethereum)にあります。 異なるステージは異なるブランチに保存されています。このステージでは `saml-only` を使用します。
+
+ ```sh
+ git clone https://github.com/qbzzt/250420-saml-ethereum -b saml-only
+ cd 250420-saml-ethereum
+ pnpm install
+ ```
+
+2. 自己署名証明書でキーを作成します。 これは、キーがそれ自体の証明書認証局であることを意味し、サービスプロバイダーに手動でインポートする必要があります。 詳細については、[OpenSSLのドキュメント](https://docs.openssl.org/master/man1/openssl-req/)を参照してください。
+
+ ```sh
+ mkdir keys
+ cd keys
+ openssl req -new -x509 -days 365 -nodes -sha256 -out saml-sp.crt -keyout saml-sp.pem -subj /CN=sp/
+ openssl req -new -x509 -days 365 -nodes -sha256 -out saml-idp.crt -keyout saml-idp.pem -subj /CN=idp/
+ cd ..
+ ```
+
+3. サーバー (SPとIdPの両方) を起動します。
+
+ ```sh
+ pnpm start
+ ```
+
+4. URL [http://localhost:3000/](http://localhost:3000/)でSPにアクセスし、ボタンをクリックしてIdP (ポート3001) にリダイレクトします。
+
+5. IdPにメールアドレスを入力し、**サービスプロバイダーにログイン**をクリックします。 サービスプロバイダー (ポート3000) にリダイレクトされ、メールアドレスで認識されていることを確認します。
+
+### 詳細な説明
+
+ステップバイステップで起こることは次のとおりです。
+
+
+
+#### src/config.mts
+
+このファイルには、IDプロバイダーとサービスプロバイダー両方の設定が含まれています。 通常、これら2つは異なるエンティティですが、ここでは簡潔にするためにコードを共有します。
+
+```typescript
+const fs = await import("fs")
+
+const protocol="http"
+```
+
+今のところテストだけなので、HTTPを使用して問題ありません。
+
+```typescript
+export const spCert = fs.readFileSync("keys/saml-sp.crt").toString()
+export const idpCert = fs.readFileSync("keys/saml-idp.crt").toString()
+```
+
+通常は両方のコンポーネントで利用可能な公開鍵 (直接信頼されるか、信頼された証明書認証局によって署名される) を読み取ります。
+
+```typescript
+export const spPort = 3000
+export const spHostname = "localhost"
+export const spDir = "sp"
+
+export const idpPort = 3001
+export const idpHostname = "localhost"
+export const idpDir = "idp"
+
+export const spUrl = `${protocol}://${spHostname}:${spPort}/${spDir}`
+export const idpUrl = `${protocol}://${idpHostname}:${idpPort}/${idpDir}`
+```
+
+両コンポーネントのURLです。
+
+```typescript
+export const spPublicData = {
+```
+
+サービスプロバイダーの公開データです。
+
+```typescript
+ entityID: `${spUrl}/metadata`,
+```
+
+慣例的に、SAMLでは`entityID`はエンティティのメタデータが利用可能なURLです。 このメタデータはここの公開データに対応しますが、XML形式である点が異なります。
+
+```typescript
+ wantAssertionsSigned: true,
+ authnRequestsSigned: false,
+ signingCert: spCert,
+ allowCreate: true,
+ assertionConsumerService: [{
+ Binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
+ Location: `${spUrl}/assertion`,
+ }]
+ }
+```
+
+私たちの目的にとって最も重要な定義は `assertionConsumerServer` です。 これは、サービスプロバイダーに何かをアサートする (例えば、「この情報を送信するユーザーは somebody@example.com です」) ためには、URL `http://localhost:3000/sp/assertion` に [HTTP POST](https://www.w3schools.com/tags/ref_httpmethods.asp) を使用する必要があることを意味します。
+
+```typescript
+export const idpPublicData = {
+ entityID: `${idpUrl}/metadata`,
+ signingCert: idpCert,
+ wantAuthnRequestsSigned: false,
+ singleSignOnService: [{
+ Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
+ Location: `${idpUrl}/login`
+ }],
+ singleLogoutService: [{
+ Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
+ Location: `${idpUrl}/logout`
+ }],
+ }
+```
+
+IDプロバイダーの公開データも同様です。 これは、ユーザーをログインさせるには `http://localhost:3001/idp/login` にPOSTし、ユーザーをログアウトさせるには `http://localhost:3001/idp/logout` にPOSTすることを指定しています。
+
+#### src/sp.mts
+
+これはサービスプロバイダーを実装するコードです。
+
+```typescript
+import * as config from "./config.mts"
+const fs = await import("fs")
+const saml = await import("samlify")
+```
+
+SAMLを実装するために [`samlify`](https://www.npmjs.com/package/samlify) ライブラリを使用します。
+
+```typescript
+import * as validator from "@authenio/samlify-node-xmllint"
+saml.setSchemaValidator(validator)
+```
+
+`samlify` ライブラリは、XMLが正しいこと、期待される公開鍵で署名されていることなどを検証するパッケージを必要とします。 この目的のために [`@authenio/samlify-node-xmllint`](https://www.npmjs.com/package/@authenio/samlify-node-xmllint) を使用します。
+
+```typescript
+const express = (await import("express")).default
+const spRouter = express.Router()
+const app = express()
+```
+
+[`express`](https://expressjs.com/)の [`Router`](https://expressjs.com/en/5x/api.html#router)は、ウェブサイト内にマウントできる「ミニウェブサイト」です。 この場合、すべてのサービスプロバイダーの定義をグループ化するために使用します。
+
+```typescript
+const spPrivateKey = fs.readFileSync("keys/saml-sp.pem").toString()
+
+const sp = saml.ServiceProvider({
+ privateKey: spPrivateKey,
+ ...config.spPublicData
+})
+```
+
+サービスプロバイダー自身の表現は、すべての公開データと、情報に署名するために使用する秘密鍵です。
+
+```typescript
+const idp = saml.IdentityProvider(config.idpPublicData);
+```
+
+公開データには、サービスプロバイダーがIDプロバイダーについて知る必要があるすべてのものが含まれています。
+
+```typescript
+spRouter.get(`/metadata`,
+ (req, res) => res.header("Content-Type", "text/xml").send(sp.getMetadata())
+)
+```
+
+他のSAMLコンポーネントとの相互運用性を確保するため、サービスプロバイダーとIDプロバイダーは、公開データ (メタデータと呼ばれる) をXML形式で `/metadata` にて利用可能にする必要があります。
+
+```typescript
+spRouter.post(`/assertion`,
+```
+
+これは、ブラウザが自身を識別するためにアクセスするページです。 アサーションにはユーザー識別子 (ここではメールアドレスを使用) が含まれ、追加の属性を含めることもできます。 これは、上記のシーケンス図のステップ7のハンドラです。
+
+```typescript
+ async (req, res) => {
+ // console.log(`SAML response:\n${Buffer.from(req.body.SAMLResponse, 'base64').toString('utf-8')}`)
+```
+
+コメントアウトされたコマンドを使用して、アサーションで提供されるXMLデータを確認できます。 これは[base64でエンコード](https://en.wikipedia.org/wiki/Base64)されています。
+
+```typescript
+ try {
+ const loginResponse = await sp.parseLoginResponse(idp, 'post', req);
+```
+
+IDサーバーからのログインリクエストを解析します。
+
+```typescript
+ res.send(`
+
+
+ Hello ${loginResponse.extract.nameID}
+
+
+ `)
+ res.send();
+```
+
+ユーザーにログインが成功したことを示すために、HTMLレスポンスを送信します。
+
+```typescript
+ } catch (err) {
+ console.error('Error processing SAML response:', err);
+ res.status(400).send('SAML authentication failed');
+ }
+ }
+)
+```
+
+失敗した場合は、ユーザーに通知します。
+
+```typescript
+spRouter.get('/login',
+```
+
+ブラウザがこのページを取得しようとするときに、ログインリクエストを作成します。 これは、上記のシーケンス図のステップ1のハンドラです。
+
+```typescript
+ async (req, res) => {
+ const loginRequest = await sp.createLoginRequest(idp, "post")
+```
+
+ログインリクエストをPOSTするための情報を取得します。
+
+```typescript
+ res.send(`
+
+
+
+```
+
+このページは、フォーム (下記参照) を自動的に送信します。 これにより、ユーザーはリダイレクトされるために何もする必要がありません。 これは、上記のシーケンス図のステップ2です。
+
+```typescript
+
+
+
+ `)
+ }
+)
+
+app.use(express.urlencoded({extended: true}))
+```
+
+[このミドルウェア](https://expressjs.com/en/5x/api.html#express.urlencoded) は [HTTPリクエスト](https://www.tutorialspoint.com/http/http_requests.htm)のボディを読み取ります。 ほとんどのリクエストはそれを必要としないため、Expressはデフォルトでそれを無視します。 POSTはボディを使用するため、これが必要です。
+
+```typescript
+app.use(`/${config.spDir}`, spRouter)
+```
+
+サービスプロバイダーディレクトリ (`/sp`) にルーターをマウントします。
+
+```typescript
+app.get("/", (req, res) => {
+ res.send(`
+
+
+
+
+
+ `)
+})
+```
+
+ブラウザがルートディレクトリを取得しようとした場合は、ログインページへのリンクを提供します。
+
+```typescript
+app.listen(config.spPort, () => {
+ console.log(`service provider is running on http://${config.spHostname}:${config.spPort}`)
+})
+```
+
+このExpressアプリケーションで `spPort` をリッスンします。
+
+#### src/idp.mts
+
+これはIDプロバイダーです。 これはサービスプロバイダーと非常によく似ており、以下の説明は異なる部分についてです。
+
+```typescript
+const xmlParser = new (await import("fast-xml-parser")).XMLParser(
+ {
+ ignoreAttributes: false, // Preserve attributes
+ attributeNamePrefix: "@_", // Prefix for attributes
+ }
+)
+```
+
+サービスプロバイダーから受け取ったXMLリクエストを読み取り、理解する必要があります。
+
+```typescript
+const getLoginPage = requestId => `
+```
+
+この関数は、上記のシーケンス図のステップ4で返される、自動送信フォーム付きのページを作成します。
+
+```typescript
+
+
+ ログインページ
+
+
+ ログインページ
+
+
+
+
+const idpRouter = express.Router()
+
+idpRouter.post("/loginSubmitted", async (req, res) => {
+ const loginResponse = await idp.createLoginResponse(
+```
+
+これは、上記のシーケンス図のステップ5のハンドラです。 [`idp.createLoginResponse`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L73-L125)はログインレスポンスを作成します。
+
+```typescript
+ sp,
+ {
+ authnContextClassRef: 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport',
+ audience: sp.entityID,
+```
+
+オーディエンスはサービスプロバイダーです。
+
+```typescript
+ extract: {
+ request: {
+ id: req.body.requestId
+ }
+ },
+```
+
+リクエストから抽出された情報です。 リクエストで重要なパラメータはrequestIdで、これによりサービスプロバイダーはリクエストとそのレスポンスを一致させることができます。
+
+```typescript
+ signingKey: { privateKey: idpPrivateKey, publicKey: config.idpCert } // Ensure signing
+```
+
+レスポンスに署名するためのデータを持つために `signingKey` が必要です。 サービスプロバイダーは署名されていないリクエストを信頼しません。
+
+```typescript
+ },
+ "post",
+ {
+ email: req.body.email
+```
+
+これは、サービスプロバイダーに送り返すユーザー情報を持つフィールドです。
+
+```typescript
+ }
+ );
+
+ res.send(`
+
+
+
+
+
+
+
+ `)
+})
+```
+
+ここでも、自動送信フォームを使用します。 これは、上記のシーケンス図のステップ6です。
+
+```typescript
+
+// ログインリクエスト用のIdPエンドポイント
+idpRouter.post(`/login`,
+```
+
+これはサービスプロバイダーからログインリクエストを受け取るエンドポイントです。 これは、上記のシーケンス図のステップ3のハンドラです。
+
+```typescript
+ async (req, res) => {
+ try {
+ // parseLoginRequestが動作しなかったための回避策
+ // const loginRequest = await idp.parseLoginRequest(sp, 'post', req)
+ const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8'))
+ res.send(getLoginPage(samlRequest["samlp:AuthnRequest"]["@_ID"]))
+```
+
+[`idp.parseLoginRequest`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L127-L144)を使用して認証リクエストのIDを読み取ることができるはずです。 しかし、動作させることができず、それに多くの時間を費やす価値もなかったので、[汎用XMLパーサー](https://www.npmjs.com/package/fast-xml-parser)を使用します。 必要な情報は、XMLのトップレベルにある `` タグ内の `ID` 属性です。
+
+## イーサリアム署名の使用
+
+ユーザーIDをサービスプロバイダーに送信できるようになったので、次のステップは信頼できる方法でユーザーIDを取得することです。 Viemを使用すると、ウォレットにユーザーアドレスを尋ねるだけで済みますが、これはブラウザに情報を要求することを意味します。 私たちはブラウザを制御していないため、そこから得られる応答を自動的に信頼することはできません。
+
+代わりに、IdPはブラウザに署名するための文字列を送信します。 ブラウザのウォレットがこの文字列に署名すれば、それが本当にそのアドレスであること (つまり、そのアドレスに対応する秘密鍵を知っていること) を意味します。
+
+これを実際に確認するには、既存のIdPとSPを停止し、次のコマンドを実行します。
+
+```sh
+git checkout eth-signatures
+pnpm install
+pnpm start
+```
+
+次に、[SP](http://localhost:3000)にアクセスし、指示に従ってください。
+
+この時点では、イーサリアムアドレスからメールアドレスを取得する方法がわからないため、代わりに `<イーサリアムアドレス>@bad.email.address` をSPに報告します。
+
+### 詳細な説明
+
+変更点は、前の図のステップ4-5にあります。
+
+
+
+変更したファイルは `idp.mts` だけです。 以下が変更された部分です。
+
+```typescript
+import { v4 as uuidv4 } from 'uuid'
+import { verifyMessage } from 'viem'
+```
+
+これら2つの追加ライブラリが必要です。 [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce)値を作成するために [`uuid`](https://www.npmjs.com/package/uuid) を使用します。 値自体は問題ではなく、一度しか使用されないという事実が重要です。
+
+[`viem`](https://viem.sh/) ライブラリを使用すると、イーサリアムの定義を使用できます。 ここでは、署名が実際に有効であることを検証するためにこれが必要です。
+
+```typescript
+const loginPrompt = "サービスプロバイダーにアクセスするには、このノンスに署名してください: "
+```
+
+ウォレットは、ユーザーにメッセージに署名する許可を求めます。 ノンスだけのメッセージはユーザーを混乱させる可能性があるため、このプロンプトを含めます。
+
+```typescript
+// ここにrequestIDを保持する
+let nonces = {}
+```
+
+応答するためには、リクエスト情報が必要です。 リクエストと一緒に送信し (ステップ4)、それを受け取る (ステップ5) こともできます。 しかし、潜在的に敵対的なユーザーの制御下にあるブラウザから得られる情報は信頼できません。 したがって、ノンスをキーとしてここに保存する方が良いでしょう。
+
+簡潔さのために、ここでは変数としてこれを行っていることに注意してください。 ただし、これにはいくつかの欠点があります。
+
+- サービス拒否攻撃に対して脆弱です。 悪意のあるユーザーが複数回ログオンを試み、メモリを使い果たす可能性があります。
+- IdPプロセスを再起動する必要がある場合、既存の値を失います。
+- 各プロセスが独自の変数を持つため、複数のプロセス間で負荷分散を行うことはできません。
+
+本番システムでは、データベースを使用し、何らかの有効期限メカニズムを実装します。
+
+```typescript
+const getSignaturePage = requestId => {
+ const nonce = uuidv4()
+ nonces[nonce] = requestId
+```
+
+ノンスを作成し、後で使用するために `requestId` を保存します。
+
+```typescript
+ return `
+
+
+
+
+
+ 署名してください
+
+
+
+
+
+`
+}
+```
+
+残りは標準のHTMLです。
+
+```typescript
+idpRouter.get("/signature/:nonce/:account/:signature", async (req, res) => {
+```
+
+これはシーケンス図のステップ5のハンドラです。
+
+```typescript
+ const requestId = nonces[req.params.nonce]
+ if (requestId === undefined) {
+ res.send("Bad nonce")
+ return ;
+ }
+
+ nonces[req.params.nonce] = undefined
+```
+
+リクエストIDを取得し、再利用されないように `nonces` からノンスを削除します。
+
+```typescript
+ try {
+```
+
+署名が無効になる方法が非常に多いため、これを `try ...` でラップします。 catch`ブロックで、スローされたエラーをキャッチします。
+
+```typescript
+ const validSignature = await verifyMessage({
+ address: req.params.account,
+ message: `${loginPrompt}${req.params.nonce}`,
+ signature: req.params.signature
+ })
+```
+
+シーケンス図のステップ5.5を実装するには、[`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage#verifymessage) を使用します。
+
+```typescript
+ if (!validSignature)
+ throw("Bad signature")
+ } catch (err) {
+ res.send("Error:" + err)
+ return ;
+ }
+```
+
+ハンドラの残りの部分は、1つの小さな変更を除いて、以前に `/loginSubmitted` ハンドラで行ったことと同等です。
+
+```typescript
+ const loginResponse = await idp.createLoginResponse(
+ .
+ .
+ .
+ {
+ email: req.params.account + "@bad.email.address"
+ }
+ );
+```
+
+実際のメールアドレスは持っていないので (次のセクションで取得します)、今のところはイーサリアムアドレスを返し、それがメールアドレスではないことを明確にマークします。
+
+```typescript
+// ログインリクエスト用のIdPエンドポイント
+idpRouter.post(`/login`,
+ async (req, res) => {
+ try {
+ // parseLoginRequestが動作しなかったための回避策
+ // const loginRequest = await idp.parseLoginRequest(sp, 'post', req)
+ const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8'))
+ res.send(getSignaturePage(samlRequest["samlp:AuthnRequest"]["@_ID"]))
+ } catch (err) {
+ console.error('SAMLレスポンスの処理中にエラーが発生しました:', err);
+ res.status(400).send('SAML認証に失敗しました');
+ }
+ }
+)
+```
+
+ステップ3のハンドラでは、`getLoginPage` の代わりに `getSignaturePage` を使用します。
+
+## メールアドレスの取得
+
+次のステップは、サービスプロバイダーによって要求された識別子であるメールアドレスを取得することです。 そのためには、[Ethereum Attestation Service (EAS)](https://attest.org/) を使用します。
+
+アテステーションを取得する最も簡単な方法は、[GraphQL API](https://docs.attest.org/docs/developer-tools/api)を使用することです。 このクエリを使用します。
+
+```
+query GetAttestationsByRecipient {
+ attestations(
+ where: {
+ recipient: { equals: "${getAddress(ethAddr)}" }
+ schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" }
+ }
+ take: 1
+ ) {
+ data
+ id
+ attester
+ }
+}
+```
+
+この[`schemaId`](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977)には、メールアドレスのみが含まれます。 このクエリは、このスキーマのアテステーションを要求します。 アテステーションのサブジェクトは `recipient` と呼ばれます。 これは常にイーサリアムアドレスです。
+
+警告:ここでアテステーションを取得する方法には、2つのセキュリティ上の問題があります。
+
+- 中央集権的なコンポーネントであるAPIエンドポイント `https://optimism.easscan.org/graphql` にアクセスしています。 `id`属性を取得し、オンチェーンでルックアップしてアテステーションが本物であることを確認できますが、APIエンドポイントは、アテステーションについて通知しないことで、依然としてアテステーションを検閲できます。
+
+ この問題は解決不可能ではありません。独自のGraphQLエンドポイントを実行し、チェーンログからアテステーションを取得できますが、私たちの目的には過剰です。
+
+- 私たちは証明者のIDを見ていません。 誰でも偽の情報を私たちに与えることができます。 実際の環境では、信頼できる証明者のセットを持ち、彼らのアテステーションのみを参照します。
+
+これを実際に確認するには、既存のIdPとSPを停止し、次のコマンドを実行します。
+
+```sh
+git checkout email-address
+pnpm install
+pnpm start
+```
+
+次に、メールアドレスを入力します。 これを行うには2つの方法があります。
+
+- 秘密鍵を使用してウォレットをインポートし、テスト用の秘密鍵 `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80` を使用します。
+
+- 自分のメールアドレスにアテステーションを追加します。
+
+ 1. アテステーションエクスプローラーの[スキーマ](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977)に移動します。
+
+ 2. **スキーマで証明**をクリックします。
+
+ 3. 受信者としてイーサリアムアドレスを入力し、メールアドレスとしてメールアドレスを入力し、**オンチェーン**を選択します。 次に、**アテステーションを作成**をクリックします。
+
+ 4. ウォレットでトランザクションを承認します。 ガスを支払うために、[Optimism Blockchain](https://app.optimism.io/bridge/deposit)にETHが必要です。
+
+どちらの場合も、これを行った後、[http://localhost:3000](http://localhost:3000) にアクセスして指示に従ってください。 テスト用の秘密鍵をインポートした場合、受け取るメールは `test_addr_0@example.com` です。 独自のアドレスを使用した場合は、証明した内容になります。
+
+### 詳細な説明
+
+
+
+新しいステップはGraphQL通信、ステップ5.6と5.7です。
+
+再度、`idp.mts`の変更部分を示します。
+
+```typescript
+import { GraphQLClient } from 'graphql-request'
+import { SchemaEncoder } from '@ethereum-attestation-service/eas-sdk'
+```
+
+必要なライブラリをインポートします。
+
+```typescript
+const graphqlEndpointUrl = "https://optimism.easscan.org/graphql"
+```
+
+[各ブロックチェーンに個別のエンドポイント](https://docs.attest.org/docs/developer-tools/api)があります。
+
+```typescript
+const graphqlClient = new GraphQLClient(graphqlEndpointUrl, { fetch })
+```
+
+エンドポイントのクエリに使用できる新しい`GraphQLClient`クライアントを作成します。
+
+```typescript
+const graphqlSchema = 'string emailAddress'
+const graphqlEncoder = new SchemaEncoder(graphqlSchema)
+```
+
+GraphQLは、バイトを持つ不透明なデータオブジェクトのみを提供します。 それを理解するためにはスキーマが必要です。
+
+```typescript
+const ethereumAddressToEmail = async ethAddr => {
+```
+
+イーサリアムアドレスからメールアドレスを取得する関数です。
+
+```typescript
+ const query = `
+ query GetAttestationsByRecipient {
+```
+
+これはGraphQLクエリです。
+
+```typescript
+ アテステーション(
+```
+
+アテステーションを探しています。
+
+```typescript
+ where: {
+ recipient: { equals: "${getAddress(ethAddr)}" }
+ schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" }
+ }
+```
+
+必要なアテステーションは、私たちのスキーマにあり、受信者が`getAddress(ethAddr)`であるものです。 [`getAddress`](https://viem.sh/docs/utilities/getAddress#getaddress)関数は、アドレスが正しい[チェックサム](https://github.com/ethereum/ercs/blob/master/ERCS/erc-55.md)を持つことを保証します。 GraphQLは大文字と小文字を区別するため、これは必要です。 「0xBAD060A7」、「0xBad060A7」、および「0xbad060a7」は異なる値です。
+
+```typescript
+ take: 1
+```
+
+見つかったアテステーションの数に関係なく、最初のものだけが必要です。
+
+```typescript
+ ) {
+ data
+ id
+ attester
+ }
+ }`
+```
+
+受け取りたいフィールドです。
+
+- `attester`: アテステーションを送信したアドレス。 通常、これはアテステーションを信頼するかどうかを決定するために使用されます。
+- `id`: アテステーションID。 この値を使用して、[アテステーションをオンチェーンで読み取り](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000021?tab=read_proxy&source_address=0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088#0xa3112a64)、GraphQLクエリからの情報が正しいことを確認できます。
+- `data`: スキーマデータ (この場合はメールアドレス)。
+
+```typescript
+ const queryResult = await graphqlClient.request(query)
+
+ if (queryResult.attestations.length == 0)
+ return "no_address@available.is"
+```
+
+アテステーションがない場合は、明らかに不正であるが、サービスプロバイダーには有効に見える値を返します。
+
+```typescript
+ const attestationDataFields = graphqlEncoder.decodeData(queryResult.attestations[0].data)
+ return attestationDataFields[0].value.value
+}
+```
+
+値がある場合は、`decodeData`を使用してデータをデコードします。 提供されるメタデータは不要で、値自体のみが必要です。
+
+```typescript
+ const loginResponse = await idp.createLoginResponse(
+ sp,
+ {
+ .
+ .
+ .
+ },
+ "post",
+ {
+ email: await ethereumAddressToEmail(req.params.account)
+ }
+ );
+```
+
+新しい関数を使用してメールアドレスを取得します。
+
+## 分散化については?
+
+この構成では、イーサリアムとメールアドレスのマッピングに信頼できる証明者に依存している限り、ユーザーは他人になりすますことはできません。 しかし、私たちのIDプロバイダーは依然として中央集権的なコンポーネントです。 IDプロバイダーの秘密鍵を持っている人は誰でも、サービスプロバイダーに偽の情報を送信できます。
+
+[マルチパーティ計算 (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) を使用した解決策があるかもしれません。 将来のチュートリアルでそれについて書きたいと思っています。
+
+## まとめ
+
+イーサリアム署名のようなログオン標準の採用は、鶏が先か卵が先かの問題に直面します。 サービスプロバイダーは、可能な限り広い市場にアピールしたいと考えています。 ユーザーは、ログオン標準のサポートを心配することなく、サービスにアクセスできることを望んでいます。
+イーサリアムIdPなどのアダプターを作成することは、このハードルを乗り越えるのに役立ちます。
+
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
diff --git a/public/content/translations/ja/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/ja/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
index 119b5ca92b0..cd1a675c8e6 100644
--- a/public/content/translations/ja/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
+++ b/public/content/translations/ja/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md
@@ -1,13 +1,8 @@
---
-title: イーサリアム開発入門
+title: "イーサリアム開発入門"
description: "この文書は、はじめてイーサリアム開発を行う初心者用のガイドです。 APIエンドポイントの立ち上げ、コマンドライン・リクエストの作成、さらにweb3スクリプトの作成までをステップごとに説明します。 ブロックチェーンの開発経験は必要ありません!"
author: "Elan Halpern"
-tags:
- - "JavaScript"
- - "ethers.js"
- - "ノード"
- - "クエリ"
- - "Alchemy"
+tags: [ "JavaScript", "ethers.js", "ノード", "クエリ", "Alchemy" ]
skill: beginner
lang: ja
published: 2020-10-30
@@ -15,46 +10,46 @@ source: Medium
sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f
---
-
+
-この記事は、はじめてイーサリアム開発を行う初心者向けのガイドです。 このチュートリアルでは、[Alchemy](https://alchemyapi.io/)を使用します。Alchemyは、何百万人ものユーザーを持つ代表的なブロックチェーン開発者向けプラットフォームで、最も人気が高いブロックチェーンアプリ( Maker、0x、MyEtherWallet、Dharma、Kyberなど)のうち7割がAlchemyを使用しています。 Alchemyを使用するとイーサリアムチェーン上でAPIエンドポイントにアクセスできるため、トランザクションの読み書きが可能になります。
+この記事は、はじめてイーサリアム開発を行う初心者向けのガイドです。 このチュートリアルでは、[Alchemy](https://alchemyapi.io/)を使用します。これは、Maker、0x、MyEtherWallet、Dharma、Kyberといったトップクラスのブロックチェーンアプリの70%に採用され、数百万人のユーザーを支える、業界をリードするブロックチェーン開発者プラットフォームです。 Alchemyを使用するとイーサリアムチェーン上でAPIエンドポイントにアクセスできるため、トランザクションの読み書きが可能になります。
-このチュートリアルでは、Alchemyにサインアップする方法から、最初のweb3 スクリプトを作成するまでを学習します。 ブロックチェーンの開発経験は必要ありません!
+Alchemyへのサインアップから、最初のWeb3スクリプト作成までご案内します! ブロックチェーンの開発経験は必要ありません!
## 1. 無料のAlchemyアカウントにサインアップする {#sign-up-for-a-free-alchemy-account}
-Alchemyのアカウントを作成するのは簡単です。 [こちら](https://auth.alchemyapi.io/signup)から無料でサインアップしてください。
+Alchemyのアカウント作成は簡単です。[こちらから無料でサインアップしてください](https://auth.alchemy.com/)。
-## 2. Alchemy アプリを作成する {#create-an-alchemy-app}
+## 2. Alchemyアプリを作成する {#create-an-alchemy-app}
イーサリアムチェーンと通信し、Alchemy製品を使用するには、あなたのリクエストを認証するためのAPIキーが必要になります。
-APIキーは、[ダッシュボード](http://dashboard.alchemyapi.io/)で作成できます。 新規キーを作成するには、以下の手順で「Create App」に移動します。
+APIキーは[ダッシュボードから作成](https://dashboard.alchemy.com/)できます。 新しいキーを作成するには、以下のように「Create App」に移動してください:
-ダッシュボードの表示を許可していただいた[_ShapeShift_](https://shapeshift.com/) _に感謝します!_
+_ダッシュボードの表示を許可していただいた[_ShapeShift_](https://shapeshift.com/)に、心より感謝申し上げます!_
-
+
-「Create App」の下にある詳細情報に記入して、新規キーを取得してください。 ここでは、あなたが以前に作成したアプリや、あなたのチームが作成したアプリも確認できます。 どのアプリについても、「View Key(キーを表示)」をクリックすると既存のキーを取得できます。
+「Create App」の下にある詳細情報に記入して、新しいキーを取得してください。 ここでは、あなたが以前に作成したアプリや、あなたのチームが作成したアプリも確認できます。 どのアプリについても、「View Key」をクリックすると既存のキーを取得できます。
-
+
-あるいは、カーソルを「Apps(アプリ)」の部分に移動させ、希望するアプリを選択する方法でも既存のAPIキーを取得することができます。 ここでは、「View Key(キーを表示)」できる他、「Edit App(アプリを編集)」して、特定のドメインをホワイトリストに追加したり、開発者ツールを参照したり、アナリティクスを確認することができます。
+「Apps」にカーソルを合わせていずれかを選択することでも、既存のAPIキーを取得できます。 ここでは「View Key」の表示に加え、「Edit App」で特定のドメインをホワイトリストに登録したり、複数の開発者ツールを閲覧したり、アナリティクスを確認したりすることができます。
-
+
-## 3. コマンドラインでリクエストを作成する {#make-a-request-from-the-command-line}
+## 3. コマンドラインからリクエストを行う {#make-a-request-from-the-command-line}
-JSON-RPCとcurlを使用して、Alchemy経由でイーサリアムブロックチェーンとのやり取りを行います。
+JSON-RPCとcurlを使用して、Alchemy経由でイーサリアムブロックチェーンとやり取りをします。
-マニュアルでリクエストを作成する場合は、`JSON-RPC`の`POST`リクエストを使ってやりとりすることをお勧めします。 `Content-Type: application/json`のヘッダーと、クエリの`POST`本文に、以下のフィールドを入力してください:
+手動リクエストの場合は、`POST`リクエストを介して`JSON-RPC`とやり取りすることをお勧めします。 `Content-Type: application/json`ヘッダーと、以下のフィールドを含むクエリを`POST`ボディとして渡すだけです:
-- `jsonrpc`:JSON-RPC のバージョン - 現在対応しているのは バージョン`2.0` のみです。
-- `method`:ETH APIメソッド。 [APIリファレンスを参照してください。](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc)
+- `jsonrpc`: JSON-RPCのバージョン — 現在は`2.0`のみがサポートされています。
+- `method`: ETH APIメソッド。 [APIリファレンスを参照](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc)
- `params`: メソッドに渡すパラメータのリストです。
-- `id`: このリクエストのIDです。 この値は応答によって返されるため、どのリクエストに対する応答なのかを追跡できます。
+- `id`: リクエストのIDです。 この値はレスポンスによって返されるため、どのリクエストに対するレスポンスなのかを追跡できます。
-以下の例は、コマンドラインから現在のガス代の情報を取得するコードです。
+以下は、コマンドラインから現在のガス価格を取得するために実行できる一例です:
```bash
curl https://eth-mainnet.alchemyapi.io/v2/demo \
@@ -63,37 +58,37 @@ curl https://eth-mainnet.alchemyapi.io/v2/demo \
-d '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}'
```
-_**注意:** [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo)は、`https://eth-mainnet.alchemyapi.io/v2/**your-api-key` など、あなた自身のAPIキーと置き換えてください。_
+_**注:** [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo) を、ご自身のAPIキー `https://eth-mainnet.alchemyapi.io/v2/**your-api-key` に置き換えてください。_
-**出力:**
+**結果:**
```json
{ "id": 73,"jsonrpc": "2.0","result": "0x09184e72a000" // 10000000000000 }
```
-## 4. Web3 クライアントを設定する {#set-up-your-web3-client}
+## 4. Web3クライアントのセットアップ {#set-up-your-web3-client}
-**すでにクライアントをインストール済みの場合は、** 現在のノードプロバイダーのURLを、APIキーを含むAlchemyのURL( `"https://eth-mainnet.alchemyapi.io/v2/your-api-key"`など)に変更します。
+**既存のクライアントをお持ちの場合:** 現在のノードプロバイダーのURLを、ご自身のAPIキーを含むAlchemyのURL `“https://eth-mainnet.alchemyapi.io/v2/your-api-key\"` に変更してください。
-**_注意:_** 以下のスクリプトは、 コマンドラインで実行するのではなく、**ノードコンテキスト**または**ファイルに保存した形で**実行する必要があります。 Nodeまたはnpmがインストールされていない場合は、[Mac用設定ガイド](https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs) をご覧ください。
+**_注:_** 以下のスクリプトは、コマンドラインから実行するのではなく、**nodeコンテキスト**で実行するか、**ファイルに保存する**必要があります。 まだNodeまたはnpmをインストールしていない場合は、こちらの[Mac用クイックセットアップガイド](https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs)をご覧ください。
-Alchemyと統合可能な[Web3ライブラリ](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries)は無数に存在しますが、このチュートリアルでは、Alchemyとシームレスに動作するように構築・設定されたweb3.jsの完全互換版である[Alchemy Web3](https://docs.alchemy.com/reference/api-overview)をお勧めします。 Alchemy Web3は、自動リトライや WebScoket に対する充実したサポートなどの利点を持っています。
+Alchemyと統合できる[Web3ライブラリ](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries)はたくさんありますが、web3.jsのドロップインリプレースメントとして、Alchemyとシームレスに動作するように構築・設定された[Alchemy Web3](https://docs.alchemy.com/reference/api-overview)の使用をお勧めします。 これにより、自動リトライや堅牢なWebSocketサポートなど、複数の利点が得られます。
-Alchemy Web3.jsをインストールするには、 **プロジェクトディレクトリに移動して**、以下を実行します。
+AlchemyWeb3.jsをインストールするには、**プロジェクトディレクトリに移動し**、以下を実行してください:
-**Yarnの場合:**
+**Yarnの場合:**
```
yarn add @alch/alchemy-web3
```
-**NPMの場合:**
+**NPMの場合:**
```
npm install @alch/alchemy-web3
```
-Alchemyのノードインフラとやり取りするには、Node.jsで実行するか、JavaScriptファイルに以下の行を追加します:
+Alchemyのノードインフラストラクチャとやり取りするには、NodeJSで実行するか、このコードをJavaScriptファイルに追加してください:
```js
const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
@@ -102,26 +97,26 @@ const web3 = createAlchemyWeb3(
)
```
-## 5. はじめてのWeb3スクリプトを作成しましょう! {#write-your-first-web3-script}
+## 5. 最初のWeb3スクリプトを書きましょう! {#write-your-first-web3-script}
-それではさっそく、実際にweb3のプログラミングを始めましょう。まずは、イーサリアム・メインネットにおける最新のブロック番号を出力する簡単なスクリプトを作成します。
+それでは、少しWeb3プログラミングを試してみましょう。イーサリアムメインネットから最新のブロック番号を出力する簡単なスクリプトを作成します。
-**1. すでに実行していない場合、ターミナルで新規のプロジェクトディレクトリを作成し、cdコマンドで移動します。**
+**1. **まだ作成していない場合は、ターミナルで新しいプロジェクトディレクトリを作成し、そこにcdで移動してください:**
```
mkdir web3-example
cd web3-example
```
-**2. まだ実行していない場合、Alchemy web3(または任意の web3)の依存関係をプロジェクトにインストールします。**
+**2. **まだインストールしていない場合は、Alchemy Web3(または任意のWeb3)の依存関係をプロジェクトにインストールしてください:**
```
npm install @alch/alchemy-web3
```
-**3. `index.js`という名称のファイルを作成し、以下の内容を追加します:**
+**3. **`index.js`という名前のファイルを作成し、次の内容を追加してください:**
-> 最終的には、`demo`をあなたのAlchemy HTTP API keyに置き換える必要があります。
+> 最終的には`demo`をご自身のAlchemy HTTP APIキーに置き換える必要があります。
```js
async function main() {
@@ -133,22 +128,22 @@ async function main() {
main()
```
-非同期関数についてよく理解していない場合は、 この[Mediumの記事](https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c)を参照してください。
+async(非同期処理)に慣れていませんか? こちらの[Mediumの投稿](https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c)をご確認ください。
-**4. ノードを使用して、ターミナルで実行します。**
+**4. **nodeを使ってターミナルで実行します**
```
node index.js
```
-**5. コンソールに、最新のブロック番号が出力されるはずです。**
+**5. **コンソールに最新のブロック番号が出力されているはずです!**
```
The latest block number is 11043912
```
-**よくできました! おめでとうございます! Alchemyを使用した最初のweb3スクリプトが完成しました 🎉**
+**素晴らしい!** おめでとうございます! **これでAlchemyを使って最初のWeb3スクリプトが書けました 🎉**
-次は何を学べば良いのかわからない場合は、 [「ハローワールド・スマートコントラクトガイド」](https://docs.alchemyapi.io/tutorials/hello-world-smart-contract)を使って、はじめてのスマートコントラクトのデプロイとSolidityプログラミングに挑戦するか、[ダッシュボード・デモアプリ](https://docs.alchemyapi.io/tutorials/demo-app)でダッシュボードに関するあなたの知識をテストしてみましょう!
+次に何をすればいいかわからないですか? [Hello Worldスマートコントラクトガイド](https://www.alchemy.com/docs/hello-world-smart-contract)で最初のスマートコントラクトをデプロイしてSolidityプログラミングを試すか、[ダッシュボードデモアプリ](https://docs.alchemyapi.io/tutorials/demo-app)でダッシュボードの知識を試してみてください!
-_[Alchemyに無料登録し](https://auth.alchemyapi.io/signup)、[ドキュメンテーション](https://docs.alchemyapi.io/)を確認してください。また、[Twitter](https://twitter.com/AlchemyPlatform)_をフォローして、最新ニュースをチェックしてください。
+_[Alchemyに無料でサインアップ](https://auth.alchemy.com/)し、[ドキュメント](https://www.alchemy.com/docs/)をチェックして、最新ニュースは[Twitter](https://twitter.com/AlchemyPlatform)でフォローしてください。_
diff --git a/public/content/translations/ja/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/ja/developers/tutorials/guide-to-smart-contract-security-tools/index.md
index 9a1ae545f7a..f576f959d91 100644
--- a/public/content/translations/ja/developers/tutorials/guide-to-smart-contract-security-tools/index.md
+++ b/public/content/translations/ja/developers/tutorials/guide-to-smart-contract-security-tools/index.md
@@ -1,105 +1,102 @@
---
-title: スマートコントラクト関連セキュリティツールのガイド
-description: テストおよびプログラム分析に関する3種類のテクニックの概要
+title: "スマートコントラクトセキュリティツールのガイド"
+description: "3つの異なるテストおよびプログラム分析手法の概要"
author: "Trailofbits"
lang: ja
-tags:
- - "Solidity"
- - "スマートコントラクト"
- - "セキュリティ"
+tags: [ "Solidity", "スマートコントラクト", "セキュリティ" ]
skill: intermediate
published: 2020-09-07
-source: セキュアなコントラクトの開発
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis
---
-このチュートリアルでは、以下の3種類のテスト/プログラム分析テクニックを取り上げます:
+ここでは、3つの特徴的なテストおよびプログラム分析の手法を使用します。
-- **[Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/)を用いた静的解析**では、プログラムのすべてのパスにつき、様々なプログラム表示(例:制御フローグラフ)を通じて同時に近似値を求め、分析します。
-- **[Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/)を用いたファジング**では、疑似乱数に基づいて生成したトランザクションを用いてコードを実行します。 ファザーは、特定のプロパティに違反する一連のトランザクションを見つけようとします。
-- **[Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/)を用いたシンボリック実行**は、各実行パスを数式に変換した上で、制約条件をチェックできるフォーマルな検証テクニックです。
+- **[Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/)による静的解析。** プログラムのすべてのパスが、異なるプログラム表示(例:制御フローグラフ)を通じて、同時に近似、分析されます。
+- **[Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/)によるファジング。** コードは、トランザクションの疑似ランダム生成によって実行されます。 ファザーは、特定のプロパティに違反する一連のトランザクションを見つけようとします。
+- **[Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/)によるシンボリック実行。** 各実行パスを数式に変換し、その上で制約をチェックできる形式的検証テクニックです。
-上記の手法はそれぞれの利点と欠点を持つため、[特定の用途](#determining-security-properties)に合わせて選択すべきです。
+各テクニックには長所と短所があり、[特定のケース](#determining-security-properties)で役立ちます:
-| 手法 | ツール | 用途 | 速度 | バグを見落とす可能性 | 偽陽性の可能性 |
-| -------- | --------- | ------------------------ | --- | ---------- | ------- |
-| 静的解析 | Slither | CLI およびスクリプト | 数秒 | 中程度 | 低い |
-| ファジング | Echidna | Solidityのプロパティ | 数分間 | 低い | なし |
-| シンボリック実行 | Manticore | Solidity のプロパティおよび スクリプト | 数時間 | なし* | なし |
+| テクニック | ツール | 使用法 | 速度 | 見逃されるバグ | 誤検知 |
+| -------- | --------- | -------------------- | --- | ------- | --- |
+| 静的解析 | Slither | CLIとスクリプト | 数秒 | 中 | 低 |
+| ファジング | Echidna | Solidityのプロパティ | 数分間 | 低 | なし |
+| シンボリック実行 | Manticore | Solidityのプロパティとスクリプト | 数時間 | なし\* | なし |
-* すべてのパスをタイムアウトなしで検証した場合
+- すべてのパスがタイムアウトなしで探索された場合
-**Slither**は、コントラクトを数秒間で分析できますが、 静的解析は誤検知を伴う場合があり、複雑なチェック作業(例:算術演算の検査)にはあまり適していません。 Slitherは、APIを通じてプッシュボタンによりビルトインの検知器にアクセスするか、ユーザー定義のチェック作業用のAPIを通じて実行します。
+**Slither**は数秒でコントラクトを分析しますが、静的解析は誤検知につながる可能性があり、複雑なチェック(算術チェックなど)にはあまり適していません。 Slitherは、API経由で実行し、組み込みの検出器にプッシュボタンでアクセスするか、ユーザー定義のチェックを行います。
-**Echidna**では、検出に数分間を要しますが、偽陽性は検出しません。 Echidnaでは、Solidityで作成され、ユーザーが提供したセキュリティ属性をチェックします。 ただし、ランダムな検索に基づくため、すべてのバグを検出するとは限りません。
+**Echidna**は、実行に数分を要しますが、生成するのは真陽性のみです。 Echidnaは、ユーザーが提供した、Solidityで記述されたセキュリティプロパティをチェックします。 ランダムな探索に基づいているため、バグを見逃す可能性があります。
-**Manticore**は、「最も徹底的な」分析を行います。 Echidnaの場合と同様に、ユーザーが提供した属性を検証します。 検出時間はさらに長くなりますが、特定のプロパティを検証でき、偽陽性を検出することもありません。
+**Manticore**は、"最もヘビー級"の分析を実行します。 Echidnaと同様に、Manticoreはユーザーが提供したプロパティを検証します。 実行にはより時間がかかりますが、プロパティの有効性を証明でき、誤検知を報告しません。
-## 推奨するワークフロー {#suggested-workflow}
+## 推奨ワークフロー {#suggested-workflow}
-まず、Slitherに内蔵されている検出機能で開始し、現時点において単純なバグが存在せず、今後も紛れ込む可能性がないことを確認しましょう。 Slither を使って、継承、変数の依存関係、および構造的な問題についてチェックします。 コードベースの規模が拡大するのに伴い、Echidnaを使って、ステートマシンにおけるより複雑なプロパティをテストします。 また、上書きされる機能に対する保護などのSolidityでは提供されない保護については、Slitherを使ってカスタムチェックを作成してください。 最後にManticoreを使用して、セキュリティに関する最重要のプロパティ(例:算術演算)のみに対象を絞った検証を行います。
+まずSlitherの組み込み検出器から始めて、単純なバグが現在存在しないこと、そして後で入り込まないことを確認します。 Slitherを使用して、継承、変数の依存関係、構造上の問題に関連するプロパティをチェックします。 コードベースが大きくなるにつれて、Echidnaを使用してステートマシンのより複雑なプロパティをテストします。 Solidityでは利用できない保護(関数のオーバーライドに対する保護など)のために、Slitherを再検討してカスタムチェックを開発します。 最後に、Manticoreを使用して、重要なセキュリティプロパティ(算術演算など)の的を絞った検証を実行します。
-- SlitherのCLIを使って、よくある問題を検出する
-- Echidnaを使って、スマートコントラクトにおける高度なセキュリティ関連プロパティをテストする
-- Slitherを使って、カスタムの静的解析を作成する
-- 最重要なセキュリティ属性について詳細な保証が必要になったら、Manticoreを使用する
+- SlitherのCLIを使用して、一般的な問題を検出する
+- Echidnaを使用して、コントラクトの高レベルのセキュリティプロパティをテストする
+- Slitherを使用して、カスタムの静的チェックを作成する
+- 重要なセキュリティプロパティの詳細な保証が必要になったら、Manticoreを使用する
-**単体テストに関する注意事項**: 高品質のソフトウェア開発には、単体テストが必須です。 一方で、セキュリティ欠陥を検出する上で、単体テストは最善の方法とは言えません。 通常、単体テストはコードの望ましい動作を確認するため(つまり、通常の環境において予想通りに動作するかどうか)に用いられますが、セキュリティ上の欠陥は、デベロッパが見落としていた周縁的なケースで発生する場合が多いのです。 スマートコントラクトを対象とする数十件のセキュリティレビューを調査した結果、[単体テストのカバレッジは、クライアントのコード上で特定されたセキュリティ上の欠陥の数や重大性には影響を与えていないことが分かりました](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/)。
+**単体テストに関する注記**。 高品質のソフトウェアを構築するには、単体テストが必要です。 しかし、これらのテクニックはセキュリティ上の欠陥を見つけるのに最適というわけではありません。 単体テストは通常、コードの正常な動作(つまり、通常のコンテキストで期待どおりにコードが機能すること)をテストするために使用されますが、セキュリティ上の欠陥は、開発者が考慮しなかったエッジケースに存在する傾向があります。 数十件のスマートコントラクトのセキュリティレビューに関する我々の調査では、クライアントのコードで発見されたセキュリティ上の欠陥の数や重大度に対して、[単体テストのカバレッジは影響を与えませんでした](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/)。
-## 対象とするセキュリティ属性を決定する {#determining-security-properties}
+## セキュリティプロパティの決定 {#determining-security-properties}
-コードを効果的にテスト、検証するには、まず、対象とすべき分野を特定する必要があります。 セキュリティのためのリソースには限りがありますから、コードベースにおける脆弱な部分や高価値の部分に注力して、この取り組みを最適化することが重要です。 これには、脅威モデリングの手法を用いるとよいでしょう。 以下の事項をレビューしてください:
+コードを効果的にテストおよび検証するには、注意が必要な領域を特定する必要があります。 セキュリティに費やすリソースは限られているため、労力を最適化するには、コードベースの脆弱な部分や価値の高い部分を特定することが重要です。 脅威モデリングが役立ちます。 以下をレビューすることを検討してください:
-- [迅速リスク評価](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html)(短時間に完了しなければならない場合に推奨するアプローチです)
-- [データ中心システムにおける脅威モデル作成ガイド](https://csrc.nist.gov/publications/detail/sp/800-154/draft)(別名:NIST 800-154)
-- [Shostackスレッド・モデリング](https://www.amazon.com/Threat-Modeling-Designing-Adam-Shostack/dp/1118809998)
-- [STRIDE](https://wikipedia.org/wiki/STRIDE_(security)) / [DREAD](https://wikipedia.org/wiki/DREAD_(risk_assessment_model))
+- [迅速なリスク評価](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html) (時間がない場合に推奨されるアプローチ)
+- [データ中心システム脅威モデリングガイド](https://csrc.nist.gov/pubs/sp/800/154/ipd)(別名NIST 800-154)
+- [Shostack脅威モデリング](https://www.amazon.com/Threat-Modeling-Designing-Adam-Shostack/dp/1118809998)
+- [STRIDE](https://wikipedia.org/wiki/STRIDE_\(security\)) / [DREAD](https://wikipedia.org/wiki/DREAD_\(risk_assessment_model\))
- [PASTA](https://wikipedia.org/wiki/Threat_model#P.A.S.T.A.)
-- [アサーションを活用する](https://blog.regehr.org/archives/1091)
+- [アサーションの使用](https://blog.regehr.org/archives/1091)
-### 構成要素 {#components}
+### コンポーネント {#components}
-どの事項をチェックしたいのかを把握しておくと、適切なツール選択に役立ちます。
+何をチェックしたいかを知ることも、適切なツールを選ぶのに役立ちます。
-スマートコントラクトにおいて問題となる可能性が高い分野としては、以下が挙げられます:
+スマートコントラクトに頻繁に関連する幅広い分野には、以下が含まれます:
-- **状態マシン** ほとんどのコントラクトは、状態マシンとして表示することが可能です。 ですから、(1)無効な状態に達していないか、(2)状態が有効かつ到達しうるか、および(3)コントラクトをトラップする状態が存在しないか、についてチェックするとよいでしょう。
+- **ステートマシン。** ほとんどのコントラクトはステートマシンとして表現できます。 (1) 無効なステートに到達できないこと、(2) ステートが有効である場合に到達可能であること、(3) コントラクトをトラップするステートがないこと、を確認することを検討してください。
- - 状態マシンの仕様をテストするのに適しているのは、EchidnaとManticoreです。
+ - EchidnaとManticoreは、ステートマシンの仕様をテストするのに適したツールです。
-- **アクセス管理。** あなたのシステムに特権ユーザー(例:所有者、管理者など)が含まれる場合、(1)各ユーザーが、権限を持つアクションのみ実行可能であること、および(2)権限レベルがより上のユーザーによるアクションをブロックできる下位ユーザーが存在しないこと、を確認してください。
+- **アクセス制御。** システムに特権ユーザー(例:オーナー、コントローラーなど)がいる場合 (1) 各ユーザーが許可されたアクションのみを実行できること、(2) より特権的なユーザーからのアクションをブロックできるユーザーがいないこと、を保証する必要があります。
- - アクセス管理については、Slither、Echidna、およびManticoreのいずれも適切なチェックを実行できます。 例えばSlitherでは、ホワイトリストに登録された関数のうち、onlyOwner修飾子を持たない関数のみをチェックすることができます。 一方、EchidnaおよびManticoreは、コントラクトが特定のステートに達した場合のみに権限が付与される場合など、より複雑なアクセス管理を確認するのに適しています。
+ - Slither、Echidna、Manticoreは、正しいアクセス制御をチェックできます。 例えばSlitherは、`onlyOwner`修飾子を欠く関数がホワイトリスト登録済みのものだけであることをチェックできます。 EchidnaとManticoreは、コントラクトが特定のステートに達した場合にのみ許可が与えられるなど、より複雑なアクセス制御に役立ちます。
-- **算術演算。** 算術演算が正しく実行されるかを確認することは、非常に重要です。 オーバーフロー/アンダーフローを防止するには、`SafeMath`を常に利用することを推奨しますが、同時に、端数処理に関する問題やコントラクトをトラップしてしまうような欠陥など、その他の演算上の欠陥についても確認する必要があります。
+- **算術演算。** 算術演算の健全性をチェックすることは非常に重要です。 あらゆる場所で`SafeMath`を使用することは、オーバーフロー/アンダーフローを防ぐための良い一歩ですが、丸め誤差の問題やコントラクトをトラップする欠陥など、他の算術的な欠陥も考慮する必要があります。
- - この分野では、Manticoreを使用するのがよいでしょう。 当該の算術演算がSMTソルバーの対象範囲外である場合は、Echidnaを選択してもよいです。
+ - ここではManticoreが最良の選択です。 算術がSMTソルバーの範囲外である場合は、Echidnaを使用できます。
-- **継承の正確性。** Solidityで作成したコントラクトは、複数の継承に大きく依存しています。 シャドーイング関数において`super`コールが含まれていない場合や、C3 linearizationの順序の誤解釈などのミスは、容易に発生する可能性があります。
+- **継承の正確性。** Solidityコントラクトは多重継承に大きく依存しています。 `super`呼び出しを欠いたシャドウイング関数や、誤って解釈されたC3線形化の順序などの間違いは、簡単に発生し得ます。
- - これらの問題を検出するには、Slitherが最適です。
+ - Slitherは、これらの問題を確実に検出するためのツールです。
-- **外部とのやりとり。** コントラクトは相互にやりとりを行いますが、外部のコントラクトの中には信用すべきでないものもあります。 例えば、あなたのコントラクトが外部オラクルに依存する場合、利用可能なオラクルの半分が汚染されていれば、あなたのコントラクトはセキュアであるとは言えないでしょう。
+- **外部とのやりとり。** コントラクトは相互にやりとりしますが、一部の外部コントラクトは信頼すべきではありません。 例えば、コントラクトが外部のオラクルに依存している場合、利用可能なオラクルの半分が侵害されても、そのコントラクトは安全なままでしょうか?
- - コントラクトにおける外部とのやりとりをテストするには、ManticoreおよびEchidnaが最適です。 Manticoreには、外部のコントラクトをスタブするためのメカニズムが内蔵されています。
+ - ManticoreとEchidnaは、コントラクトと外部とのやりとりをテストするための最良の選択です。 Manticoreには、外部コントラクトをスタブするための組み込みメカニズムがあります。
-- **規格適合性。** イーサリアムの標準(例:ERC-20)には、これまで様々な設計ミスが含まれていました。 ですから、作成するコントラクトの規格上の制約に十分注意してください。
- - Slither、Echidna、およびManticoreはいずれも、特定の規格に対する非遵守を検知するのに役立ちます。
+- **標準準拠。** イーサリアムの標準(例:ERC20)には、その設計に欠陥があった歴史があります。 構築の基盤となる標準の制限に注意してください。
+ - Slither、Echidna、Manticoreは、特定の標準からの逸脱を検出するのに役立ちます。
-### ツール選択の早見表 {#tool-selection-cheatsheet}
+### ツール選択のチートシート {#tool-selection-cheatsheet}
-| 構成要素 | ツール | 具体例 |
-| -------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 状態マシン | Echidna、Manticore | |
-| アクセス管理 | Slither、Echidna、Manticore | [Slither エクササイズ2](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise2.md)、[Echidna エクササイズ2](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-2.md) |
-| 算術演算 | Manticore、Echidna | [Echidna エクササイズ1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-1.md)、[Manticore エクササイズ1~3](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) |
-| 継承の正確さ | Slither | [Slither エクササイズ1](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise1.md) |
-| 外部とのやりとり | Manticore、Echidna | |
-| 規格の遵守 | Slither、Echidna、Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) |
+| コンポーネント | ツール | 実例: |
+| -------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| ステートマシン | Echidna、Manticore | |
+| アクセス制御 | Slither、Echidna、Manticore | [Slither 演習 2](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise2.md)、[Echidna 演習 2](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-2.md) |
+| 算術演算 | Manticore、Echidna | [Echidna 演習 1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-1.md)、[Manticore 演習 1~3](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) |
+| 継承の正確性 | Slither | [Slither 演習 1](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise1.md) |
+| 外部とのやりとり | Manticore、Echidna | |
+| 標準準拠 | Slither、Echidna、Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) |
-コントラクトの目的に応じて他の分野についてもチェックする必要がありますが、あらゆるスマートコントラクトにおいて、上記の大まかな注力分野から確認することをお勧めします。
+目標によっては他の領域もチェックする必要がありますが、これらの大まかな重点領域は、あらゆるスマートコントラクトシステムにとって良い出発点となります。
-本サイトのパブリック監査には、検証/テスト済みのプロパティの具体例が含まれています。 実際のセキュリティ関連プロパティについてレビューしたい場合は、以下のレポートの`Automated Testing and Verification(自動テスト/検証)`セクションを参照してください。
+我々の公開監査には、検証またはテストされたプロパティの例が含まれています。 実際のセキュリティプロパティをレビューするには、以下のレポートの`Automated Testing and Verification`のセクションを読むことを検討してください:
- [0x](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf)
- [Balancer](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf)
diff --git a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract-fullstack/index.md
index e57b51fa783..af8028cd846 100644
--- a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract-fullstack/index.md
+++ b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract-fullstack/index.md
@@ -1,87 +1,90 @@
---
-title: 初心者向けのHello Worldスマートコントラクト - フルスタック
-description: イーサリアムでの簡単なスマートコントラクトの作成とデプロイに関する入門チュートリアル
+title: "初心者向けのHello Worldスマートコントラクト - フルスタック"
+description: "イーサリアムでの簡単なスマートコントラクトの作成とデプロイに関する入門チュートリアル。"
author: "nstrike2"
tags:
- - "Solidity"
- - "Hardhat"
- - "Alchemy"
- - "スマートコントラクト"
- - "デプロイ"
- - "ブロックエクスプローラ"
- - "フロントエンド"
- - "トランザクション"
+ [
+ "Solidity",
+ "Hardhat",
+ "Alchemy",
+ "スマートコントラクト",
+ "デプロイ",
+ "ブロックエクスプローラー",
+ "フロントエンド",
+ "トランザクション"
+ ]
skill: beginner
lang: ja
published: 2021-10-25
---
-このガイドはブロックチェーンの開発の初心者で、どこから始めたらよいか分からなかったり、スマートコントラクトのデプロイやインタラクト方法について分からない方向けのものです。 これから一緒に、Goerliテストネットワーク上で簡単なスマートコントラクトを作成してデプロイする方法を順を追ってたどりましょう。その際、[MetaMask](https://metamask.io)、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org)と[Alchemy](https://alchemyapi.io/eth)を使用します。
+このガイドは、ブロックチェーン開発の初心者で、どこから始めればよいか、スマートコントラクトのデプロイやインタラクトの方法がわからない方を対象としています。 [MetaMask](https://metamask.io)、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org)、[Alchemy](https://alchemy.com/eth) を使って、Goerliテストネットワークでシンプルなスマートコントラクトを作成し、デプロイする手順を説明します。
-このチュートリアルを完了するためにはAlchemyのアカウントが必要です。 [無料でアカウント登録する](https://www.alchemy.com/).
+このチュートリアルを完了するには、Alchemyのアカウントが必要です。 [無料アカウントにサインアップ](https://www.alchemy.com/)
-質問がある場合は、いつでもお気軽に[Alchemy Discord](https://discord.gg/gWuC7zB)でお問い合わせください。
+ご不明な点がありましたら、[Alchemy Discord](https://discord.gg/gWuC7zB) までお気軽にお問い合わせください。
-## パート1: Hardhatを利用してスマートコントラクトを作りデプロイする {#part-1}
+## パート1 - Hardhatを使用してスマートコントラクトを作成・デプロイする {#part-1}
-### イーサリアムネットワークに接続する {#connect-to-the-ethereum-network}
+### Ethereumネットワークに接続する {#connect-to-the-ethereum-network}
-イーサリアムチェーンにリクエストを行う方法はたくさんあります。 簡略化のため、ここではAlchemyの無料アカウントを使用します。このブロックチェーンのデベロッパープラットフォームとAPIにより、独自のノードを実行することなく、イーサリアムチェーンとの通信が可能になります。 Alchemyには、スマートコントラクトのデプロイメントにおいて内部で何が起こっているのかを把握するためにこのチュートリアルで利用する、監視と分析のためのデベロッパーツールも備わっています。
+イーサリアムチェーンにリクエストを行う方法はたくさんあります。 簡潔にするため、ブロックチェーン開発者プラットフォームであり、APIでもあるAlchemyの無料アカウントを使用します。これにより、自分でノードを実行することなく、Ethereumチェーンと通信できます。 Alchemyには、モニタリングと分析のための開発者ツールもあります。このチュートリアルでは、これらのツールを利用して、スマートコントラクトのデプロイで内部的に何が起こっているかを理解します。
-### アプリのAPIキーの作成 {#create-your-app-and-api-key}
+### アプリとAPIキーを作成する {#create-your-app-and-api-key}
-Alchemyのアカウントを作成した後、アプリを作成することでAPIキーを生成することができます。 これにより、Goerliテストネットへのリクエストが可能になります。 テストネットに詳しくない場合は、[Alchemyのネットワークの選択ガイド](https://docs.alchemyapi.io/guides/choosing-a-network)をお読みください。
+Alchemyのアカウントを作成したら、アプリを作成してAPIキーを生成できます。 これにより、Goerliテストネットにリクエストを送信できるようになります。 テストネットに馴染みがない場合は、[Alchemyのネットワーク選択ガイド](https://www.alchemy.com/docs/choosing-a-web3-network) をお読みください。
-Alchemyダッシュボード上にあるナビゲーションバーで**Apps**ドロップダウンがあります。そこで、**Create App**をクリックします。
+Alchemyのダッシュボードで、ナビゲーションバーにある **Apps** ドロップダウンを見つけ、**Create App** をクリックします。
-
+
-アプリに「_Hello World_」という名前を付けて、短い説明を書きます。 環境は、**Staging**を選択します。ネットワークは、**Goerli**を選択します。
+アプリに「_Hello World_」という名前を付け、簡単な説明を記述します。 環境として **Staging** を、ネットワークとして **Goerli** を選択します。
-
+
-_注意: 必ず**Goerli**を選択してください。そうしないと、このチュートリアルどおり行きません。_
+_注: 必ず **Goerli** を選択してください。選択しないと、このチュートリアルは機能しません。_
-**Create app**をクリックしてください。 アプリが下の表に表示されます。
+**Create app** をクリックします。 作成したアプリが下の表に表示されます。
-### イーサリアムアカウントの作成 {#create-an-ethereum-account}
+### Ethereumアカウントを作成する {#create-an-ethereum-account}
-トランザクションの送受信には、イーサリアムアカウントが必要です。 ここでは、MetaMaskを使います。MataMaskは、ユーザーがイーサリアムのアカウントアドレスを管理できるブラウザーの仮想ウォレットです。
+トランザクションを送受信するには、Ethereumアカウントが必要です。 ここでは、ユーザーがEthereumアカウントアドレスを管理できる、ブラウザ上の仮想ウォレットであるMetaMaskを使用します。
-Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Goerli Test Network」に切り替えてください。
+MetaMaskアカウントは、[こちら](https://metamask.io/download)から無料でダウンロードして作成できます。 アカウントを作成するとき、またはすでにアカウントをお持ちの場合は、右上の「Goerli Test Network」に必ず切り替えてください (実在の通貨を扱わないようにするため)。
-### ステップ4: フォーセットからイーサリアムを追加する {#step-4-add-ether-from-a-faucet}
+### ステップ4: フォーセットからイーサを追加する {#step-4-add-ether-from-a-faucet}
-テストネットワークにスマートコントラクトをデプロイするには、偽のETHが複数必要になります。 GoerliネットワークでETHを取得するには、Goerliフォーセットに移動し、あなたのGoerliのアカウントアドレスを入力します。 Goerliフォーセットは最近、不安定になることがあります。試せるオプションのリストは、[テストネットワークのページ](/developers/docs/networks/#goerli)を参照してください。
+スマートコントラクトをテストネットワークにデプロイするには、偽のETHが必要です。 GoerliネットワークでETHを取得するには、Goerliフォーセットにアクセスし、Goerliアカウントアドレスを入力します。 Goerliフォーセットは最近、少し信頼性が低い場合があります。試せるオプションの一覧については、[テストネットワークのページ](/developers/docs/networks/#goerli) を参照してください:
-_注意: ネットワークの混雑状況によっては、時間がかかる場合があります。_
+_注: ネットワークの混雑により、しばらく時間がかかる場合があります。_
+``
### ステップ5: 残高を確認する {#step-5-check-your-balance}
-あなたのウォレットにETHがあることをダブルチェックし、[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)リクエストを[Alchemyのコンポーザーツール](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D)を使って出してみましょう。 リクエストすると、ウォレット内のETHの量が返却されます。 詳細については、[Alchemyの短いチュートリアルにあるコンポーザーツールの使用方法](https://youtu.be/r6sjRxBZJuU)をご覧ください。
+ウォレットにETHが入っていることを再確認するために、[Alchemyのcomposerツール](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D) を使って [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) リクエストを実行してみましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 詳細については、[composerツールの使用方法に関するAlchemyの短いチュートリアル](https://youtu.be/r6sjRxBZJuU) をご覧ください。
-MetaMaskアカウントのアドレスを入力し、**Send Request**をクリックします。 以下のコードスニペットのようなレスポンスが来ます。
+MetaMaskアカウントのアドレスを入力し、**Send Request** をクリックします。 以下のようなコードスニペットのレスポンスが表示されます。
```json
{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }
```
-> _注意: この結果の単位はweiであり、ETHではありません。 weiはETHの最小単位として使われています。_
+> _注: この結果はETHではなく、wei単位です。_ _Weiはetherの最小単位として使用されます。_
-ご安心ください。 私たちの偽物のお金はすべてそこにあります。
+ふう! 私たちの偽物のお金はすべてそこにあります。
### ステップ6: プロジェクトを初期化する {#step-6-initialize-our-project}
-まず、プロジェクトのフォルダを作成する必要があります。 コマンドラインに移動し、次のように入力します。
+まず、プロジェクト用のフォルダを作成する必要があります。 コマンドラインに移動し、次のように入力します。
```
mkdir hello-world
cd hello-world
```
-プロジェクトフォルダ内に入ったら、`npm init`を使用してプロジェクトを初期化します。
+プロジェクトフォルダに入ったので、`npm init`を使用してプロジェクトを初期化します。
-> npmをまだインストールしていない場合は、[こちら](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm)の手順に従いNode.jsとnpmをインストールします。
+> まだnpmがインストールされていない場合は、[Node.jsとnpmをインストールするための指示](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm)に従ってください。
このチュートリアルでは、初期化における質問にどのように答えるかには重点を置いていません。 参考までに、私たちは次のように行いました。
@@ -111,29 +114,29 @@ About to write to /Users/.../.../.../hello-world/package.json:
}
```
-package.jsonを承認すれば完了です。
+package.jsonを承認すれば完了です!
-### ステップ7: Hardhatのダウンロード {#step-7-download-hardhat}
+### ステップ7: Hardhatをダウンロードする {#step-7-download-hardhat}
Hardhatは、イーサリアムのソフトウェアをコンパイル、デプロイ、テスト、デバッグするための開発環境です。 デベロッパーがライブチェーンにデプロイする前に、スマートコントラクトや分散型アプリケーション(Dapp)をローカルに構築する際に役立ちます。
-先ほど作成した`hello-world`プロジェクト内で、以下を実行します。
+`hello-world`プロジェクト内で次を実行します。
```
npm install --save-dev hardhat
```
-[インストール手順](https://hardhat.org/getting-started/#overview)の詳細については、こちらのページをご覧ください。
+[インストール手順](https://hardhat.org/getting-started/#overview)の詳細については、このページをご覧ください。
### ステップ8: Hardhatプロジェクトを作成する {#step-8-create-hardhat-project}
-先ほど作成した`hello-world`プロジェクトフォルダ内で、以下を実行します。
+`hello-world`プロジェクトフォルダ内で、以下を実行します:
```
npx hardhat
```
-ウェルカムメッセージと、次に何をするのかを選択できるオプションが表示されます。 「Create an empty hardhat.config.js」を選択します。
+ウェルカムメッセージと、次に何をするのかを選択できるオプションが表示されます。 「create an empty hardhat.config.js」を選択してください。
```
888 888 888 888 888
@@ -153,57 +156,57 @@ Create a sample project
Quit
```
-これで、プロジェクト内に`hardhat.config.js`ファイルが生成されます。 プロジェクトの設定を明記するのにチュートリアルの後半でこれを使用します。
+これにより、プロジェクトに `hardhat.config.js` ファイルが生成されます。 チュートリアルの後半で、これを使用してプロジェクトのセットアップを指定します。
### ステップ9: プロジェクトフォルダを追加する {#step-9-add-project-folders}
-プロジェクトを整理するために、2つの新しいフォルダを作成します。 コマンドラインで、`hello-world`プロジェクトのルートディレクトリに移動し、次のように入力します。
+プロジェクトを整理するために、2つの新しいフォルダを作成しましょう。 コマンドラインで、`hello-world` プロジェクトのルートディレクトリに移動し、次のように入力します:
```
mkdir contracts
mkdir scripts
```
-- `contracts/`は、Hello Worldスマートコントラクトのコードファイルを格納する場所です。
-- `scripts/`は、コントラクトをデプロイして対話するスクリプトを保持する場所です。
+- `contracts/` には、hello worldスマートコントラクトのコードファイルを保存します
+- `scripts/` には、コントラクトをデプロイして対話するためのスクリプトを保存します
### ステップ10: コントラクトを作成する {#step-10-write-our-contract}
-一体いつになったらコードを書くのだろうと疑問をお持ちではないでしょうか 。 まさに、その時です!
+「いつになったらコードを書くのだろう?」と思っているかもしれませんね。 その時が来ました!
-あなたのお気に入りのエディターでhello-worldプロジェクトを開きます。 スマートコントラクトは、最も一般的にはSolidityで書かれています。そのため、Solidityでスマートコントラクトを作成します。
+お好きなエディタでhello-worldプロジェクトを開いてください。 スマートコントラクトは、最も一般的にはSolidityで記述されており、今回もSolidityを使ってスマートコントラクトを作成します。
-1. `contracts`フォルダに移動し、`HelloWorld.sol`という名前の新規ファイルを作成します。
-2. 以下は、このチュートリアルで使用するHello Worldスマートコントラクトのサンプルです。 以下の内容を`HelloWorld.sol`ファイルにコピーします。
+1. `contracts` フォルダに移動し、`HelloWorld.sol` という名前の新しいファイルを作成します。
+2. 以下は、このチュートリアルで使用するHello Worldスマートコントラクトのサンプルです。 以下の内容を `HelloWorld.sol` ファイルにコピーしてください。
-_注意: 必ずコメントを読み、このコントラクトの処理内容を理解してください。_
+_注: このコントラクトが何をするのかを理解するために、必ずコメントをお読みください。_
```
-// Specifies the version of Solidity, using semantic versioning.
-// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+// Solidityのバージョンをセマンティックバージョニングで指定します。
+// 詳細: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
pragma solidity >=0.7.3;
-// Defines a contract named `HelloWorld`.
-// A contract is a collection of functions and data (its state). Once deployed, a contract resides at a specific address on the Ethereum blockchain. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+// `HelloWorld` という名前のコントラクトを定義します。
+// コントラクトは関数とデータ (その状態) の集合です。一度デプロイされると、コントラクトはEthereumブロックチェーン上の特定のアドレスに存在します。詳細: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
contract HelloWorld {
- //Emitted when update function is called
- //Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen.
+ // update関数が呼び出されたときに発行されます
+ //スマートコントラクトのイベントは、ブロックチェーン上で何かが起こったことをコントラクトがアプリのフロントエンドに伝える方法です。フロントエンドは特定のイベントを「リッスン」し、それが起こったときに行動を起こすことができます。
event UpdatedMessages(string oldStr, string newStr);
- // Declares a state variable `message` of type `string`.
- // State variables are variables whose values are permanently stored in contract storage. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value.
+ // `string` 型の状態変数 `message` を宣言します。
+ // 状態変数は、その値がコントラクトのストレージに永続的に保存される変数です。`public` キーワードにより、変数はコントラクトの外部からアクセス可能になり、他のコントラクトやクライアントが値をアクセスするために呼び出せる関数が作成されます。
string public message;
- // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation.
- // Constructors are used to initialize the contract's data. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ // 多くのクラスベースのオブジェクト指向言語と同様に、コンストラクタはコントラクト作成時に一度だけ実行される特別な関数です。
+ // コンストラクタはコントラクトのデータを初期化するために使用されます。詳細:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
constructor(string memory initMessage) {
- // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable).
+ // 文字列引数 `initMessage` を受け取り、その値をコントラクトの `message` ストレージ変数に設定します)。
message = initMessage;
}
- // A public function that accepts a string argument and updates the `message` storage variable.
+ // 文字列引数を受け取り、 `message` ストレージ変数を更新する公開関数です。
function update(string memory newMessage) public {
string memory oldMsg = message;
message = newMessage;
@@ -212,15 +215,15 @@ contract HelloWorld {
}
```
-これは、作成時にメッセージを保存する基本的なスマートコントラクトです。 `update`関数を呼び出すことで更新できます。
+これは、作成時にメッセージを保存する基本的なスマートコントラクトです。 `update` 関数を呼び出すことで更新できます。
### ステップ11: MetaMaskとAlchemyをプロジェクトに接続する {#step-11-connect-metamask-alchemy-to-your-project}
-ここまでで、MetaMaskウォレットとAlchemyアカウントを作成し、スマートコントラクトも作成しました。次はこの3つを接続しましょう。
+MetaMaskウォレットとAlchemyアカウントを作成し、スマートコントラクトも作成しました。次はこの3つを接続しましょう。
-ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使用した署名が必要です。 この許可をプログラムに与えるために、秘密鍵を環境ファイルに安全に格納する作業を行います。 AlchemyのAPIキーもここに保存します。
+ウォレットから送信されるすべてのトランザクションには、一意の秘密鍵を使用した署名が必要です。 プログラムにこの許可を与えるために、秘密鍵を環境ファイルに安全に保存することができます。 AlchemyのAPIキーもここに保存します。
-> トランザクションの送信の詳細については、[こちらのチュートリアル](https://docs.alchemyapi.io/alchemy/tutorials/sending-transactions-using-web3-and-alchemy)のweb3使ったトランザクションの送信に関する内容をご覧ください。
+> トランザクションの送信についてさらに詳しく知るには、web3を使用したトランザクションの送信に関する[このチュートリアル](https://www.alchemy.com/docs/hello-world-smart-contract#step-11-connect-metamask--alchemy-to-your-project) を確認してください。
まず、プロジェクトディレクトリにdotenvパッケージをインストールします。
@@ -228,31 +231,31 @@ contract HelloWorld {
npm install dotenv --save
```
-次に、プロジェクトのルートディレクトリに`.env`ファイルを作成します。 MetaMask秘密鍵とHTTP Alchemy API URLをファイルに加えます。
+次に、プロジェクトのルートディレクトリに `.env` ファイルを作成します。 そのファイルに、MetaMaskの秘密鍵とHTTP Alchemy APIのURLを追加します。
-環境ファイルの名前は、必ず`.env`にしてください。そうしないと環境ファイルとして認識されません。
+環境ファイルは `.env` という名前にする必要があります。そうしないと、環境ファイルとして認識されません。
-`process.env`や`.env-custom`などの名前を付けないでください。
+`process.env` や `.env-custom` など、他の名前にしないでください。
-- 秘密鍵をエクスポートするには、[こちらの手順](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key)に従ってください。
-- HTTP Alchemy APIのURLを取得するには、以下を参照してください。
+- 秘密鍵をエクスポートするための[これらの手順](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key)に従ってください
+- HTTP Alchemy API URLを取得するには、以下を参照してください

-`.env`ファイルは次のようになります。
+`.env`は次のようになります:
```
API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key"
PRIVATE_KEY = "your-metamask-private-key"
```
-これらの変数を実際にコードに接続するために、ステップ13でこれらの変数を`hardhat.config.js`ファイル内で参照します。
+これらをコードに実際に接続するために、ステップ13で`hardhat.config.js`ファイル内のこれらの変数を参照します。
### ステップ12: Ethers.jsをインストールする {#step-12-install-ethersjs}
-Ethers.jsは、よりユーザーフレンドリーなメソッドで[標準のJSON-RPCメソッド](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc)をラップすることにより、イーサリアムとの対話やリクエストを簡単に行うためのライブラリです。
+Ethers.jsは、[標準的なJSON-RPCメソッド](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc)をよりユーザーフレンドリーなメソッドでラップすることにより、Ethereumとのインタラクションやリクエストを容易にするライブラリです。
-Hardhatを使用すると、追加のツールと拡張機能のための[プラグイン](https://hardhat.org/plugins/)を統合できます。 コントラクトのデプロイでは、[Ethersプラグイン](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers)を利用します。
+Hardhatでは、追加のツールや拡張機能のために[プラグイン](https://hardhat.org/plugins/)を統合することができます。 コントラクトのデプロイには[Ethersプラグイン](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers)を利用します。
プロジェクトのホームディレクトリで以下を実行します。
@@ -260,11 +263,11 @@ Hardhatを使用すると、追加のツールと拡張機能のための[プラ
npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"
```
-### ステップ13: hardhat.config.jsをアップデートする {#step-13-update-hardhat-configjs}
+### ステップ13: hardhat.config.jsを更新する {#step-13-update-hardhat-configjs}
-ここまでで、いくつかの依存関係とプラグインを追加しました。次に、`hardhat.config.js`を更新して、プロジェクトがそれらすべてについて認識できるようにする必要があります。
+ここまでで、いくつかの依存関係とプラグインを追加しました。次に、プロジェクトがそれらすべてを認識できるように、`hardhat.config.js`を更新する必要があります。
-`hardhat.config.js`を以下のように更新します。
+`hardhat.config.js`を次のように更新します:
```javascript
/**
@@ -291,7 +294,7 @@ module.exports = {
### ステップ14: コントラクトをコンパイルする {#step-14-compile-our-contract}
-ここまででしっかりと動作していることを確認するため、コントラクトをコンパイルしてみましょう。 `compile`タスクは、組み込みのHardhatタスクの1つです。
+ここまでの作業がうまくいっていることを確認するために、コントラクトをコンパイルしてみましょう。 `compile`タスクは、組み込みのHardhatタスクの1つです。
コマンドラインで以下を実行します。
@@ -299,19 +302,19 @@ module.exports = {
npx hardhat compile
```
-`SPDX license identifier not provided in source file`という警告が表示される場合がありますが、心配する必要はありません。警告が表示されないのがベストですが、 表示された場合は、いつでも[Alchemy discord](https://discord.gg/u72VCg3)でメッセージを送信できます。
+`SPDX license identifier not provided in source file` という警告が表示されるかもしれませんが、心配する必要はありません。それ以外はすべて問題ないはずです! うまくいかない場合は、いつでも[Alchemy Discord](https://discord.gg/u72VCg3)でメッセージを送ることができます。
-### ステップ15: デプロイスクリプトを書く {#step-15-write-our-deploy-script}
+### ステップ15: デプロイスクリプトを作成する {#step-15-write-our-deploy-script}
コントラクトの作成と設定ファイルの作成が完了したら、いよいよコントラクトのデプロイのためのスクリプトを作成します。
-`scripts/`フォルダに移動して、`deploy.js`という名前のファイルを新規に作成し、以下の内容を追加します。
+`scripts/`フォルダに移動して`deploy.js`という名前の新しいファイルを作成し、次の内容を追加します:
```javascript
async function main() {
const HelloWorld = await ethers.getContractFactory("HelloWorld")
- // Start deployment, returning a promise that resolves to a contract object
+ // デプロイを開始し、コントラクトオブジェクトに解決されるpromiseを返す
const hello_world = await HelloWorld.deploy("Hello World!")
console.log("Contract deployed to address:", hello_world.address)
}
@@ -324,23 +327,23 @@ main()
})
```
-Hardhatがコードの各行で行っている驚くべき内容については、Hardhatの[コントラクトチュートリアル](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)で説明されています。以下では、その説明を採用しています。
+Hardhatは、[コントラクトのチュートリアル](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)で、これらのコードの各行が何をするかを非常にうまく説明しています。ここではその説明を採用しました。
```javascript
const HelloWorld = await ethers.getContractFactory("HelloWorld")
```
-ethers.jsの`ContractFactory`は新しいスマートコントラクトをデプロイするための抽象化であり、ここでの`HelloWorld`はhello worldコントラクトのインスタンスのための[ファクトリ](https://en.wikipedia.org/wiki/Factory_(object-oriented_programming))です。 `hardhat-ethers`プラグインを使用する場合、`ContractFactory`および`Contract`インスタンスはデフォルトで最初の署名者 (所有者) に接続されます。
+ethers.jsの `ContractFactory` は、新しいスマートコントラクトをデプロイするために使用される抽象化です。したがって、ここでの `HelloWorld` は、私たちのhello worldコントラクトのインスタンスのための[ファクトリ](https://en.wikipedia.org/wiki/Factory_\(object-oriented_programming\))です。 `hardhat-ethers`プラグインを使用する場合、`ContractFactory`と`Contract`のインスタンスは、デフォルトで最初の署名者 (所有者) に接続されます。
```javascript
const hello_world = await HelloWorld.deploy()
```
-`ContractFactory`で`deploy()`を呼び出すとデプロイメントが開始され、`Contract`オブジェクトに解決すべき`Promise`が返されます。 これは、スマートコントラクトの各関数に対するメソッドを持つオブジェクトです。
+`ContractFactory`で`deploy()`を呼び出すとデプロイが開始され、`Contract`オブジェクトに解決される`Promise`が返されます。 これは、スマートコントラクトの各関数に対するメソッドを持つオブジェクトです。
### ステップ16: コントラクトをデプロイする {#step-16-deploy-our-contract}
-ようやく、スマートコントラクトをデプロイする準備が整いました。 コマンドラインに移動し、以下を実行します。
+ようやく、スマートコントラクトをデプロイする準備が整いました。 コマンドラインに移動し、次を実行します:
```bash
npx hardhat run scripts/deploy.js --network goerli
@@ -349,34 +352,34 @@ npx hardhat run scripts/deploy.js --network goerli
次のような画面が表示されるはずです。
```bash
-Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
+コントラクトがデプロイされたアドレス: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
```
-**このアドレスを保存してください**。 このアドレスをチュートリアルの後半で使用します。
+**このアドレスを保存してください**。 このアドレスはチュートリアルの後半で使用します。
-[Goerli etherscan](https://goerli.etherscan.io)に移動し、コントラクトアドレスを検索すると、コントラクトが正常にデプロイされていることを確認できるはずです。 トランザクションは以下のようなものになります。
+[Goerli etherscan](https://goerli.etherscan.io) にアクセスしてコントラクトアドレスを検索すると、正常にデプロイされたことを確認できるはずです。 トランザクションは以下のようなものになります。

-`From`アドレスはMetaMaskアカウントのアドレスと一致し、`To`アドレスは「**Contract Creation**」と表示されます。 トランザクション内容をクリックすると、`To`フィールドにコントラクトアドレスが表示されます.
+`From`アドレスはMetaMaskアカウントのアドレスと一致し、`To`アドレスには**Contract Creation**と表示されます。 トランザクションをクリックすると、`To`フィールドにコントラクトアドレスが表示されます。

-おめでとうございます! イーサリアムのテストネットにスマートコントラクトをデプロイできました.
+おめでとうございます! Ethereumテストネットにスマートコントラクトをデプロイできました。
-内部で何が起こっているのかを理解するために、[Alchemyダッシュボード](https://dashboard.alchemyapi.io/explorer)のExplorerタブに移動してみましょう。 Alchemyのアプリが複数ある場合は、必ずアプリでフィルタリングし、「**Hello World**」を選択してください。
+内部で何が起こっているのかを理解するために、[Alchemyダッシュボード](https://dashboard.alchemy.com/explorer)のExplorerタブに移動してみましょう。 複数のAlchemyアプリをお持ちの場合は、必ずアプリでフィルタリングし、**Hello World**を選択してください。

-ここでは、`.deploy()`関数を呼び出した際に、HardhatもしくはEthersが内部で行ったJSON-RPCメソッドを見ることができます。 ここで2つの重要なメソッドがあります。まずは、[`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction)です。これは、Goerliチェーンにコントラクトを書き込むリクエストです。次に[`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash)は、ハッシュを指定してトランザクションに関する情報を読み取るリクエストです。 トランザクションの送信の詳細については、[こちら](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)のチュートリアルにあるWeb3を使用したトランザクションの送信をご覧ください。
+ここでは、`.deploy()`関数を呼び出した際に、Hardhat/Ethersが内部で行ったいくつかのJSON-RPCメソッドを見ることができます。 ここでの2つの重要なメソッドは、コントラクトをGoerliチェーンに書き込むリクエストである [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction) と、ハッシュが与えられたトランザクションに関する情報を読み取るリクエストである [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash) です。 トランザクションの送信についてさらに詳しく知るには、[Web3を使用したトランザクション送信に関するチュートリアル](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)を確認してください。
-## パート2: スマートコントラクトとのやり取り {#part-2-interact-with-your-smart-contract}
+## パート2: スマートコントラクトとインタラクトする {#part-2-interact-with-your-smart-contract}
スマートコントラクトをGoerliネットワークに正常にデプロイできました。それでは、スマートコントラクトとやり取りする方法について学びましょう。
-### interact.jsファイルの作成 {#create-a-interactjs-file}
+### interact.jsファイルを作成する {#create-a-interactjs-file}
-このファイルに、やり取りするスクリプトを記述します。 パート1でインストールしたEthers.jsライブラリを使用します。
+このファイルに、インタラクトするスクリプトを記述します。 パート1でインストールしたEthers.jsライブラリを使用します。
`scripts/`フォルダ内に、`interact.js`という名前の新しいファイルを作成し、次のコードを追加します。
@@ -388,9 +391,9 @@ const PRIVATE_KEY = process.env.PRIVATE_KEY
const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS
```
-### .envファイルの更新 {#update-your-env-file}
+### .envファイルを更新する {#update-your-env-file}
-新しい環境変数を使用します。そのため、[以前に作成した](#step-11-connect-metamask-&-alchemy-to-your-project)`.env`ファイルに定義する必要があります。
+新しい環境変数を使用するため、[以前に作成した](#step-11-connect-metamask-&-alchemy-to-your-project)`.env`ファイルに定義する必要があります。
Alchemyの`API_KEY`とスマートコントラクトがデプロイされている`CONTRACT_ADDRESS`の定義を加える必要があります。
@@ -407,14 +410,14 @@ CONTRACT_ADDRESS = "0x"
### コントラクトABIを取得する {#grab-your-contract-ABI}
-コントラクト[ABI(アプリケーションバイナリインターフェイス)](/glossary/#abi)は、スマートコントラクトと対話するためのインターフェイスです。 Hardhatは自動的にABIを生成して、`HelloWorld.json`ファイルに保存します。 ABIを使うには、`interact.js`ファイルに次のコードを追加して、コンテンツをパースする必要があります。
+コントラクトの[ABI (アプリケーションバイナリインターフェイス)](/glossary/#abi)は、スマートコントラクトとインタラクトするためのインターフェイスです。 Hardhatは自動的にABIを生成して、`HelloWorld.json`ファイルに保存します。 ABIを使うには、`interact.js`ファイルに次のコードを追加して、コンテンツをパースする必要があります。
```javascript
// interact.js
const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json")
```
-ABIを表示したい場合は、次のコードを追加することでコンソールに出力できます:
+ABIを確認したい場合は、コンソールに出力できます:
```javascript
console.log(JSON.stringify(contract.abi))
@@ -428,13 +431,13 @@ npx hardhat run scripts/interact.js
### コントラクトのインスタンスを作成する {#create-an-instance-of-your-contract}
-コントラクトを操作するには、コード内にコントラクトのインスタンスを作成する必要があります。 Ethers.jsでこれを行うには、次の3つのコンセプトを機能させる必要があります。
+コントラクトを操作するには、コード内にコントラクトのインスタンスを作成する必要があります。 Ethers.jsでこれを行うには、次の3つのコンセプトを扱う必要があります。
1. Provider - ブロックチェーンへの読み取りおよび書き込みアクセスを提供するノードプロバイダです。
-2. Signer - トランザクションに署名するイーサリアムアカウントを表します。
+2. Signer - トランザクションに署名するEthereumアカウントを表します。
3. Contract - オンチェーンにデプロイされた特定のコントラクトを表すEthers.jsのオブジェクトです。
-前の手順で取得したコントラクABIを使って、コントラクトのインスタンスを作成します。
+前の手順で取得したコントラクトABIを使って、コントラクトのインスタンスを作成します。
```javascript
// interact.js
@@ -458,11 +461,11 @@ const helloWorldContract = new ethers.Contract(
Provider、Signer、Contractの詳細については、[ethers.jsドキュメント](https://docs.ethers.io/v5/)をご覧ください。
-### initメッセージの読み取り {#read-the-init-message}
+### initメッセージを読み込む {#read-the-init-message}
-`initMessage = "Hello world!"`を使用してコントラクトをデプロイしたことを思い出せますでしょうか? ここでは、スマートコントラクトに保存されているメッセージを読み取り、コンソールに出力します。
+`initMessage = "Hello world!"`を使用してコントラクトをデプロイしたことを覚えていますか? ここでは、スマートコントラクトに保存されているメッセージを読み取り、コンソールに出力します。
-JavaScriptでは、ネットワークとのやり取りで非同期関数を使います。 非同期関数の詳細については、[この記事の中ほど](https://blog.bitsrc.io/Understanding-asynchronous-javascript-the-event-loop-74cd408419ff)をご覧ください。
+JavaScriptでは、ネットワークとのインタラクトで非同期関数を使います。 非同期関数についてさらに詳しく知るには、[このmediumの記事](https://blog.bitsrc.io/understanding-asynchronous-javascript-the-event-loop-74cd408419ff)をお読みください。
以下のコードを使用して、スマートコントラクトの`message`関数を呼び出し、initメッセージを読み取ります。
@@ -478,19 +481,19 @@ async function main() {
main()
```
-ターミナルで`npx hardware run scripts/interact.js`を入力してファイルを実行すると、次のレスポンスが表示されるはずです。
+ターミナルで `npx hardhat run scripts/interact.js` を使用してファイルを実行すると、次のようなレスポンスが表示されます。
```
The message is: Hello world!
```
-おめでとうございます! イーサリアムブロックチェーンからスマートコントラクトのデータを正常に読み取ることができました。
+おめでとうございます! Ethereumブロックチェーンからスマートコントラクトのデータを正常に読み取ることができました。お見事!
-### メッセージの更新 {#update-the-message}
+### メッセージを更新する {#update-the-message}
-メッセージを読み取るだけでなく、`update`関数を使ってスマートコントラクトに保存されたメッセージを更新することもできます。 かなりイケてますよね?
+メッセージを読み取るだけでなく、`update`関数を使ってスマートコントラクトに保存されたメッセージを更新することもできます。 かなりクールでしょう?
-メッセージを更新するには、インスタンス化されたコントラクトのオブジェクトで`update`関数を直接呼び出します。
+メッセージを更新するには、インスタンス化されたContractオブジェクトで`update`関数を直接呼び出します。
```javascript
// interact.js
@@ -508,13 +511,13 @@ async function main() {
main()
```
-11行目で、返されたトランザクションのオブジェクトに対して `.wait()`を呼び出していることに注目してください。 これにより、スクリプトが関数を終了する前に、トランザクションがブロックチェーン上でマイニングされるまで待機することを確実にします。 `.wait()`を呼び出しを含めなかった場合、スクリプトは、コントラクト内で更新された`message`の値を表示しないことがあります。
+11行目で、返されたトランザクションオブジェクトに対して `.wait()` を呼び出していることに注目してください。 これにより、スクリプトが関数を終了する前に、トランザクションがブロックチェーン上でマイニングされるまで待機することが保証されます。 `.wait()` の呼び出しを含めなかった場合、スクリプトは、コントラクト内で更新された `message` の値を表示しないことがあります。
-### 新しいメッセージの読み取り {#read-the-new-message}
+### 新しいメッセージを読み込む {#read-the-new-message}
-[前の手順](#read-the-init-message)を繰り返して、更新された`message`の値を読み取ることができるのに違いありません。 その新しい値を出力するために必要となる変更を、少し考えてみましょう!
+[前の手順](#read-the-init-message)を繰り返して、更新された `message` の値を読み取ることができるはずです。 少し時間を取って、新しい値を表示するために必要な変更を加えられるか試してみましょう!
-ヒントが必要ですか?この時点で、あなたの`interact.js`ファイルは次のようになるはずです。
+ヒントが必要な場合は、この時点で`interact.js`ファイルがどのようになるかを示します。
```javascript
// interact.js
@@ -556,7 +559,7 @@ async function main() {
main()
```
-このスクリプトを実行するだけで、古いメッセージ、更新ステータス、および新しいメッセージがコンソールに出力されるのを確認できるはずです。
+このスクリプトを実行するだけで、古いメッセージ、更新ステータス、および新しいメッセージがターミナルに出力されるのを確認できるはずです。
`npx hardhat run scripts/interact.js --network goerli`
@@ -566,29 +569,29 @@ Updating the message...
The new message is: This is the new message.
```
-このスクリプトの実行中、新しいメッセージが読み込まれる前に、 `Updating the message...`のステップの読み込みにしばらく時間がかかることに気づくかもしれません。 これはマイニングプロセスによるものです。マイニング中のトランザクションの追跡に興味があるならば、[Alchemy mempool](https://dashboard.alchemyapi.io/mempool)にアクセスしてトランザクションのステータスを確認できます。 トランザクションがドロップされた場合は、[Goerli Etherscan](https://goerli.etherscan.io)を確認してトランザクションのハッシュを検索することもできます。
+このスクリプトの実行中、新しいメッセージが読み込まれる前に、 `Updating the message...` のステップの読み込みにしばらく時間がかかることに気づくかもしれません。 これはマイニングプロセスによるものです。マイニング中のトランザクションの追跡に興味があるならば、[Alchemyメンプール](https://dashboard.alchemyapi.io/mempool)にアクセスしてトランザクションのステータスを確認できます。 トランザクションがドロップされた場合は、[Goerli Etherscan](https://goerli.etherscan.io) を確認してトランザクションハッシュを検索することも役立ちます。
## パート3: スマートコントラクトをEtherscanに公開する {#part-3-publish-your-smart-contract-to-etherscan}
-あなたは、スマートコントラクトに命を吹き込むことに大変な努力をしました。それでは、その努力を世界に共有しましょう!
+あなたは、スマートコントラクトに命を吹き込むために大変な努力をしました。さあ、その成果を世界に共有しましょう!
-Etherscanでスマートコントラクトを検証すると、誰でもソースコードを表示して、あなたのスマートコントラクトとやり取りできるようになります。 さあ、始めましょう!
+Etherscanでスマートコントラクトを検証すると、誰でもソースコードを表示して、あなたのスマートコントラクトとインタラクトできるようになります。 さあ、始めましょう!
### ステップ1: EtherscanアカウントでAPIキーを生成する {#step-1-generate-an-api-key-on-your-etherscan-account}
EtherscanのAPIキーは、公開しようとしているスマートコントラクトを所有していることを確認するために必要になります。
-Etherscanアカウントをお持ちでない場合は、[アカウントの登録](https://etherscan.io/register)をしてください。
+Etherscanアカウントをお持ちでない場合は、[アカウントにサインアップ](https://etherscan.io/register)してください。
-ログインしたら、ナビゲーションバーでユーザー名を見つけ、その上にマウスを移動して、「**My profile**」ボタンを選択します。
+ログインしたら、ナビゲーションバーでユーザー名を見つけ、その上にカーソルを合わせて **My profile** ボタンを選択します。
-プロフィールページにサイドナビゲーションバーが表示されます。 サイドナビゲーションバーで、**API Keys**を選択します。 次に、「Add」ボタンを押して新しいAPIキーを作成し、アプリに**hello-world**という名前を付けて、「**Create New API**」ボタンを押します。
+プロフィールページにサイドナビゲーションバーが表示されます。 サイドナビゲーションバーで、**API Keys**を選択します。 次に、「Add」ボタンを押して新しいAPIキーを作成し、アプリに **hello-world** という名前を付けて、「**Create New API Key**」ボタンを押します。
新しいAPIキーがAPIキーテーブルに表示されるはずです。 APIキーをクリップボードにコピーします。
次に、EtherscanのAPIキーを`.env`ファイルに加える必要があります。
-そうすると、`.env`ファイルは次のようになります。
+追加した後、`.env`ファイルは次のようになります。
```javascript
API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key"
@@ -598,17 +601,17 @@ CONTRACT_ADDRESS = "your-contract-address"
ETHERSCAN_API_KEY = "your-etherscan-key"
```
-### Hardhatにデプロイされたスマートコントラクト {#hardhat-deployed-smart-contracts}
+### Hardhatでデプロイされたスマートコントラクト {#hardhat-deployed-smart-contracts}
-#### hardhat-etherscanのインストール {#install-hardhat-etherscan}
+#### hardhat-etherscanをインストールする {#install-hardhat-etherscan}
-あなたのコントラクトをEtherscanへ公開するのは、Hardhatを使って簡単にできます。 はじめに、まず`hardhat-etherscan`プラグインをインストールしてください。 `hardhat-etherscan`は、スマートコントラクトのソースコードとEtherscan上のABIを自動的に検証します。 インストールするには、`hello-world`ディレクトリで次のコマンドを実行します。
+Hardhatを使ってコントラクトをEtherscanへ公開するのは簡単です。 まず、`hardhat-etherscan`プラグインをインストールする必要があります。 `hardhat-etherscan`は、スマートコントラクトのソースコードとEtherscan上のABIを自動的に検証します。 インストールするには、`hello-world`ディレクトリで次のコマンドを実行します。
```text
npm install --save-dev @nomiclabs/hardhat-etherscan
```
-インストールをしたら、`hardhat.config.js`の先頭に次のステートメントを含んだEtherscan構成オプションを追加します。
+インストールしたら、`hardhat.config.js`の先頭に次のステートメントを含め、Etherscanの構成オプションを追加します。
```javascript
// hardhat.config.js
@@ -630,14 +633,14 @@ module.exports = {
},
},
etherscan: {
- // Your API key for Etherscan
- // Obtain one at https://etherscan.io/
+ // Etherscan用のAPIキー
+ // https://etherscan.io/ で取得
apiKey: ETHERSCAN_API_KEY,
},
}
```
-#### Etherscan上でスマートコントラクトを検証する {#verify-your-smart-contract-on-etherscan}
+#### Etherscanでスマートコントラクトを検証する {#verify-your-smart-contract-on-etherscan}
すべてのファイルが保存され、すべての`.env`変数が正しく構成されていることを確認してください。
@@ -647,9 +650,9 @@ module.exports = {
npx hardhat verify --network goerli DEPLOYED_CONTRACT_ADDRESS 'Hello World!'
```
-`DEPLOYED_CONTRACT_ADDRESS`がGoerliテストネットワーク上にデプロイされたスマートコントラクトのアドレスであることを確認してください。 また、最後の引数 (`'Hello World!'`) は、 [パート1のデプロイ手順](#write-our-deploy-script)で使われたの文字列値と同じでなければなりません。
+`DEPLOYED_CONTRACT_ADDRESS`がGoerliテストネットワーク上にデプロイされたスマートコントラクトのアドレスであることを確認してください。 また、最後の引数(`'Hello World!'`)は、[パート1のデプロイスクリプト作成手順](#write-our-deploy-script)で使用した文字列値と同じでなければなりません。
-順調に行けば、コンソールに次のメッセージが表示されます。
+すべてが順調に進めば、ターミナルに次のメッセージが表示されます。
```text
Successfully submitted source code for contract
@@ -661,69 +664,69 @@ Successfully verified contract HelloWorld on Etherscan.
https://goerli.etherscan.io/address/#contracts
```
-おめでとうございます! これで、あなたのスマートコントラクトコードは、Etherscan上にあります。
+おめでとうございます! これで、あなたのスマートコントラクトコードはEtherscan上にあります。
-### Etherscanであなたのスマートコントラクトを確認する {#check-out-your-smart-contract-on-etherscan}
+### Etherscanであなたのスマートコントラクトを確認しましょう! {#check-out-your-smart-contract-on-etherscan}
-コンソールに表示されているリンクに移動すると、Etherscanで公開されているスマートコントラクトコードとABIが表示されます。
+ターミナルに表示されているリンクに移動すると、Etherscanで公開されているスマートコントラクトコードとABIが表示されます。
-**ヤッホー!栄冠を手にしました。 これで、誰でもスマートコントラクトを呼び出したり、書き込んだりできるようになりました。 次にあなたが何を構築するか楽しみにしています。**
+**ヤッター!やりましたね! これで、誰でもスマートコントラクトを呼び出したり、書き込んだりできるようになりました。 次にあなたが何を構築するか楽しみにしています。**
-## パート4: フロントエンドとスマートコントラクトの統合 {#part-4-integrating-your-smart-contract-with-the-frontend}
+## パート4 - スマートコントラクトをフロントエンドと統合する {#part-4-integrating-your-smart-contract-with-the-frontend}
このチュートリアルを終えると、次の方法がわかるようになります。
- MetaMaskウォレットをdappに接続する
-- [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) APIを使用してスマートコントラクトからデータを読み取る。
-- MetaMaskを使用してイーサリアムトランザクションに署名する
+- [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) APIを使用してスマートコントラクトからデータを読み取る
+- MetaMaskを使用してEthereumトランザクションに署名する
-このdappでは、フロントエンドフレームワークで[React](https://reactjs.org/)を使っていますが、Web3の機能をプロジェクトに導入することに焦点を当てているので、Reactの基本を説明することに多くの時間を費やさないことに注意してください。
+このdappでは、フロントエンドフレームワークとして[React](https://react.dev/)を使用します。ただし、このプロジェクトではWeb3機能を導入することに主に焦点を当てているため、Reactの基礎を詳しく説明する時間はあまりかけない点に注意してください。
-前提条件として、Reactについて初心者レベルの理解をしている必要があります。 知らなければ、公式の[React入門チュートリアル](https://reactjs.org/tutorial/tutorial.html)を読むことをお勧めします。
+前提条件として、Reactについて初心者レベルの理解をしている必要があります。 そうでない場合は、公式の[React入門チュートリアル](https://react.dev/learn)を完了することをお勧めします。
-### スターターファイルのクローン {#clone-the-starter-files}
+### スターターファイルをクローンする {#clone-the-starter-files}
-まず、このプロジェクトの開始ファイルを取得するために[「hello-world-part-four」GitHubリポジトリ](https://github.com/alchemyplatform/hello-world-part-four-tutorial)に行き、このリポジトリのクローンをローカルマシンに作成します。
+まず、[hello-world-part-four GitHubリポジトリ](https://github.com/alchemyplatform/hello-world-part-four-tutorial)にアクセスして、このプロジェクトのスターターファイルを取得し、このリポジトリをローカルマシンにクローンします。
-クローンしたリポジトリをローカルで開きます。 `starter-files`と`completed`の2つのフォルダが含まれています。
+クローンしたリポジトリをローカルで開きます。 `starter-files`と`completed`の2つのフォルダが含まれていることに注意してください。
-- `starter-files` - **このディレクトリで作業します**。UIをイーサリアムウォレットおよび[パート3](#part-3)でEtherscanに公開したスマートコントラクトに接続します。
+- `starter-files` - **このディレクトリで作業します**。UIをEthereumウォレットおよび[パート3](#part-3)でEtherscanに公開したスマートコントラクトに接続します。
- `completed`には、チュートリアル全体が完了したものが入っています。行き詰まった場合にのみ、参考として使ってください。
次に、`starter-files`のコピーをお気に入りのコードエディタで開き、`src`フォルダに移動します。
-これから作成するすべてのコードは、`src`フォルダに保存されます。 `HelloWorld.js`コンポーネントと JavaScriptファイルである`util/interact.js`を編集して、プロジェクトにWeb3の機能を追加していきます。
+私たちが書くコードはすべて`src`フォルダの下に置かれます。 `HelloWorld.js`コンポーネントと`util/interact.js`JavaScriptファイルを編集して、プロジェクトにWeb3機能を追加します。
-### スターターファイルの確認 {#check-out-the-starter-files}
+### スターターファイルを確認する {#check-out-the-starter-files}
コーディングを開始する前に、スターターファイルで提供されるものを探索してみましょう。
-#### Reactプロジェクトの実行 {#get-your-react-project-running}
+#### Reactプロジェクトを実行する {#get-your-react-project-running}
まずは、ブラウザでReactプロジェクトを実行しましょう。 Reactの素晴らしいところは、一度ブラウザでプロジェクトを実行すると、保存した変更がブラウザでも同時に更新されることです。
-プロジェクトを実行するには、次のようにターミナルで`starter-files`フォルダのルートディレクトリに移動し、`npm install`を実行してプロジェクトの依存関係をインストールします。
+プロジェクトを実行するには、`starter-files`フォルダのルートディレクトリに移動し、ターミナルで`npm install`を実行してプロジェクトの依存関係をインストールします。
```bash
cd starter-files
npm install
```
-インストールが完了したら、ターミナルで`npm start`を実行します。
+インストールが完了したら、ターミナルで`npm start`を実行します:
```bash
npm start
```
-これにより、ブラウザで[http://localhost:3000/](http://localhost:3000/)を開くと、プロジェクトのフロントエンドが表示されます。 これは、1つのフィールド \(スマートコントラクトに保存されているメッセージを更新する場所\) である「Connect Wallet」ボタン、および「Update」ボタンで構成されています。
+これにより、ブラウザで[http://localhost:3000/](http://localhost:3000/)が開かれ、プロジェクトのフロントエンドが表示されます。 これは、1つのフィールド \(スマートコントラクトに保存されているメッセージを更新する場所\)、「Connect Wallet」ボタン、および「Update」ボタンで構成されています。
-どちらのボタンをクリックしても、機能しないことがわかります。この機能をプログラムする必要があるためです。
+どちらのボタンをクリックしても機能しないことに気づくでしょう。これは、まだその機能をプログラムする必要があるためです。
#### `HelloWorld.js`コンポーネント {#the-helloworld-js-component}
エディタの`src`フォルダに戻り、`HelloWorld.js`ファイルを開きましょう。 このファイルには、これから作業を進めていく主要なReactコンポーネントが含まれています。すべての内容を理解することが非常に重要です。
-このファイルの先頭には、いくつかの重要なステートメントがあるこに気が付くでしょう。Reactライブラリ、useEffectフックとuseStateフック、`./util/interact.js`のいくつかのアイテムなど、プロジェクトを実行するために必要になります (これらについては、すぐに詳しく説明します!) 。また、Alchemyのロゴがあります
+このファイルの先頭には、プロジェクトを実行するために必要な、Reactライブラリ、useEffectフックとuseStateフック、`./util/interact.js`からのいくつかのアイテム (これらについては、すぐに詳しく説明します!)、そしてAlchemyのロゴなど、いくつかのimport文があることに気づくでしょう。
```javascript
// HelloWorld.js
@@ -753,14 +756,14 @@ const [message, setMessage] = useState("No connection to the network.")
const [newMessage, setNewMessage] = useState("")
```
-それぞれの変数は以下の用途で使われます。
+それぞれの変数は以下の内容を表します。
- `walletAddress` - ユーザーのウォレットアドレスを格納する文字列
-- `status` - ユーザーにdappの操作方法を案内する補助メッセージを文字列として格納する
+- `status`- ユーザーにdappのインタラクト方法を案内する補助メッセージを格納する文字列
- `message` - スマートコントラクトの現在のメッセージを格納する文字列
- `newMessage` - スマートコントラクトに書き込まれる新しいメッセージを格納する文字列
-ステート変数の後に、`useEffect` 、`addSmartContractListener`、 `addWalletListener`、 `connectWalletPressed`、`onUpdatePressed`の未実装の5つの関数があります。 次に、それらが何をするのかを説明します。
+ステート変数の後に、`useEffect`、`addSmartContractListener`、`addWalletListener`、`connectWalletPressed`、`onUpdatePressed`の5つの未実装の関数があります。 次に、それらが何をするのかを説明します。
```javascript
// HelloWorld.js
@@ -787,10 +790,10 @@ const onUpdatePressed = async () => {
}
```
-- [`useEffect`](https://reactjs.org/docs/hooks-effect.html)- コンポーネントがレンダリングされた後に呼び出されるReactフックです。 空の配列`[]`のプロップが渡されているため \(4行目を参照\)、コンポーネントの_最初_のレンダリングでのみ呼び出されます。 ここでは、スマートコントラクトに保存されている現在のメッセージのロード、スマートコントラクトとウォレットリスナーの呼び出し、ウォレットが既に接続されているかどうかを反映してUIを更新するのに使います。
+- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) - これは、コンポーネントがレンダリングされた後に呼び出されるReactフックです。 空の配列`[]`のプロップが渡されているため \(4行目を参照\)、コンポーネントの_最初の_レンダリングでのみ呼び出されます。 ここでは、スマートコントラクトに保存されている現在のメッセージをロードし、スマートコントラクトとウォレットリスナーを呼び出し、ウォレットが既に接続されているかどうかを反映してUIを更新します。
- `addSmartContractListener` - この関数では、HelloWorldコントラクトの`UpdatedMessages`イベントを監視し、スマートコントラクトでメッセージが変更されたときにUIを更新するリスナーを設定します。
- `addWalletListener` - この関数では、ユーザーがウォレットを切断したときやアドレスを切り替えたときなど、ユーザーのMetaMaskウォレットのステートの変化を検出するリスナーを設定します。
-- `connectWalletPressed` - この関数は、ユーザーのMetaMaskウォレットをdappに接続するのに呼び出されます。
+- `connectWalletPressed`- この関数は、ユーザーのMetaMaskウォレットをdappに接続するのに呼び出されます。
- `onUpdatePressed` - この関数は、ユーザーがスマートコントラクトに保存されているメッセージを更新したいときに呼び出されます。
このファイルの終盤には、コンポーネントのUIがあります。
@@ -830,32 +833,33 @@ return (
-
-
+
+
+
)
```
このコードを注意深く読むと、さまざまなステート変数がUIのどの場所で使用されているかがわかります。
-- 6~12行目では、ユーザーのウォレットが接続されている場合 \(すなわち、`walletAddress.length > 0`\)、 ID「walletButton;」に省略されたユーザーの`walletAddress`がボタンに表示されます。 それ以外の場合は、単に「Connect Wallet」と表示されます。
+- 6~12行目では、ユーザーのウォレットが接続されている場合 \(すなわち`walletAddress.length > 0`\)、ID「walletButton」のボタンに省略されたユーザーの`walletAddress`が表示されます。それ以外の場合は、単に「Connect Wallet」と表示されます。
- 17行目では、`message`文字列でキャプチャされたスマートコントラクトに保存されている現在のメッセージを表示します。
-- 23~26行目では、テキストフィールドの入力が変化したときに[制御コンポーネント](https://reactjs.org/docs/forms.html#controlled-components)を使用して `newMessage`ステート変数を更新します。
+- 23~26行目では、[制御されたコンポーネント](https://legacy.reactjs.org/docs/forms.html#controlled-components)を使用して、テキストフィールドの入力が変化したときに`newMessage`ステート変数を更新します。
-ステート変数に加えて、IDが`publishButton`と`walletButton`である、それぞれがクリックされると`connectWalletPressed`および`onUpdatePressed`関数が呼び出されることがわります。
+ステート変数に加えて、IDが`publishButton`と`walletButton`であるボタンがそれぞれクリックされると、`connectWalletPressed`および`onUpdatePressed`関数が呼び出されることがわかります。
最後に、この`HelloWorld.js`コンポーネントがどこに加えられるかについて説明します。
-他のすべてのコンポーネントのコンテナとして機能する、Reactのメインコンポーネントである`App.js`ファイルを表示すると、`HelloWorld.js`コンポーネントが7行目に挿入されていることが分かります。
+`App.js`ファイルは、他のすべてのコンポーネントのコンテナとして機能するReactのメインコンポーネントですが、このファイルを表示すると、`HelloWorld.js`コンポーネントが7行目に挿入されていることが分かります。
-最後の最後となりますが、提供されているもう1つのファイル、`interact.js`ファイルを確認してみましょう。
+最後に、提供されているもう1つのファイル、`interact.js`ファイルを確認してみましょう。
#### `interact.js`ファイル {#the-interact-js-file}
-[M-V-C](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)のパラダイムを実践したいので、dappのロジック、データ、ルールを管理するすべての関数を含んだファイルを分割し、これらの関数をフロントエンド \(`HelloWorld.js`コンポーネント\) にエクスポートできるようにします。
+[M-V-C](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)パラダイムに従うため、dappのロジック、データ、ルールを管理するすべての関数を含む個別のファイルを作成し、それらの関数をフロントエンド \(私たちの`HelloWorld.js`コンポーネント\) にエクスポートできるようにします。
-👆🏽まさにこれが`interact.js`ファイルの目的です。
+👆🏽まさにこれが`interact.js`ファイルの目的です!
-`src`ディレクトリの`util`フォルダに移動すると、`interact.js`というファイルが含まれていることがわかります。これには、スマートコントラクトとのやり取り、ウォレット関数と変数が含まれています。
+`src`ディレクトリの`util`フォルダに移動すると、`interact.js`というファイルが含まれていることがわかります。これには、すべてのスマートコントラクトとのインタラクション、ウォレット関数、変数が含まれています。
```javascript
// interact.js
@@ -875,35 +879,35 @@ export const updateMessage = async (message) => {}
`helloWorldContract`オブジェクトの後の4つの未実装の関数は、次のことを行います。
-- `loadCurrentMessage` - この関数は、スマートコントラクトに保存されている現在のメッセージをロードするロジックを扱います。 [Alchemy Web3 API](https://github.com/alchemyplatform/alchemy-web3)を使ってHello Worldスマートコントラクトの_read_の呼び出しを行います。
-- `connectWallet` - この関数は、私たちのdappをユーザーのMetaMaskに接続します。
-- `getCurrentWalletConnected` - この関数は、ページの読み込み時にイーサリアムアカウントが既にdappに接続されているかどうかを確認し、それに応じてUIを更新します。
-- `updateMessage` - この関数は、スマートコントラクトに保存されているメッセージを更新します。 Hello Worldスマートコントラクトで_write_の呼び出しが行われるため、ユーザーのMetaMaskウォレットでは、メッセージを更新するためにイーサリアムトランザクションに署名する必要があります。
+- `loadCurrentMessage` - この関数は、スマートコントラクトに保存されている現在のメッセージをロードするロジックを扱います。 [Alchemy Web3 API](https://github.com/alchemyplatform/alchemy-web3)を使用して、Hello Worldスマートコントラクトへの_読み取り_呼び出しを行います。
+- `connectWallet` - この関数は、ユーザーのMetaMaskをdappに接続します。
+- `getCurrentWalletConnected` - この関数は、ページの読み込み時にEthereumアカウントが既にdappに接続されているかどうかを確認し、それに応じてUIを更新します。
+- `updateMessage` - この関数は、スマートコントラクトに保存されているメッセージを更新します。 Hello Worldスマートコントラクトで_書き込み_呼び出しが行われるため、ユーザーのMetaMaskウォレットでは、メッセージを更新するためにEthereumトランザクションに署名する必要があります。
何をするか理解したので、スマートコントラクトから読み取る方法を解明していきましょう。
-### ステップ3: スマートコントラクトからの読み込み {#step-3-read-from-your-smart-contract}
+### ステップ3: スマートコントラクトから読み取る {#step-3-read-from-your-smart-contract}
スマートコントラクトから読み取るには、次の設定を正しく行う必要があります。
-- イーサリアムチェーンへのAPI接続
-- あなたのスマートコントラクトがロードされたインスタンス
+- EthereumチェーンへのAPI接続
+- スマートコントラクトのロードされたインスタンス
- スマートコントラクトの関数を呼び出す関数
- スマートコントラクトから読み取っているデータが変更されたときの更新を監視するリスナー
-手順がたくさんあるように感じますが、心配しないでください! それぞれの方法を1つずつ説明していきます。 :\)
+手順がたくさんあるように感じますが、心配しないでください! それぞれの方法を1つずつ説明していきます。 :)
-#### イーサリアムチェーンへのAPI接続を確立する {#establish-an-api-connection-to-the-ethereum-chain}
+#### EthereumチェーンへのAPI接続を確立する {#establish-an-api-connection-to-the-ethereum-chain}
-チュートリアルのパート2で私たちは、[Alchemy Web3キーを使ってスマートコントラクトから読み込みました](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library)。 チェーンから読み取るには、あなたのdappでAlchemy Web3キーがまた必要になります。
+このチュートリアルのパート2で、[Alchemy Web3キーを使用してスマートコントラクトから読み取った](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library)ことを覚えていますか? チェーンから読み取るには、dappでAlchemy Web3キーも必要になります。
-もしなければ、最初に、 `starter-files`のルートディレクトリへ移動して、次のコマンドをコンソールで実行して[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)をインストールしてください。
+まだインストールしていない場合は、まず`starter-files`のルートディレクトリに移動し、ターミナルで次のコマンドを実行して[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)をインストールしてください。
```text
npm install @alch/alchemy-web3
```
-[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)は、[Web3.js](https://docs.web3js.org/)のラッパーであり、強化されたAPIメソッドや重要なメリットを提供し、Web3デベロッパーの負担を軽減します。 最小限の設定で使えるように設計されているので、アプリですぐに使用可能です。
+[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)は[Web3.js](https://docs.web3js.org/)のラッパーであり、強化されたAPIメソッドやその他の重要なメリットを提供し、web3開発者としての作業を容易にします。 最小限の設定で使えるように設計されているので、アプリですぐに使用可能です。
次に、[dotenv](https://www.npmjs.com/package/dotenv)パッケージをプロジェクトディレクトリにインストールします。これにより、APIキーを取得した後に安全な場所に保管できるようになります。
@@ -911,15 +915,15 @@ npm install @alch/alchemy-web3
npm install dotenv --save
```
-dappでは、HTTP API キーの代わりに**Websockets APIキー**を使用します。これにより、スマートコントラクトに保存されたメッセージが変更されたときに検出するリスナーを設定できます。
+dappでは、HTTP APIキーの代わりに**Websockets APIキーを使用します**。これにより、スマートコントラクトに保存されたメッセージが変更されたときに検出するリスナーを設定できます。
-APIキーを取得したら、ルートディレクトリに `.env`ファイルを作成し、Alchemy Websocketsの URLを.envファイルに加えます。 `.env`ファイルは次のようになります。
+APIキーを取得したら、ルートディレクトリに `.env`ファイルを作成し、Alchemy Websocketsの URLをそのファイルに追加します。 その後、`.env`ファイルは次のようになります。
```javascript
REACT_APP_ALCHEMY_KEY = wss://eth-goerli.ws.alchemyapi.io/v2/
```
-これで、私たちのdappにAlchemy Web3エンドポイントを設定する準備が整いました。 `util`フォルダー内に入っている`interact.js`に戻り、ファイルの先頭に次のコードを加えてください。
+これで、dappにAlchemy Web3エンドポイントを設定する準備が整いました。 `util`フォルダー内に入っている`interact.js`に戻り、ファイルの先頭に次のコードを加えてください。
```javascript
// interact.js
@@ -932,23 +936,23 @@ const web3 = createAlchemyWeb3(alchemyKey)
//export const helloWorldContract;
```
-上記のコードでは、まず`.env`ファイルから Alchemyキーをインポートし、次に`alchemyKey`を`createAlchemyWeb3`に渡してAlchemy Web3エンドポイントへ確立しています。
+上記のコードでは、まず`.env`ファイルから Alchemyキーをインポートし、次に`alchemyKey`を`createAlchemyWeb3`に渡してAlchemy Web3エンドポイントを確立しています。
エンドポイントの準備できたので、スマートコントラクトをロードするときです!
#### Hello Worldスマートコントラクトをロードする {#loading-your-hello-world-smart-contract}
-Hello Worldスマートコントラクトをロードするには、そのコントラクトアドレスとABIが必要です。[このチュートリアルのパート3](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan)を終了していれば、両方ともEtherscanから入手できます。
+Hello Worldスマートコントラクトをロードするには、そのコントラクトアドレスとABIが必要です。これらは、[このチュートリアルのパート3](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan)を完了していれば、Etherscanで見つけることができます。
-#### EtherscanからコントラクトABIを入手する方法 {#how-to-get-your-contract-abi-from-etherscan}
+#### EtherscanからコントラクトABIを取得する方法 {#how-to-get-your-contract-abi-from-etherscan}
-このチュートリアルのパート3を飛ばした場合は、アドレス[0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code)にあるHelloWorldコントラクトを使ってください。 ABIは、[こちら](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code)にあります。
+このチュートリアルのパート3を飛ばした場合は、アドレス[0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code)のHelloWorldコントラクトを使用できます。 そのABIは[こちら](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code)で見つけることができます。
-コントラクトのABIは、コントラクトが呼び出す関数を指定し、関数が確実に意図しているフォーマットでデータを返すようにするために必要です。 コントラクトABIをコピーしたら、それを`contract-abi.json`という名前のJSONファイルとして`src`ディレクトリに保存しましょう。
+コントラクトのABIは、コントラクトが呼び出す関数を指定し、関数が期待するフォーマットでデータを確実に返すようにするために必要です。 コントラクトABIをコピーしたら、それを`contract-abi.json`という名前のJSONファイルとして`src`ディレクトリに保存しましょう。
contract-abi.jsonは、srcフォルダーに格納されている必要があります。
-コントラクトアドレス、ABI、Alchemy Web3エンドポイントを用意することで、[コントラクトメソッド](https://docs.web3js.org/api/web3-eth-contract/class/Contract)を使ってスマートコントラクトのインスタンスをロードすることができます。 コントラクトABIを`interact.js`ファイルにインポートし、コントラクトアドレスを加えます。
+コントラクトアドレス、ABI、Alchemy Web3エンドポイントを用意したので、[contractメソッド](https://docs.web3js.org/api/web3-eth-contract/class/Contract)を使ってスマートコントラクトのインスタンスをロードすることができます。 コントラクトABIを`interact.js`ファイルにインポートし、コントラクトアドレスを加えます。
```javascript
// interact.js
@@ -986,11 +990,11 @@ export const helloWorldContract = new web3.eth.Contract(
)
```
-私たちのコントラクトがロードされたので、`loadCurrentMessage`関数を実装できます!
+コントラクトがロードされたので、`loadCurrentMessage`関数を実装できます!
#### `interact.js`ファイルに`loadCurrentMessage`を実装する {#implementing-loadCurrentMessage-in-your-interact-js-file}
-これは非常にシンプルな関数です。 私たちのコントラクトから読み取るのに、単純な非同期のWeb3の呼び出しを作成します。 この関数では、スマートコントラクトに保存されているメッセージを返します。
+これは非常にシンプルな関数です。 コントラクトから読み取るために、単純な非同期のweb3呼び出しを作成します。 この関数では、スマートコントラクトに保存されているメッセージを返します。
`interact.js`ファイルの `loadCurrentMessage`を次のように更新してください。
@@ -1015,48 +1019,48 @@ useEffect(async () => {
}, [])
```
-`loadCurrentMessage`は、コンポーネントの最初のレンダリングで1回だけ呼び出されることに注目してください。 この後、`addSmartContractListener`を実装して、スマートコントラクト内のメッセージが変更された後にUIを自動的に更新できるようにします。
+注: `loadCurrentMessage`は、コンポーネントの最初のレンダリング時に1回だけ呼び出されるようにします。 この後、`addSmartContractListener`を実装して、スマートコントラクト内のメッセージが変更された後にUIを自動的に更新できるようにします。
-リスナーについて詳しく説明する前に、これまでの内容を確認してみましょう! `HelloWorld.js`ファイルと`interact.js`ファイルを保存し、[http://localhost: 3000/](http://localhost:3000/)へアクセスしてください。
+リスナーについて詳しく説明する前に、これまでの内容を確認してみましょう! `HelloWorld.js`ファイルと`interact.js`ファイルを保存し、[http://localhost:3000/](http://localhost:3000/)にアクセスしてください。
-現在、「ネットワークに接続されていません」というメッセージが表示されなくなっていることがわかります。 代わりに、スマート コントラクトに保存されているメッセージが反映されます。 カッコイイ!
+現在、「ネットワークに接続されていません」というメッセージが表示されなくなっていることがわかります。 代わりに、スマートコントラクトに保存されているメッセージが反映されます。 カッコイイ!
-#### 今や、UIにスマートコントラクトに保存されたメッセージが反映されるようになりました。 {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract}
+#### UIにスマートコントラクトに保存されたメッセージが反映されるはずです {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract}
それでは、リスナーについて説明していきます。
#### `addSmartContractListener`を実装する {#implement-addsmartcontractlistener}
-[このチュートリアルのパート1](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract)で記述した`HelloWorld.sol`ファイルについて振り返ると、`UpdatedMessages`というスマートコントラクトのイベントがあったと思います。このイベントは、スマートコントラクトの`update`関数が呼び出された後に発行されます \(9 行目と27行目を参照\)。
+このチュートリアルシリーズの[パート1で作成した`HelloWorld.sol`ファイル](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract)を思い出すと、スマートコントラクトの`update`関数が呼び出された後に`UpdatedMessages`というスマートコントラクトイベントが発行されることを思い出すでしょう(9行目と27行目を参照)。
```javascript
// HelloWorld.sol
-// Specifies the version of Solidity, using semantic versioning.
-// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+// Solidityのバージョンをセマンティックバージョニングで指定します。
+// 詳細: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
pragma solidity ^0.7.3;
-// Defines a contract named `HelloWorld`.
-// A contract is a collection of functions and data (its state). Once deployed, a contract resides at a specific address on the Ethereum blockchain. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+// `HelloWorld` という名前のコントラクトを定義します。
+// コントラクトは関数とデータ (その状態) の集合です。一度デプロイされると、コントラクトはEthereumブロックチェーン上の特定のアドレスに存在します。詳細: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
contract HelloWorld {
- //Emitted when update function is called
- //Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen.
+ // update関数が呼び出されたときに発行されます
+ //スマートコントラクトのイベントは、ブロックチェーン上で何かが起こったことをコントラクトがアプリのフロントエンドに伝える方法です。フロントエンドは特定のイベントを「リッスン」し、それが起こったときに行動を起こすことができます。
event UpdatedMessages(string oldStr, string newStr);
- // Declares a state variable `message` of type `string`.
- // State variables are variables whose values are permanently stored in contract storage. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value.
+ // `string` 型の状態変数 `message` を宣言します。
+ // 状態変数は、その値がコントラクトのストレージに永続的に保存される変数です。`public` キーワードにより、変数はコントラクトの外部からアクセス可能になり、他のコントラクトやクライアントが値をアクセスするために呼び出せる関数が作成されます。
string public message;
- // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation.
- // Constructors are used to initialize the contract's data. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ // 多くのクラスベースのオブジェクト指向言語と同様に、コンストラクタはコントラクト作成時に一度だけ実行される特別な関数です。
+ // コンストラクタはコントラクトのデータを初期化するために使用されます。詳細:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
constructor(string memory initMessage) {
- // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable).
+ // 文字列引数 `initMessage` を受け取り、その値をコントラクトの `message` ストレージ変数に設定します)。
message = initMessage;
}
- // A public function that accepts a string argument and updates the `message` storage variable.
+ // 文字列引数を受け取り、 `message` ストレージ変数を更新する公開関数です。
function update(string memory newMessage) public {
string memory oldMsg = message;
message = newMessage;
@@ -1065,9 +1069,9 @@ contract HelloWorld {
}
```
-スマートコントラクトイベントは、ブロックチェーンで何かが起こったこと \(すなわち、_イベント_の発生 \) をフロントエンドアプリケーションに伝える方法です。特定のイベントを「リスニング」して、それが起きた時にアクションを実行します。
+スマートコントラクトイベントは、ブロックチェーンで何かが起こったこと \(すなわち、_イベント_の発生\) をフロントエンドアプリケーションに伝える方法です。フロントエンドは特定のイベントを「リスニング」して、それが起きた時にアクションを実行します。
-具体的には、`addSmartContractListener`関数がHello Worldスマートコントラクトの`UpdatedMessages`イベントをリッスンしており、新しいメッセージを表示するようにUIの更新をします。
+`addSmartContractListener`関数は、具体的にはHello Worldスマートコントラクトの`UpdatedMessages`イベントをリッスンし、新しいメッセージを表示するようにUIを更新します。
`addSmartContractListener`を次のように変更します。
@@ -1081,7 +1085,7 @@ function addSmartContractListener() {
} else {
setMessage(data.returnValues[1])
setNewMessage("")
- setStatus("🎉 Your message has been updated!")
+ setStatus("🎉 メッセージが更新されました!")
}
})
}
@@ -1089,10 +1093,10 @@ function addSmartContractListener() {
リスナーがイベントを検出したときに何が起こるかを詳しく解説します。
-- イベントの発行時にエラーが発生した場合、そのエラーは`status`ステート変数を介してUIに反映する。
-- それ以外の場合は、返された`data`オブジェクトを使う。 `data.returnValues`は、配列にある最初のエレメントがインデックスの0に格納されている配列です。配列の最初のエレメントには前のメッセージが格納され、2番目のエレメントには更新されたメッセージが格納されます。 つまり、イベントが成功すると、`message`文字列を更新されたメッセージに設定し、`newMessage`文字列をクリアし、`status`ステート変数を更新します。 これにより、新しいメッセージがスマートコントラクトに公開されたことを反映しています。
+- イベントの発行時にエラーが発生した場合、そのエラーは`status`ステート変数を介してUIに反映されます。
+- それ以外の場合は、返された`data`オブジェクトを使います。 `data.returnValues`は、0からインデックス付けされた配列で、配列の最初の要素には前のメッセージが格納され、2番目の要素には更新されたメッセージが格納されます。 つまり、イベントが成功すると、`message`文字列を更新されたメッセージに設定し、`newMessage`文字列をクリアし、`status`ステート変数を更新して、新しいメッセージがスマートコントラクトに公開されたことを反映させます。
-最後に、`useEffect`関数でリスナーを呼び出して、`HelloWorld.js`コンポーネントの最初のレンダリング時にリスナーが初期化されるようにしましょう。 あなたの`useEffect`関数全体は、次のようになります。
+最後に、`useEffect`関数でリスナーを呼び出して、`HelloWorld.js`コンポーネントの最初のレンダリング時にリスナーが初期化されるようにしましょう。 全体として、`useEffect`関数は次のようになります。
```javascript
// HelloWorld.js
@@ -1104,43 +1108,43 @@ useEffect(async () => {
}, [])
```
-スマートコントラクトから読み取れるようになったので、スマートコントラクトに書き込む方法も理解できるとなおよいでしょう! ただし、dappに書き込むには、まずイーサリアムウォレットをdappに接続する必要があります。
+スマートコントラクトから読み取れるようになったので、スマートコントラクトに書き込む方法も理解できると素晴らしいですね! ただし、dappに書き込むには、まずEthereumウォレットをdappに接続する必要があります。
-それでは、次にイーサリアムウォレット \(MetaMask\) を設定し、それをdappに接続することに取り組んでいきましょう!
+それでは、次にEthereumウォレット \(MetaMask\) を設定し、それをdappに接続することに取り組みましょう!
-### ステップ4: イーサリアムウォレットのセットアップ {#step-4-set-up-your-ethereum-wallet}
+### ステップ4: Ethereumウォレットを設定する {#step-4-set-up-your-ethereum-wallet}
-イーサリアムチェーンに何かを書き込むには、ユーザーは仮想ウォレットの秘密鍵を使ってトランザクションに署名しなければなりません。 このチュートリアルでは、イーサリアムアカウントアドレスの管理に使用されるブラウザの仮想ウォレットである[MetaMask](https://metamask.io/)を使用します。これにより、エンドユーザーは、このランザクションの署名がとても簡単になります。
+Ethereumチェーンに何かを書き込むには、ユーザーは仮想ウォレットの秘密鍵を使ってトランザクションに署名しなければなりません。 このチュートリアルでは、Ethereumアカウントアドレスの管理に使用されるブラウザの仮想ウォレットである[MetaMask](https://metamask.io/)を使用します。これにより、エンドユーザーは、このトランザクションの署名が非常に簡単になります。
-イーサリアムのトランザクションの仕組みの詳細については、イーサリアム・ファウンデーションの[こちらのページ](/developers/docs/transactions/)をご覧ください。
+イーサリアム上のトランザクションの仕組みについてさらに詳しく知りたい場合は、イーサリアム・ファウンデーションの[こちらのページ](/developers/docs/transactions/)をご覧ください。
-#### MetaMaskをダウンロード {#download-metamask}
+#### MetaMaskをダウンロードする {#download-metamask}
-Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は\( 実際に支払いが発生しないように \)右上の「Goerli Test Network」に切り替えてください。
+MetaMaskアカウントは、[こちら](https://metamask.io/download)から無料でダウンロードして作成できます。 アカウントを作成するとき、またはすでにアカウントをお持ちの場合は、右上の「Goerli Test Network」に必ず切り替えてください \(実在の通貨を扱わないようにするため\)。
-#### フォーセットからイーサ(ETH)を追加 {#add-ether-from-a-faucet}
+#### フォーセットからetherを追加する {#add-ether-from-a-faucet}
-イーサリアムブロックチェーンでトランザクションに署名するには、偽のETHが必要になります。 ETHを取得するには、 [FaucETH](https://fauceth.komputing.org)にアクセスしてGoerliアカウントアドレスを入力し、「Request funds」をクリックしてください。 そしてドロップダウンで「Ethereum Testnet Goerli」を選択し、最後に「Request funds」ボタンを再度クリックします。 MetamaskアカウントにETHが表示されるはずです。
+Ethereumブロックチェーンでトランザクションに署名するには、偽のEthが必要です。 Ethを取得するには、[FaucETH](https://fauceth.komputing.org)にアクセスしてGoerliアカウントアドレスを入力し、「Request funds」をクリックし、ドロップダウンで「Ethereum Testnet Goerli」を選択し、最後に「Request funds」ボタンを再度クリックします。 MetamaskアカウントにETHが表示されるはずです。
-#### 残高の確認 {#check-your-balance}
+#### 残高を確認する {#check-your-balance}
-残高を再確認するために、[Alchemyのコンポーザーツール](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D)を使用して[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)をリクエストしてみましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 Metamaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。
+残高を確認するために、[Alchemyのcomposerツール](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D)を使用して[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)リクエストを行いましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 MetaMaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。
```text
{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}
```
-**注:** この結果の単位は、ETHではなくweiです。 weiはETHの最小単位として使われています。 weiからETHへ変換すると、1 eth = 10¹⁸ weiになります。 つまり、0xde0b6b3a7640000を10進数に変換すると、1\*10¹⁸となり、1 ETHに相当します。
+**注:** この結果はethではなくwei単位です。 weiはETHの最小単位として使われています。 weiからETHへ変換すると、1 eth = 10¹⁸ weiになります。 つまり、0xde0b6b3a7640000を10進数に変換すると、1\*10¹⁸となり、1 ETHに相当します。
-ご安心ください。 これで、偽のお金を手に入れました。 🤑
+ふう! これで、偽のお金を手に入れました。 🤑
-### ステップ5: メタマスクをUIへ接続する {#step-5-connect-metamask-to-your-UI}
+### ステップ5: MetaMaskをUIに接続する {#step-5-connect-metamask-to-your-UI}
MetaMaskウォレットが設定されたので、分散型アプリケーション(Dapp)を接続しましょう。
#### `connectWallet`関数 {#the-connectWallet-function}
-`interact.js`ファイルの`connectWallet`関数を実装します。この関数は、`HelloWorld.js`コンポーネントで呼び出します。
+`interact.js`ファイルで`connectWallet`関数を実装します。この関数は、`HelloWorld.js`コンポーネントで呼び出します。
`connectWallet`を次のように変更しましょう。
@@ -1154,7 +1158,7 @@ export const connectWallet = async () => {
method: "eth_requestAccounts",
})
const obj = {
- status: "👆🏽 Write a message in the text-field above.",
+ status: "👆🏽 上のテキストフィールドにメッセージを書き込んでください。",
address: addressArray[0],
}
return obj
@@ -1172,8 +1176,7 @@ export const connectWallet = async () => {
@@ -1187,20 +1190,20 @@ export const connectWallet = async () => {
まず、ブラウザで`window.ethereum`が有効になっているかどうかをチェックしています。
-`window.ethereum`は、MetaMaskおよび他のウォレットプロバイダーによって挿入されるグローバルAPIであり、ウェブサイトがユーザーのイーサリアムアカウントを要求できるようにするものです。 承認されると、ユーザーが接続しているブロックチェーンからデータを読み取ったり、メッセージやトランザクションへの署名をユーザーに提案したりできるようになります。 詳細については、[MetaMaskのドキュメント](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents)を参照してください。
+`window.ethereum`は、MetaMaskやその他のウォレットプロバイダーによって挿入されるグローバルAPIで、WebサイトがユーザーのEthereumアカウントを要求できるようにするものです。 承認されると、ユーザーが接続しているブロックチェーンからデータを読み取ったり、メッセージやトランザクションへの署名をユーザーに提案したりできるようになります。 詳細については[MetaMaskのドキュメント](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents)をご覧ください。
-`window.ethereum`が_存在しない_場合は、MeTaMaskがインストールされていないことを意味します。 その結果、空の文字列に設定された、返される`address`と、ユーザーがMetaMaskをインストールする必要があることを伝える`status`JSXオブジェクトが入ったJSONオブジェクトが返されます。
+`window.ethereum`が_存在しない_場合、それはMetaMaskがインストールされていないことを意味します。 これにより、返される`address`が空の文字列で、`status` JSXオブジェクトがユーザーにMetaMaskをインストールするよう促すJSONオブジェクトが返されます。
-`window.ethereum`が_存在_する場合、興味深いことが起こります。
+さて、`window.ethereum`が_存在する_場合、ここからが面白くなります。
-try/catch ループを使用して、[`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts)を呼び出すことでMetaMaskに接続しようとしています。 この関数を呼び出すと、ブラウザでMetaMaskが開き、ユーザーはウォレットを分散型アプリケーション(Dapp)に接続するように求められます。
+try/catchループを使用して、[`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts)を呼び出してMetaMaskへの接続を試みます。 この関数を呼び出すと、ブラウザでMetaMaskが開き、ユーザーはウォレットを分散型アプリケーション(Dapp)に接続するように求められます。
-- ユーザーが接続を選んだ場合、`method: "eth_requestAccounts"`は、分散型アプリケーション(Dapp)に接続されているすべてのユーザーのアカウントアドレスを含む配列を返します。 `connectWallet`関数は、配列内の_最初の_`address`と\(9 行目参照\)、ユーザーにスマートコントラクトにメッセージを書き込むように促す`status`メッセージが入ったJSONオブジェクトを返します。
-- ユーザーが接続を拒否した場合、JSONオブジェクトには、返される`address`に入る空の文字列と、ユーザーが接続を拒否したことを示す`status`メッセージが入ることになります。
+- ユーザーが接続を選んだ場合、`method: "eth_requestAccounts"`は、dappに接続されているすべてのユーザーのアカウントアドレスを含む配列を返します。 まとめると、`connectWallet`関数は、この配列の_最初の_`address`(9行目参照)と、ユーザーにスマートコントラクトへのメッセージを書き込むよう促す`status`メッセージを含むJSONオブジェクトを返します。
+- ユーザーが接続を拒否した場合、JSONオブジェクトには返される`address`の空文字列と、ユーザーが接続を拒否したことを示す`status`メッセージが含まれます。
これで、`connectWallet`関数を作成できたので、次のステップでは、この関数を`HelloWorld.js`コンポーネントに呼び出します。
-#### `connect Wallet`関数を`Hello World.js`UIコンポーネントに加える {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component}
+#### `connectWallet`関数を`HelloWorld.js`UIコンポーネントに追加する {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component}
`HelloWorld.js`にある `connectWalletPressed`関数に移動し、次のように更新します。
@@ -1216,19 +1219,19 @@ const connectWalletPressed = async () => {
`interact.js`ファイルによって、機能の大部分が`HelloWorld.js`コンポーネントからどのように抽象化されているかに注目してください。 これは、モデルビューコントローラ(M-V-C)パラダイムに準拠しているためです。
-`connectWalletPressed`では、単にインポートされた`connectWallet`関数のawait呼び出しを行っています。さらに、そのレスポンスを使用し、`status`と`walletAddress`変数を状態フックを介して更新しています。
+`connectWalletPressed`では、インポートした`connectWallet`関数をawaitで呼び出し、そのレスポンスを使って状態フックを介して`status`と`walletAddress`変数を更新します。
それでは、両方のファイル \(`HelloWorld.js`と`interact.js`\) を保存して、これまでのUIをテストしてみましょう。
-[http://localhost:3000/](http://localhost:3000/)でブラウザを開き、ページ右上にある「Connect Wallet」ボタンを押します。
+[http://localhost:3000/](http://localhost:3000/)ページでブラウザを開き、ページ右上にある「Connect Wallet」ボタンを押します。
MetaMaskがインストールされている場合は、ウォレットを分散型アプリケーション(Dapp)に接続するように求められます。 接続リクエストを承認します。
-ウォレットボタンに、接続した自分のアドレスが表示されているはずです。 やりましたね🔥
+ウォレットボタンに、接続した自分のアドレスが表示されているはずです! やった!🔥
-次に、ページを更新してみてください。変ですね。 ウォレットボタンによって、すでに接続しているにもかかわらずMetaMaskに接続するよう求められます。
+次に、ページを再読み込みしてみてください... これは奇妙です。 ウォレットボタンによって、すでに接続しているにもかかわらずMetaMaskに接続するよう求められます。
-しかし、恐れるに足りません。 `getCurrentWalletConnected`を実装することで、簡単にこれを修正できます。この関数は、アドレスが分散型アプリケーション(Dapp) にすでに接続されているかどうかを確認し、それに応じてUIを更新します。
+しかし、恐れることはありません! これを簡単に修正できます(分かりましたか?) `getCurrentWalletConnected`を実装することで、アドレスがすでにdappに接続されているかどうかを確認し、それに応じてUIを更新できます!
#### `getCurrentWalletConnected`関数 {#the-getcurrentwalletconnected-function}
@@ -1246,12 +1249,12 @@ export const getCurrentWalletConnected = async () => {
if (addressArray.length > 0) {
return {
address: addressArray[0],
- status: "👆🏽 Write a message in the text-field above.",
+ status: "👆🏽 上のテキストフィールドにメッセージを書き込んでください。",
}
} else {
return {
address: "",
- status: "🦊 Connect to MetaMask using the top right button.",
+ status: "🦊 右上のボタンを使ってMetaMaskに接続してください。",
}
}
} catch (err) {
@@ -1268,8 +1271,7 @@ export const getCurrentWalletConnected = async () => {
@@ -1279,9 +1281,9 @@ export const getCurrentWalletConnected = async () => {
}
```
-このコードは、前述の`connectWallet`関数に_非常に_似ています。
+このコードは、前のステップで作成した`connectWallet`関数に非常に似ています。
-主な違いとしては、ユーザーがウォレットに接続するためにMetaMaskを開く`eth_requestAccounts`メソッドを呼び出す代わりに、 ここでは`eth_accounts`メソッドを呼び出しています。これは、現在、分散型アプリケーション(Dapp)に接続されているMetaMaskのアドレスを含む配列を単に返すだけです。
+主な違いは、ユーザーがウォレットを接続するためにMetaMaskを開く`eth_requestAccounts`メソッドを呼び出す代わりに、ここでは`eth_accounts`メソッドを呼び出している点です。これは、現在dappに接続されているMetaMaskのアドレスを含む配列を単に返すだけです。
この関数を動作させるため、`HelloWorld.js`コンポーネントの`useEffect`関数で呼び出しましょう。
@@ -1299,13 +1301,13 @@ useEffect(async () => {
}, [])
```
-`walletAddress`状態変数と`status`状態変数を更新するのに、呼び出した`getCurrentWalletConnected`のレスポンスを使用していることに注目してください。
+`walletAddress`と`status`の状態変数を更新するのに、`getCurrentWalletConnected`の呼び出しのレスポンスを使用していることに注目してください。
このコードを加えたら、ブラウザウィンドウを更新してみてください。
素晴らしい! リフレッシュ後も、ボタンには接続されていることが示されており、接続されたウォレットのアドレスのプレビューが表示されているはずです。
-#### `addWalletListener`の実装 {#implement-addwalletlistener}
+#### `addWalletListener`を実装する {#implement-addwalletlistener}
分散型アプリケーション(Dapp)ウォレットの設定の最終ステップは、ウォレットリスナーを実装することです。これにより、ユーザーが接続を切断したり、アカウントを切り替えたりした場合など、ウォレットの状態が変更されたときにUIが更新されます。
@@ -1319,10 +1321,10 @@ function addWalletListener() {
window.ethereum.on("accountsChanged", (accounts) => {
if (accounts.length > 0) {
setWallet(accounts[0])
- setStatus("👆🏽 Write a message in the text-field above.")
+ setStatus("👆🏽 上のテキストフィールドにメッセージを書き込んでください。")
} else {
setWallet("")
- setStatus("🦊 Connect to MetaMask using the top right button.")
+ setStatus("🦊 右上のボタンを使ってMetaMaskに接続してください。")
}
})
} else {
@@ -1330,7 +1332,7 @@ function addWalletListener() {
)
@@ -1338,11 +1340,11 @@ function addWalletListener() {
}
```
-この時点で何が起こっているかを理解するのに私たちの助けは必要ないと思いますが、完璧な理解を目指しているので簡単に説明します。
+この時点で何が起こっているかを理解するのに私たちの助けは必要ないと思いますが、念のため、簡単に説明します。
-- まず、ブラウザで`window.ethereum`が有効になっているか\(すなわち MetaMaskがインストールされているか\)を関数がチェックしています。
- - 有効になっていない場合、ユーザーにMetaMaskのインストールを求めるJSX文字列を`status`状態変数に設定します。
- - 有効になっている場合、MetaMaskウォレットの状態変更をリッスンしている3行目の`window.ethereum.on("accountsChanged")`リスナーを設定します。この状態変更には、ユーザーが追加のアカウントを分散型アプリケーション(Dapp)に接続した場合、アカウントを切り替えた場合、アカウントを切断した場合が含まれます。 少なくとも1つのアカウントが接続されていれば、`accounts`配列の最初のアカウントがリスナーから返されたときに、`walletAddress`状態変数が更新されます。 それ以外の場合は、`walletAddress`に空の文字列が設定されます。
+- まず、この関数は`window.ethereum`が有効になっているか(つまり、MetaMaskがインストールされているか)をチェックします。
+ - 有効でない場合、`status`状態変数を、ユーザーにMetaMaskのインストールを促すJSX文字列に設定するだけです。
+ - 有効になっている場合、3行目のリスナー`window.ethereum.on("accountsChanged")`を設定します。これはMetaMaskウォレットの状態変更をリッスンします。これには、ユーザーがdappに追加のアカウントを接続した場合、アカウントを切り替えた場合、アカウントを切断した場合が含まれます。 少なくとも1つのアカウントが接続されていれば、`walletAddress`状態変数は、リスナーから返された`accounts`配列の最初のアカウントとして更新されます。 それ以外の場合、`walletAddress`には空の文字列が設定されます。
最後に、`useEffect`関数で次のように呼び出す必要があります。
@@ -1364,21 +1366,21 @@ useEffect(async () => {
完成です! ウォレットのすべての機能をプログラミングしました。 次は最後のタスクです。スマートコントラクトに保存されているメッセージを更新します。
-### ステップ6: `updateMessage`関数の実装する {#step-6-implement-the-updateMessage-function}
+### ステップ6: `updateMessage`関数を実装する {#step-6-implement-the-updateMessage-function}
-友よ!最終段階にたどり着きました。 `interact.js`ファイルの`updateMessage`で、次のことを実行します。
+さあ、最終段階にたどり着きました。 `interact.js`ファイルの`updateMessage`で、次のことを実行します。
-1. スマートコンタクトに公開したいメッセージが有効であることを確認する。
+1. スマートコントラクトに公開したいメッセージが有効であることを確認する。
2. MetaMaskを使用してトランザクションに署名する
3. `HelloWorld.js`フロントエンドコンポーネントでこの関数を呼び出す。
-これには、それほど時間を要しません。dappを完成させましょう!
+これには、それほど時間はかかりません。dappを完成させましょう!
#### 入力エラー処理 {#input-error-handling}
当然ながら、関数の開始時に何らかの入力エラー処理を行うことは理にかなっています。
-MetaMaskエクステンションがインストールされていない場合や接続されているウォレットがない場合 \(つまり、渡された `address`が空の文字列\) 、 `message`は空の文字列になります。 次のエラー処理を`updateMessage`に追加しましょう。
+MetaMaskエクステンションがインストールされていない場合、接続されているウォレットがない場合 \(つまり、渡された `address`が空の文字列の場合\) 、または`message`が空の文字列の場合は、関数が早期にリターンするようにします。 次のエラー処理を`updateMessage`に追加しましょう。
```javascript
// interact.js
@@ -1387,13 +1389,13 @@ export const updateMessage = async (address, message) => {
if (!window.ethereum || address === null) {
return {
status:
- "💡 Connect your MetaMask wallet to update the message on the blockchain.",
+ "💡 ブロックチェーン上のメッセージを更新するには、MetaMaskウォレットを接続してください。",
}
}
if (message.trim() === "") {
return {
- status: "❌ Your message cannot be an empty string.",
+ status: "❌ メッセージを空の文字列にすることはできません。",
}
}
}
@@ -1401,21 +1403,21 @@ export const updateMessage = async (address, message) => {
入力エラーを適切に処理できるようなりました。それでは、MetaMaskを介してトランザクションに署名をします。
-#### トランザクションへ署名する {#signing-our-transaction}
+#### トランザクションに署名する {#signing-our-transaction}
-従来のWeb3イーサリアムトランザクションにすでに慣れている場合は、次に記述するコードは非常に馴染みのあるものになるでしょう。 入力エラー処理コードの下に、次の`updateMessage`を加えます。
+従来のweb3 Ethereumトランザクションにすでに慣れている場合は、次に記述するコードは非常に馴染みのあるものになるでしょう。 入力エラー処理コードの下に、次の`updateMessage`を加えます。
```javascript
// interact.js
-//set up transaction parameters
+//トランザクションパラメータを設定する
const transactionParameters = {
- to: contractAddress, // Required except during contract publications.
- from: address, // must match user's active address.
+ to: contractAddress, // コントラクト公開時以外は必須。
+ from: address, // ユーザーのアクティブなアドレスと一致する必要がある。
data: helloWorldContract.methods.update(message).encodeABI(),
}
-//sign the transaction
+//トランザクションに署名する
try {
const txHash = await window.ethereum.request({
method: "eth_sendTransaction",
@@ -1426,11 +1428,10 @@ try {
✅{" "}
- View the status of your transaction on Etherscan!
+ Etherscanでトランザクションのステータスを表示してください!
- ℹ️ Once the transaction is verified by the network, the message will be
- updated automatically.
+ ℹ️ トランザクションがネットワークによって検証されると、メッセージは自動的に更新されます。
),
}
@@ -1443,45 +1444,45 @@ try {
何をしているか、説明していきましょう。 まず、次のようにトランザクションパラメータを設定します。
-- `to`に受取人のアドレス\(スマートコントラクト\)を設定します 。
-- `from`では、関数に渡した`address`変数であるトランザクションの署名者を指定します。
-- `data`には、Hello Worldスマートコントラクトの `update`メソッドへの呼び出しが含まれており、`message`文字列変数を入力として受け取っています。
+- `to`は受信者アドレス(スマートコントラクト)を指定します
+- `from`はトランザクションの署名者を指定します。これは関数に渡した`address`変数です。
+- `data`には、Hello Worldスマートコントラクトの`update`メソッドへの呼び出しが含まれており、`message`文字列変数を入力として受け取っています。
-次に、`window.ethereum.request`をawaitで呼び出して、MetaMaskにトランザクションの署名を依頼します。 11行目と12行目で、ethメソッド `eth_sendTransaction`を指定し、`transactionParameters`を渡していることに注目してください。
+次に、`window.ethereum.request`をawaitで呼び出して、MetaMaskにトランザクションの署名を依頼します。 11行目と12行目で、ethメソッド`eth_sendTransaction`を指定し、`transactionParameters`を渡していることに注目してください。
この時点で、ブラウザでMetaMaskが開かれ、ユーザーにトランザクションの署名または拒否を求めます。
-- トランザクションが成功した場合、この関数は、Etherscanでトランザクションについての詳細を確認するようユーザーに求める`status`JSX文字列が入ったJSONオブジェクトを返します。
+- トランザクションが成功した場合、この関数は、`status` JSX文字列がEtherscanでトランザクションについての詳細を確認するようユーザーに促すJSONオブジェクトを返します。
- トランザクションが失敗した場合、この関数は、エラーメッセージを伝える`status`文字列が入ったJSONオブジェクトを返します。
-全体では、`updateMessage`関数は次のようになります。
+全体として、`updateMessage`関数は次のようになります。
```javascript
// interact.js
export const updateMessage = async (address, message) => {
- //input error handling
+ //入力エラー処理
if (!window.ethereum || address === null) {
return {
status:
- "💡 Connect your MetaMask wallet to update the message on the blockchain.",
+ "💡 ブロックチェーン上のメッセージを更新するには、MetaMaskウォレットを接続してください。",
}
}
if (message.trim() === "") {
return {
- status: "❌ Your message cannot be an empty string.",
+ status: "❌ メッセージを空の文字列にすることはできません。",
}
}
- //set up transaction parameters
+ //トランザクションパラメータを設定する
const transactionParameters = {
- to: contractAddress, // Required except during contract publications.
- from: address, // must match user's active address.
+ to: contractAddress, // コントラクト公開時以外は必須。
+ from: address, // ユーザーのアクティブなアドレスと一致する必要がある。
data: helloWorldContract.methods.update(message).encodeABI(),
}
- //sign the transaction
+ //トランザクションに署名する
try {
const txHash = await window.ethereum.request({
method: "eth_sendTransaction",
@@ -1492,11 +1493,10 @@ export const updateMessage = async (address, message) => {
✅{" "}
- View the status of your transaction on Etherscan!
+ Etherscanでトランザクションのステータスを表示してください!
- ℹ️ Once the transaction is verified by the network, the message will
- be updated automatically.
+ ℹ️ トランザクションがネットワークによって検証されると、メッセージは自動的に更新されます。
),
}
@@ -1523,18 +1523,18 @@ const onUpdatePressed = async () => {
}
```
-とても綺麗ででシンプルです。 そして、なんということでしょう。 dappの完成です。
+とてもクリーンでシンプルです。 そして、なんと... dappの完成です!!!
-**更新**ボタンを試してみてください!
+**Update**ボタンを試してみてください!
-### 自分自身でカスタムdappを作る {#make-your-own-custom-dapp}
+### 独自のカスタムdappを作成する {#make-your-own-custom-dapp}
-おめでとう!あなたは、このチュートリアルを最後までやりきりました! おさらいすると、以下の方法を学びました。
+おめでとうございます!チュートリアルの最後までたどり着きました! おさらいすると、以下の方法を学びました。
- MetaMaskウォレットをdappプロジェクトに接続する
-- [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) APIを使用してスマートコントラクトからデータを読み取る。
-- MetaMaskを使用してイーサリアムトランザクションに署名する
+- [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) APIを使用してスマートコントラクトからデータを読み取る
+- MetaMaskを使用してEthereumトランザクションに署名する
-これで、このチュートリアルのスキルを応用して独自のカスタムdappプロジェクトを構築するための準備が整いました。 何かご質問がございましたら、[Alchemy Discord](https://discord.gg/gWuC7zB)でいつでもお気軽にお問い合わせください。 🧙♂️
+これで、このチュートリアルのスキルを応用して独自のカスタムdappプロジェクトを構築するための準備が整いました。 いつものように、ご質問があれば、[Alchemy Discord](https://discord.gg/gWuC7zB)でお気軽にお問い合わせください。 🧙♂️
-このチュートリアルを通して体験したことやフィードバックがあれば、Twitter[@alchemyplatform](https://twitter.com/AlchemyPlatform)でタグ付けしてお知らせください。
+このチュートリアルを完了したら、Twitterで[@alchemyplatform](https://twitter.com/AlchemyPlatform)にタグ付けして、感想やフィードバックをお知らせください!
diff --git a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md
index 7cef5459340..b24c0b917d0 100644
--- a/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md
+++ b/public/content/translations/ja/developers/tutorials/hello-world-smart-contract/index.md
@@ -1,73 +1,62 @@
---
-title: 初心者向けのHello Worldスマートコントラクト
-description: イーサリアムでの簡単なスマートコントラクトの作成とデプロイに関する入門チュートリアル
+title: "初心者向けのHello Worldスマートコントラクト"
+description: "イーサリアムでの簡単なスマートコントラクトの作成とデプロイに関する入門チュートリアル。"
author: "elanh"
-tags:
- - "Solidity"
- - "Hardhat"
- - "alchemy"
- - "スマートコントラクト"
- - "デプロイ"
+tags: [ "Solidity", "Hardhat", "Alchemy", "スマートコントラクト", "デプロイ" ]
skill: beginner
lang: ja
published: 2021-03-31
---
-このチュートリアルは、ブロックチェーンの開発が初めてで、どこから始めたらよいのか分からない場合や、 スマートコントラクトをデプロイしてやり取りする方法を理解したいだけの場合に、最適なガイドとなります。 このチュートリアルでは、仮想ウォレット([MetaMask](https://metamask.io/))、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org/)、[Alchemy](https://alchemyapi.io/eth)を使用して、Goerliテストネットワーク上で簡単なスマートコントラクトを作成してデプロイする方法を順を追って説明します(現時点でしっかりと理解できていなくても、心配はご無用です。後ほど説明します)。
+このガイドは、ブロックチェーンの開発が初めてでどこから始めたらよいのか分からない方や、スマートコントラクトをデプロイして対話する方法を理解したいだけの方に最適です。 このチュートリアルでは、仮想ウォレット([MetaMask](https://metamask.io/))、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org/)、[Alchemy](https://www.alchemy.com/)を使用して、Sepoliaテストネットワーク上で簡単なスマートコントラクトを作成してデプロイする方法を順を追って説明します(現時点でしっかりと理解できていなくても、心配はご無用です。後ほど説明します)。
-> **警告**
->
-> 🚧 非推奨の通知
->
-> このガイドでは、Goerliテストネットワークをスマートコントラクトの作成とデプロイに使用しています。 ただし、イーサリアム・ファウンデーションにより、[Goerliが間もなく廃止予定](https://www.alchemy.com/blog/goerli-faucet-deprecation)であることが発表されました。
->
-> このチュートリアルでは、[Sepolia](https://www.alchemy.com/overviews/sepolia-testnet)および[Sepoliaフォーセット](https://sepoliafaucet.com/)の利用を推奨します。
+このチュートリアルの[パート2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract)では、デプロイ後のスマートコントラクトとの対話方法について、[パート3](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan)ではEtherscanで公開する方法について説明します。
-このチュートリアルの[パート2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract)では、ここでデプロイしたスマートコントラクトとやり取りする方法について説明します。[パート3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan)では、そのスマートコントラクトをEtherscanで公開する方法について説明します。
-
-質問がある場合は、いつでも[Alchemy Discord](https://discord.gg/gWuC7zB)でお問い合わせください。
+ご不明な点がございましたら、[Alchemy Discord](https://discord.gg/gWuC7zB)までお気軽にお問い合わせください!
## ステップ1: イーサリアムネットワークに接続する {#step-1}
-イーサリアムチェーンにリクエストを行う方法はたくさんあります。 簡略化のため、ここではAlchemyの無料アカウントを使用します。これは独自のノードを実行することなく、イーサリアムチェーンとの通信を可能にするブロックチェーンのデベロッパープラットフォームとAPIです。 このプラットフォームには、スマートコントラクトのデプロイメントにおいて内部で何が起こっているのかを把握するためにこのチュートリアルで利用する、監視と分析のためのデベロッパーツールも備わっています。 Alchemyのアカウントをお持ちでない場合は、[こちら](https://dashboard.alchemyapi.io/signup)から無料で登録できます。
+イーサリアムチェーンにリクエストを行う方法はたくさんあります。 簡略化のため、ここではAlchemyの無料アカウントを使用します。これは独自のノードを実行することなく、イーサリアムチェーンとの通信を可能にするブロックチェーンのデベロッパープラットフォームとAPIです。 このプラットフォームには、スマートコントラクトのデプロイメントにおいて内部で何が起こっているのかを把握するためにこのチュートリアルで利用する、監視と分析のためのデベロッパーツールも備わっています。 Alchemyアカウントをお持ちでない場合は、[こちらから無料で登録](https://dashboard.alchemy.com/signup)できます。
-## ステップ2: アプリ(およびAPI キー)を作成する {#step-2}
+## ステップ2: アプリ(およびAPIキー)を作成する {#step-2}
-Alchemyのアカウントを作成すると、アプリを作成することでAPIキーを生成できるようになります。 これにより、Goerliテストネットワークへのリクエストが可能になります。 テストネットに詳しくない場合は、[こちらのページ](/developers/docs/networks/)をご覧ください。
+Alchemyのアカウントを作成した後、アプリを作成することでAPIキーを生成することができます。 これにより、Sepoliaテストネットワークへのリクエストが可能になります。 テストネットに詳しくない場合は、[こちらのページ](/developers/docs/networks/)をご覧ください。
-1. ナビゲーションバーの「Apps」にマウスを合わせて、「Create App」をクリックし、Alchemyダッシュボードの「Create App」ページに移動してください。
+1. Alchemyダッシュボードのナビゲーションバーで「Select an app」を選択し、「Create new app」をクリックして、「Create new app」ページに移動します。
-
+
-2. アプリに「Hello World」という名前を付け、簡単な説明を記述し、環境に「Staging」を選択(アプリのブックキーピングに使用)し、ネットワークに「Goerli」を選択します。
+2. アプリに「Hello World」という名前を付け、簡単な説明を提示し、「Infra & Tooling」などのユースケースを選択します。 次に、「Ethereum」を検索してネットワークを選択します。
-
+
-3. 「Create app」をクリックして完了です。 アプリが下の表に表示されます。
+3. 「Next」をクリックして続行し、次に「Create app」をクリックすれば完了です! ナビゲーションバーのドロップダウンメニューにアプリが表示され、APIキーをコピーできるようになります。
## ステップ3: イーサリアムアカウント(アドレス)を作成する {#step-3}
-トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 [トランザクション](/developers/docs/transactions/)の詳細。
+トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 [トランザクション](/developers/docs/transactions/)に関する詳細はこちら。
+
+MetaMaskは[こちら](https://metamask.io/download)からダウンロードして、無料でイーサリアムアカウントを作成できます。 アカウントを作成するとき、またはすでにアカウントをお持ちの場合は、(実際のお金を使わないように)ネットワークのドロップダウンメニューを使用して「Sepolia」テストネットワークに切り替えてください。
-Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Goerli Test Network」に切り替えてください。
+Sepoliaがリストに表示されない場合は、メニューから「高度な設定」に進み、下にスクロールして「テストネットワークを表示」をオンに切り替えます。 ネットワーク選択メニューで、「カスタム」タブを選択してテストネットのリストを見つけ、「Sepolia」を選択します。
-
+
-## ステップ4: フォーセットからイーサ(ETH)を追加する {#step-4}
+## ステップ4: フォーセットからイーサを追加する {#step-4}
-テストネットワークにスマートコントラクトをデプロイするには、偽のETHが必要になります。 ETHを取得するには、[Goerliフォーセット](https://goerlifaucet.com/)にアクセスし、Alchemyアカウントでログインしてウォレットアドレスを入力し、「Send Me ETH」をクリックしてください。 ネットワークトラフィックのために偽のETHを受け取るのに時間がかかる場合があります。 (この記事の執筆時点では、30分ほどかかりました。) MetaMaskアカウントにETHが表示されるはずです!
+テストネットワークにスマートコントラクトをデプロイするには、偽のEthが必要になります。 Sepolia ETHを入手するには、[Sepoliaネットワーク詳細](/developers/docs/networks/#sepolia)にアクセスして、さまざまなフォーセットのリストを表示します。 1つが機能しない場合は、別のものを試してください。枯渇している場合があります。 ネットワークのトラフィックにより、偽のETHの受信に時間がかかる場合があります。 その後すぐに、MetaMaskアカウントにETHが表示されるはずです!
## ステップ5: 残高を確認する {#step-5}
-残高を再確認するために、[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)を[Alchemyのコンポーザーツール](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D)を使用してリクエストしてみましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 MetaMaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。
+残高があることを再確認するために、[Alchemyのcomposerツール](https://sandbox.alchemy.com/?network=ETH_SEPOLIA&method=eth_getBalance&body.id=1&body.jsonrpc=2.0&body.method=eth_getBalance&body.params%5B0%5D=&body.params%5B1%5D=latest)を使用して[eth_getBalance](/developers/docs/apis/json-rpc/#eth_getbalance)リクエストを作成しましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 MetaMaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。
```json
{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }
```
-> **注:** この結果の単位は、ETHではなくweiです。 weiはETHの最小単位として使われています。 weiからETHへ変換すると、1 eth = 1018 weiになります。 つまり、0x2B5E3AF16B1880000を10進数に変換すると、5\*10¹⁸となり、5 ETHに相当します。
+> **注:**この結果の単位はETHではなくweiです。 weiはETHの最小単位として使われています。 weiからETHへの変換は、1 eth = 1018 weiです。 したがって、0x2B5E3AF16B1880000を10進数に変換すると5\*10¹⁸になり、これは5 ETHに相当します。
>
-> ご安心ください。 偽のお金はすべてそこにあります 。
+> ふう! 偽のお金がすべて揃いました 。
## ステップ6: プロジェクトを初期化する {#step-6}
@@ -78,18 +67,18 @@ mkdir hello-world
cd hello-world
```
-プロジェクトフォルダ内に入ったら、`npm init`を使用してプロジェクトを初期化します。 まだnpmがインストールされていない場合は、[こちらの手順](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm)に従ってください(Node.jsも必要となりますので、こちらもダウンロードしてください。)
+プロジェクトフォルダに入ったので、`npm init`を使用してプロジェクトを初期化します。 npmをまだインストールしていない場合は、[これらの手順](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm)に従ってください(Node.jsも必要なので、それもダウンロードしてください!)。
```
npm init
```
-インストール時の質問についてはどのように回答してもかまいませんが、参考までに以前行った回答を以下に示します。
+インストールの質問にどう答えるかは重要ではありませんが、参考までに私たちの回答方法を次に示します。
```
package name: (hello-world)
version: (1.0.0)
-description: hello world smart contract
+description: hello world スマートコントラクト
entry point: (index.js)
test command:
git repository:
@@ -101,7 +90,7 @@ About to write to /Users/.../.../.../hello-world/package.json:
{
"name": "hello-world",
"version": "1.0.0",
- "description": "hello world smart contract",
+ "description": "hello world スマートコントラクト",
"main": "index.js",
"scripts": {
"test": "echo \\"Error: no test specified\\" && exit 1"
@@ -111,19 +100,19 @@ About to write to /Users/.../.../.../hello-world/package.json:
}
```
-package.jsonを承認すれば完了です。
+package.jsonを承認すれば完了です!
## ステップ7: [Hardhat](https://hardhat.org/getting-started/#overview)をダウンロードする {#step-7}
Hardhatは、イーサリアムのソフトウェアをコンパイル、デプロイ、テスト、デバッグするための開発環境です。 デベロッパーがライブチェーンにデプロイする前に、スマートコントラクトや分散型アプリケーション(Dapp)をローカルに構築する際に役立ちます。
-先ほど作成した`hello-world`プロジェクト内で、以下を実行します。
+`hello-world`プロジェクト内で次を実行します。
```
npm install --save-dev hardhat
```
-[インストール手順](https://hardhat.org/getting-started/#overview)の詳細については、こちらのページをご覧ください。
+[インストール手順](https://hardhat.org/getting-started/#overview)の詳細については、このページをご覧ください。
## ステップ8: Hardhatプロジェクトを作成する {#step-8}
@@ -133,7 +122,7 @@ npm install --save-dev hardhat
npx hardhat
```
-ウェルカムメッセージと、次に何をするのかを選択できるオプションが表示されます。 「Create an empty hardhat.config.js」を選択します。
+ウェルカムメッセージと、次に何をするのかを選択できるオプションが表示されます。 「create an empty hardhat.config.js」を選択してください。
```
888 888 888 888 888
@@ -153,7 +142,7 @@ Create a sample project
Quit
```
-`hardhat.config.js`ファイルが生成されます。このファイルでプロジェクトのすべての設定を行います(ステップ13で行います)。
+これにより `hardhat.config.js` ファイルが生成されます。ここでプロジェクトのすべてのセットアップを指定します(ステップ13)。
## ステップ9: プロジェクトフォルダを追加する {#step-9}
@@ -164,55 +153,55 @@ mkdir contracts
mkdir scripts
```
-- `contracts/`は、Hello Worldスマートコントラクトのコードファイルを格納する場所です。
-- `scripts/`は、コントラクトをデプロイして対話するスクリプトを保持する場所です。
+- `contracts/` には、hello worldスマートコントラクトのコードファイルを保存します
+- `scripts/` には、コントラクトをデプロイして対話するためのスクリプトを保存します
## ステップ10: コントラクトを作成する {#step-10}
-一体いつになったらコードを書くのだろうと疑問をお持ちではないでしょうか 。 このステップ10でコードを書いていきましょう。
+一体いつになったらコードを書くのだろう、と思っているかもしれませんね。 さあ、このステップ10でコードを書き始めましょう。
-お気に入りのエディタでhello-worldプロジェクトを開きます(通常は[VScode](https://code.visualstudio.com/)を使用しています)。 スマートコントラクトは、Solidityと呼ばれる言語で記述されています。HelloWorld.solスマートコントラクトの作成にこの言語を使用します。
+お気に入りのエディタでhello-worldプロジェクトを開きます([VSCode](https://code.visualstudio.com/)がおすすめです)。 スマートコントラクトはSolidityという言語で書かれており、これを使ってHelloWorld.solスマートコントラクトを作成します。
-1. 「contracts」フォルダに移動し、HelloWorld.solという名前の新規ファイルを作成します。
-2. 以下は、このチュートリアルで使用するイーサリアム・ファウンデーションのHello Worldスマートコントラクトのサンプルです。 以下の内容をコピーして、HelloWorld.solファイルに貼り付けます。コメントを読んで、このコントラクトが何を行うのかを理解してください。
+1. 「contracts」フォルダに移動し、HelloWorld.solという名前の新規ファイルを作成します。
+2. 以下は、このチュートリアルで使用するイーサリアム・ファウンデーションのHello Worldスマートコントラクトのサンプルです。 以下の内容をHelloWorld.solファイルにコピー&ペーストし、コメントを読んでこのコントラクトが何をするのかを理解してください。
```solidity
-// Specifies the version of Solidity, using semantic versioning.
-// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
+// セマンティックバージョニングを使用して、Solidityのバージョンを指定します。
+// 詳細はこちら: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma
pragma solidity ^0.7.0;
-// Defines a contract named `HelloWorld`.
-// A contract is a collection of functions and data (its state). Once deployed, a contract resides at a specific address on the Ethereum blockchain. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
+// `HelloWorld`という名前のコントラクトを定義します。
+// コントラクトは関数とデータ(その状態)の集合です。デプロイされると、コントラクトはイーサリアムのブロックチェーン上の特定のアドレスに配置されます。詳細はこちら: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html
contract HelloWorld {
- // Declares a state variable `message` of type `string`.
- // State variables are variables whose values are permanently stored in contract storage. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value.
+ // `string`型の状態変数`message`を宣言します。
+ // 状態変数は、その値がコントラクトストレージに永続的に保存される変数です。`public`キーワードは、変数をコントラクトの外部からアクセス可能にし、他のコントラクトやクライアントがその値をアクセスするために呼び出せる関数を作成します。
string public message;
- // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation.
- // Constructors are used to initialize the contract's data. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
+ // 多くのクラスベースのオブジェクト指向言語と同様に、コンストラクタはコントラクト作成時にのみ実行される特別な関数です。
+ // コンストラクタは、コントラクトのデータを初期化するために使用されます。詳細はこちら:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors
constructor(string memory initMessage) {
- // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable).
+ // 文字列引数`initMessage`を受け入れ、その値をコントラクトの`message`ストレージ変数に設定します。
message = initMessage;
}
- // A public function that accepts a string argument and updates the `message` storage variable.
+ // 文字列引数を受け入れ、`message`ストレージ変数を更新する公開関数です。
function update(string memory newMessage) public {
message = newMessage;
}
}
```
-これは、作成時にメッセージを保存し、`update`関数を呼び出すことで更新できる非常にシンプルなスマートコントラクトです。
+これは、作成時にメッセージを保存し、`update`関数を呼び出すことで更新できる、非常にシンプルなスマートコントラクトです。
## ステップ11: MetaMaskとAlchemyをプロジェクトに接続する {#step-11}
-ここまでで、MetaMaskウォレットとAlchemyアカウントを作成し、スマートコントラクトも作成しました。次はこの3つを接続しましょう。
+MetaMaskウォレットとAlchemyアカウントを作成し、スマートコントラクトも作成しました。次はこの3つを接続しましょう。
-仮想ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使用した署名が必要です。 この権限をプログラムに提供するため、秘密鍵(およびAlchemy APIキー)を環境ファイルに安全に保存できます。
+仮想ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使用した署名が必要です。 この許可をプログラムに与えるために、秘密鍵(とAlchemyのAPIキー)を環境ファイルに安全に格納する作業を行います。
-> トランザクションの送信の詳細については、web3を使用したトランザクションの送信に関する[こちらのチュートリアル](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)をご覧ください。
+> トランザクションの送信について詳しく知るには、web3を使用したトランザクション送信に関する[このチュートリアル](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)をご覧ください。
まず、プロジェクトディレクトリにdotenvパッケージをインストールします。
@@ -220,37 +209,37 @@ contract HelloWorld {
npm install dotenv --save
```
-次に、 `.env`ファイルをプロジェクトのルートディレクトリに作成し、そのファイルにMetamaskの秘密鍵とHTTP Alchemy APIのURLを追加します。
+次に、プロジェクトのルートディレクトリに`.env`ファイルを作成し、MetaMaskの秘密鍵とHTTP Alchemy API URLを追加します。
-- 秘密鍵をエクスポートするには、[こちらの手順](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key)に従ってください。
-- HTTP Alchemy APIのURLを取得するには、以下を参照してください。
+- [これらの手順](https://support.metamask.io/configure/accounts/how-to-export-an-accounts-private-key/)に従って秘密鍵をエクスポートします
+- HTTP Alchemy API URLを取得するには、以下を参照してください
-
+
-Alchemy APIのURLをコピーします。
+Alchemy API URLをコピーする
-`.env`ファイルは次のようになります。
+`.env`は次のようになります:
```
-API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key"
+API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-metamask-private-key"
```
-これらの変数を実際にコードに接続するために、ステップ13でこれらの変数を`hardhat.config.js`ファイル内で参照します。
+これらをコードに実際に接続するために、ステップ13で`hardhat.config.js`ファイル内のこれらの変数を参照します。
-.envファイルをコミットしないでください! .envファイルを誰かと共有したり公開したりしないようにしてください。秘密が漏洩する可能性があります。 バージョン管理ツールを使用している場合は、.envをgitignoreファイルに追加します。
+.envはコミットしないでください! .envは決して他人と共有したり、公開したりしないように注意してください。共有することで、あなたのアカウント情報が漏洩する可能性があります。 バージョンを管理する場合は、.envをgitignoreファイルに追加してください。
## ステップ12: Ethers.jsをインストールする {#step-12-install-ethersjs}
-Ethers.jsは、よりユーザーフレンドリーなメソッドで[標準のJSON-RPCメソッド](/developers/docs/apis/json-rpc/)をラップすることにより、イーサリアムとの対話やリクエストを簡単にするライブラリです。
+Ethers.jsは、[標準のJSON-RPCメソッド](/developers/docs/apis/json-rpc/)をよりユーザーフレンドリーなメソッドでラップすることで、イーサリアムとの対話やリクエストを容易にするライブラリです。
-Hardhatは、追加のツールと拡張機能のための[プラグイン](https://hardhat.org/plugins/)の統合を非常に簡単にしてくれます。 コントラクトのデプロイメントに[Ethersプラグイン](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers)を利用します([Ethers.js](https://github.com/ethers-io/ethers.js/)には、複数の非常にクリーンなコントラクトのデプロイメント方法があります)。
+Hardhatでは、追加のツールや拡張機能のための[プラグイン](https://hardhat.org/plugins/)を非常に簡単に統合できます。 コントラクトのデプロイには[Ethersプラグイン](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers)を活用します([Ethers.js](https://github.com/ethers-io/ethers.js/)には非常にクリーンなコントラクトデプロイメントメソッドがあります)。
プロジェクトのホームディレクトリで以下を実行します。
@@ -258,13 +247,13 @@ Hardhatは、追加のツールと拡張機能のための[プラグイン](http
npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"
```
-次のステップの`hardhat.config.js`でもEthers(.js)が必要になります。
+次のステップで、`hardhat.config.js`にethersもrequireします。
## ステップ13: hardhat.config.jsを更新する {#step-13-update-hardhatconfigjs}
-ここまでで、いくつかの依存関係とプラグインを追加しました。次に、`hardhat.config.js`を更新して、プロジェクトがそれらすべてについて認識できるようにする必要があります。
+ここまでで、いくつかの依存関係とプラグインを追加しました。次に、プロジェクトがそれらすべてを認識できるように、`hardhat.config.js`を更新する必要があります。
-`hardhat.config.js`を以下のように更新します。
+`hardhat.config.js`を次のように更新します:
```
require('dotenv').config();
@@ -277,10 +266,10 @@ const { API_URL, PRIVATE_KEY } = process.env;
*/
module.exports = {
solidity: "0.7.3",
- defaultNetwork: "goerli",
+ defaultNetwork: "sepolia",
networks: {
hardhat: {},
- goerli: {
+ sepolia: {
url: API_URL,
accounts: [`0x${PRIVATE_KEY}`]
}
@@ -290,7 +279,7 @@ module.exports = {
## ステップ14: コントラクトをコンパイルする {#step-14-compile-our-contracts}
-ここまででしっかりと動作していることを確認するため、コントラクトをコンパイルしてみましょう。 `compile`タスクは、組み込みのHardhatタスクの1つです。
+ここまでの作業がうまくいっていることを確認するために、コントラクトをコンパイルしてみましょう。 `compile`タスクは、組み込みのHardhatタスクの1つです。
コマンドラインで以下を実行します。
@@ -298,19 +287,19 @@ module.exports = {
npx hardhat compile
```
-`SPDX license identifier not provided in source file`という警告が表示される場合がありますが、心配する必要はありません。警告が表示されないのがベストですが、 表示された場合は、いつでも[Alchemy discord](https://discord.gg/u72VCg3)でメッセージを送信できます。
+`SPDX license identifier not provided in source file`という警告が表示されるかもしれませんが、心配する必要はありません。それ以外は問題ないはずです! うまくいかない場合は、いつでも[Alchemy Discord](https://discord.gg/u72VCg3)でメッセージを送ることができます。
-## ステップ15: デプロイスクリプトを書く {#step-15-write-our-deploy-scripts}
+## ステップ15: デプロイスクリプトを作成する {#step-15-write-our-deploy-scripts}
コントラクトの作成と設定ファイルの作成が完了したら、いよいよコントラクトのデプロイのためのスクリプトを作成します。
-`scripts/`フォルダに移動して、`deploy.js`という名前のファイルを新規に作成し、以下の内容を追加します。
+`scripts/`フォルダに移動して`deploy.js`という名前の新しいファイルを作成し、次の内容を追加します:
```
async function main() {
const HelloWorld = await ethers.getContractFactory("HelloWorld");
- // Start deployment, returning a promise that resolves to a contract object
+ // デプロイを開始し、コントラクトオブジェクトに解決されるpromiseを返します
const hello_world = await HelloWorld.deploy("Hello World!");
console.log("Contract deployed to address:", hello_world.address);}
@@ -322,48 +311,49 @@ main()
});
```
-Hardhatがコードの各行で行っている驚くべき内容については、Hardhatの[コントラクトチュートリアル](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)で説明されています。以下では、その説明を採用しています。
+Hardhatは、[コントラクトのチュートリアル](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)で、これらのコードの各行が何をするかを非常にうまく説明しています。ここではその説明を採用しました。
```
const HelloWorld = await ethers.getContractFactory("HelloWorld");
```
-ethers.jsの`ContractFactory`は新しいスマートコントラクトをデプロイするための抽象化であり、ここでの`HelloWorld`はhello worldコントラクトのインスタンスのためのファクトリです。 `hardhat-ethers`プラグインを使用する場合、`ContractFactory`および`Contract`インスタンスはデフォルトで最初の署名者に接続されます。
+ethers.jsの`ContractFactory`は、新しいスマートコントラクトをデプロイするために使用される抽象化です。したがって、ここでの`HelloWorld`は、私たちのhello worldコントラクトのインスタンスのためのファクトリです。 `hardhat-ethers`プラグインを使用する場合、`ContractFactory`および`Contract`インスタンスはデフォルトで最初の署名者に接続されます。
```
const hello_world = await HelloWorld.deploy();
```
-`ContractFactory`で`deploy()`を呼び出すとデプロイメントが開始され、`Contract`に解決すべき`Promise`が返されます。 これは、スマートコントラクトの各関数に対するメソッドを持つオブジェクトです。
+`ContractFactory`で`deploy()`を呼び出すとデプロイメントが開始され、`Contract`に解決される`Promise`が返されます。 これは、スマートコントラクトの各関数に対するメソッドを持つオブジェクトです。
## ステップ16: コントラクトをデプロイする {#step-16-deploy-our-contract}
-ようやく、スマートコントラクトをデプロイする準備が整いました。 コマンドラインに移動し、以下を実行します。
+ようやく、スマートコントラクトをデプロイする準備が整いました。 コマンドラインに移動し、次を実行します:
```
-npx hardhat run scripts/deploy.js --network goerli
+npx hardhat run scripts/deploy.js --network sepolia
```
次のような画面が表示されるはずです。
```
-Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
+コントラクトがデプロイされたアドレス: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570
```
-[Goerli etherscan](https://goerli.etherscan.io/)に移動し、コントラクトアドレスを検索すると、コントラクトが正常にデプロイされていることを確認できるはずです。 トランザクションは以下のようなものになります。
+[Sepolia etherscan](https://sepolia.etherscan.io/)にアクセスし、コントラクトアドレスを検索すると、正常にデプロイされたことが確認できるはずです。 トランザクションは以下のようなものになります。
-
+
-`From`アドレスはMetaMaskアカウントアドレスと一致する必要があります。Toアドレスには「Contract Creation」と表示されますが、トランザクションをクリックすると、`To`フィールドにコントラクトアドレスが表示されます。
+`From`アドレスはMetaMaskアカウントのアドレスと一致し、`To`アドレスは「Contract Creation」と表示されますが、トランザクションをクリックすると`To`フィールドにコントラクトアドレスが表示されます。
-
+
-おめでとうございます! イーサリアムチェーンにスマートコントラクトをデプロイできました 🎉
+おめでとうございます! イーサリアムチェーンにスマートコントラクトをデプロイできました 🎉
-内部で何が起こっているのかを理解するために、[Alchemyダッシュボード](https://dashboard.alchemyapi.io/explorer)のExplorerタブに移動してみましょう。 Alchemyのアプリが複数ある場合は、必ずアプリでフィルタリングし、「Hello World」を選択してください。 
+内部で何が起こっているのかを理解するために、[Alchemyダッシュボード](https://dashboard.alchemyapi.io/explorer)のExplorerタブに移動してみましょう。 Alchemyアプリが複数ある場合は、必ずアプリでフィルタリングし、「Hello World」を選択してください。
+
-ここでは、`.deploy()`関数を呼び出した際に、Hardhat/Ethersが内部で行ったJSON-RPCの呼び出しを見ることができます。 ここで呼び出している2つの重要なJSON-RPCは、実際にGoerliチェーン上でコントラクトを書き込むリクエストの[`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction)と、(トランザクションの際の典型的なパターンである)ハッシュを与えられているトランザクションに関する情報を読み取るリクエストの[`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash)です。 トランザクションの送信の詳細については、こちらのチュートリアルの[Web3を使用したトランザクションの送信](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)をご覧ください。
+ここでは、`.deploy()`関数を呼び出したときにHardhat/Ethersが内部で行ったいくつかのJSON-RPCコールを確認できます。 ここで注目すべき重要なコールは2つあります。1つは、コントラクトをSepoliaチェーンに実際に書き込むためのリクエストである[`eth_sendRawTransaction`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-send-raw-transaction)で、もう1つはハッシュが与えられたトランザクションに関する情報を読み取るためのリクエストである[`eth_getTransactionByHash`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-get-transaction-by-hash)です(これはトランザクションにおける典型的なパターンです)。 トランザクションの送信についてさらに詳しく知りたい場合は、[Web3を使用したトランザクションの送信](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)に関するチュートリアルをご覧ください。
-こちらのチュートリアルのパート1は以上となります。パート2では初期メッセージの更新による[スマートコントラクトとの実際のやり取り](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#part-2-interact-with-your-smart-contract)を、パート3では[Etherscanへのスマートコントラクトの公開](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#optional-part-3-publish-your-smart-contract-to-etherscan)を行い、やり取りする方法を学びます。
+このチュートリアルのパート1は以上です。パート2では、最初のメッセージを更新して[スマートコントラクトと実際に対話](https://www.alchemy.com/docs/interacting-with-a-smart-contract)し、パート3では[スマートコントラクトをEtherscanに公開](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan)して、誰もがその対話方法を知ることができるようにします。
-**Alchemyの詳細については、 [ウェブサイト](https://alchemyapi.io/eth)をご覧ください。 アップデートを見逃したくない場合は、 [こちら](https://www.alchemyapi.io/newsletter)でニュースレターを購読してください。 [Twitter](https://twitter.com/alchemyplatform)もあわせてフォローし、[Discord](https://discord.com/invite/u72VCg3)**にもご参加ください。
+**Alchemyについてもっと知りたいですか? 私たちの[ウェブサイト](https://www.alchemy.com/eth)をご覧ください。 アップデートを見逃したくないですか? [こちら](https://www.alchemy.com/newsletter)でニュースレターに登録してください! 私たちの[Discord](https://discord.gg/u72VCg3)にもぜひご参加ください。**
diff --git a/public/content/translations/ja/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/ja/developers/tutorials/how-to-implement-an-erc721-market/index.md
index b77db2aa191..d59ac9aabaf 100644
--- a/public/content/translations/ja/developers/tutorials/how-to-implement-an-erc721-market/index.md
+++ b/public/content/translations/ja/developers/tutorials/how-to-implement-an-erc721-market/index.md
@@ -1,12 +1,8 @@
---
-title: ERC-721マーケットを実装する方法
-description: 分散型のクラシファイドボード(掲示板)に、トークン化されたアイテムを出品する方法
+title: "ERC-721マーケットを実装する方法"
+description: "分散型のクラシファイドボード(掲示板)に、トークン化されたアイテムを出品する方法"
author: "Alberto Cuesta Cañada"
-tags:
- - "スマートコントラクト"
- - "erc-721"
- - "Solidity"
- - "トークン"
+tags: [ "スマートコントラクト", "ERC-721", "Solidity", "トークン" ]
skill: intermediate
lang: ja
published: 2020-03-19
@@ -22,17 +18,17 @@ Gumtree、Ebay、Craigslistといったインターネット掲示板が登場
ブロックチェーン技術は、この掲示板市場をさらに変革するものです。以下では、その方法について紹介します。
-## マネタイゼーション(収益化) {#monetization}
+## 収益化 {#monetization}
パブリックブロックチェーンにおける掲示板のビジネスモデルは、Ebayなどの企業のビジネスモデルとは異なります。
-まず第一に、 [脱中心化](/developers/docs/web2-vs-web3/)されている点を指摘すべきでしょう。 既存の掲示板プラットフォームは、自社サーバーを運用する必要があります。 しかし、分散型プラットフォームの運営はユーザーが実行するため、プラットフォーム所有者はコア・プラットフォームを稼働させるコストを負担する必要がありません。
+まず、[分散化という観点](/developers/docs/web2-vs-web3/)があります。 既存の掲示板プラットフォームは、自社サーバーを運用する必要があります。 しかし、分散型プラットフォームの運営はユーザーが実行するため、プラットフォーム所有者はコア・プラットフォームを稼働させるコストを負担する必要がありません。
-次に、プラットフォームにアクセスする機能を提供するウェブサイトまたはインターフェイスといったフロントエンドがあります。 フロントエンドには、いくつかのオプションがあります。 プラットフォーム所有者は、ユーザーのアクセス権限を制限し、インターフェイスを有料で使わせることができます。 一方で、プラットフォーム所有者がアクセス権限を開放し(人々に力を!)、ユーザーが自由にインターフェイスを開発できるようにすることもできます。 あるいは、これら2つの極端なアプローチの中間を選択することもできます。
+次に、プラットフォームにアクセスする機能を提供するウェブサイトまたはインターフェイスといったフロントエンドがあります。 フロントエンドには、いくつかのオプションがあります。 プラットフォーム所有者は、ユーザーのアクセス権限を制限し、インターフェイスを有料で使わせることができます。 プラットフォームの所有者は、アクセスを開放することも決定できます (Power to the People!) そして、誰でもプラットフォームへのインターフェースを構築できるようにします。 あるいは、これら2つの極端なアプローチの中間を選択することもできます。
-_私よりもビジネス感覚に優れている方は、これをどのように収益化すべきかについてよくご存じでしょう。 分散型のクラシファイドについて私が言えるのは、既存の掲示板プラットフォームとは異なっており、おそらく収益化が可能だということです。_
+_私よりも先見の明のあるビジネスリーダーは、これを収益化する方法を知っているでしょう。 私にわかるのは、これが現状とは異なり、おそらく利益になるだろうということだけです。_
-掲示板プラットフォームについては、自動化や支払い方法の視点からも考えることができます。 一部の商品は、[トークン化を非常に効果的に実行でき](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) 、掲示板での取引に適しています。 トークン化されたアセットは、ブロックチェーン上で簡単に移転できます。 また、ブロックチェーンでは、非常に複雑な支払い方法も簡単に実装できます。
+掲示板プラットフォームについては、自動化や支払い方法の視点からも考えることができます。 一部のものは、非常に[効果的にトークン化](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com)され、クラシファイドボードで取引できます。 トークン化されたアセットは、ブロックチェーン上で簡単に移転できます。 また、ブロックチェーンでは、非常に複雑な支払い方法も簡単に実装できます。
私はここに、ビジネスチャンスがあると感じているわけです。 トランザクションごとに複雑な支払経路を設定しつつ、運用コストが発生しない掲示板を、簡単に実装できるからです。 私は、ブロックチェーン・コミュニティから必ず、これを活用するアイディアが生まれてくると考えています。
@@ -40,9 +36,9 @@ _私よりもビジネス感覚に優れている方は、これをどのよう
## 実装 {#implementation}
-私たちは少し前に、具体的なビジネスケースに基づく実装やその他のリソースを提供する [オープンソースのリポジトリ](https://github.com/HQ20/contracts?ref=hackernoon.com)を立ち上げました。ぜひアクセスしてください。
+少し前に、ビジネスケースのサンプル実装やその他の特典を含む[オープンソースリポジトリ](https://github.com/HQ20/contracts?ref=hackernoon.com)を開始しました。ぜひご覧ください。
-この [イーサリアム・クラシファイド掲示板](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) のコードもレポジトリから入手できますので、自由に活用してください。 ただし、このコードは監査を経ていないため、お金を伴う取引を開始する前に、各自でデューデリジェンスを行う必要があります。
+この[Ethereumクラシファイドボード](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com)のコードはそこにあります。どうぞご自由にお使いください。 ただし、このコードは監査を経ていないため、お金を伴う取引を開始する前に、各自でデューデリジェンスを行う必要があります。
掲示板における基本的な機能はシンプルなものです。 掲示板におけるすべての投稿は、いくつかのフィールドを含む構造体に過ぎません:
@@ -67,9 +63,9 @@ mapping(uint256 => Trade) public trades;
次に、どのようなアイテムを扱う必要があり、取引の支払いにはどの通貨を使うかについて考える必要があります。
-取扱アイテムについては、[ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com)インターフェイスを実装すればよいです。このインターフェイスは、[デジタル資産と最も相性がよいのは事実ですが](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com)、現実に存在するアイテムをブロックチェーン上で表現するための手段に過ぎません。 この掲示板用の ERC-721コントラクトはコンストラクタで指定するため、掲示板に含まれるアセットは前もってトークン化しておく必要があります。
+アイテムについては、[ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com)インターフェースを実装することだけを求めます。これは現実世界のアイテムをブロックチェーンで表現する方法にすぎませんが、[デジタルアセットで最も効果的に機能します](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com)。 この掲示板用の ERC-721コントラクトはコンストラクタで指定するため、掲示板に含まれるアセットは前もってトークン化しておく必要があります。
-支払い機能についても、ほぼ同じです。 大部分のブロックチェーン・プロジェクトでは、独自の [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com)暗号通貨を定義しています。 DAIのように、著名な暗号通貨を採用する場合もあります。 このクラシファイド掲示板では、コンストラクタにおいて通貨を指定する必要があるだけです。 簡単ですね。
+支払い機能についても、ほぼ同じです。 ほとんどのブロックチェーンプロジェクトは、独自の[ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com)暗号通貨を定義しています。 DAIのように、著名な暗号通貨を採用する場合もあります。 このクラシファイド掲示板では、コンストラクタにおいて通貨を指定する必要があるだけです。 簡単ですね。
```solidity
constructor (
@@ -127,18 +123,18 @@ function cancelTrade(uint256 _trade)
Trade memory trade = trades[_trade];
require(
msg.sender == trade.poster,
- "Trade can be cancelled only by poster."
+ "取引は投稿者のみがキャンセルできます。"
);
- require(trade.status == "Open", "Trade is not Open.");
+ require(trade.status == "Open", "取引はオープン状態ではありません。");
itemToken.transferFrom(address(this), trade.poster, trade.item);
trades[_trade].status = "Cancelled";
emit TradeStatusChange(_trade, "Cancelled");
}
```
-以上です! これで、実装が完了しました。 この掲示板もそうですが、ビジネスコンセプトをコードで表現すると、驚くほど簡潔であることが少なくありません。 私たちのレポジトリから、[完成したコントラクト](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol)を入手できます。
+以上です! これで、実装が完了しました。 この掲示板もそうですが、ビジネスコンセプトをコードで表現すると、驚くほど簡潔であることが少なくありません。 完全なコントラクトは[私たちのリポジトリ](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol)で確認してください。
-## まとめ {#conclusion}
+## 結論 {#conclusion}
クラシファイド掲示板は、インターネットの普及に伴い爆発的に規模を拡大した一般的な市場構成であり、非常に人気のあるビジネスモデルを大手数社が独占している状態です。
@@ -146,4 +142,4 @@ function cancelTrade(uint256 _trade)
この記事は、実際の掲示板ビジネスと、技術的な実装との間にあるギャップを埋めるための試みです。 この記事に記載された知識を基に、適切なスキルを持つユーザーであれば、掲示板ビジネスのビジョンと実装ロードマップを生み出すことができるでしょう。
-いつものように、面白いプロジェクトを進行中で助言が必要な場合は、[ぜひご連絡ください](https://albertocuesta.es/)! いつでも喜んでお手伝いします。
+いつものように、面白いプロジェクトを進行中で助言が必要な場合は、ぜひ[ご連絡ください](https://albertocuesta.es/)! いつでも喜んでお手伝いします。
diff --git a/public/content/translations/ja/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/ja/developers/tutorials/how-to-mint-an-nft/index.md
index ef610e4373a..e3578671782 100644
--- a/public/content/translations/ja/developers/tutorials/how-to-mint-an-nft/index.md
+++ b/public/content/translations/ja/developers/tutorials/how-to-mint-an-nft/index.md
@@ -1,28 +1,26 @@
---
-title: NFTのミント方法(NFTチュートリアルシリーズの2/3)
-description: このチュートリアルでは、スマートコントラクトとWeb3を使用してEthereumブロックチェーン上でNFTをミントする方法を説明します。
+title: "NFTのミント方法(NFTチュートリアルシリーズの2/3)"
+description: "このチュートリアルでは、スマートコントラクトとWeb3を使用してイーサリアムブロックチェーン上でNFTをミントする方法を説明します。"
author: "Sumi Mudgil"
-tags:
- - "ERC-721"
- - "alchemy"
- - "Solidity"
- - "スマートコントラクト"
+tags: [ "ERC-721", "Alchemy", "Solidity", "スマートコントラクト" ]
skill: beginner
lang: ja
published: 2021-04-22
---
-[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): $69,000,000 [3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): $11,000,000 [Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): $6,000,000
+[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): 6900万ドル
+[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 1100万ドル
+[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 600万ドル
-いずれもAlchemyの強力なAPIを使ってNFTをミントしています。 このチュートリアルでは、\<10分以内でNFTをミントする方法を説明します。
+いずれもAlchemyの強力なAPIを使ってNFTをミントしています。 このチュートリアルでは、\<10分で同じことを行う方法を説明します。
-「NFTのミント」とは、ブロックチェーン上にERC-721トークンのユニークなインスタンスを公開することです。 [NFTチュートリアルシリーズのパート1](/developers/tutorials/how-to-write-and-deploy-an-nft/)で作成したスマートコントラクトを使って、Web3のスキルを駆使し、NFTをミントしてみましょう。 このチュートリアルが終わるころには、あなた(とウォレット) の望むがままにNFTをミントできるようになります。
+「NFTのミント」とは、ブロックチェーン上にERC-721トークンのユニークなインスタンスを公開することです。 この[NFTチュートリアルシリーズのパート1](/developers/tutorials/how-to-write-and-deploy-an-nft/)で作成したスマートコントラクトを使って、Web3のスキルを駆使し、NFTをミントしてみましょう。 このチュートリアルが終わるころには、あなた(とウォレット)が望むだけNFTをミントできるようになります。
さあ、始めましょう。
## ステップ1: Web3をインストールする {#install-web3}
-NFTスマートコントラクトの作成に関する最初のチュートリアルに沿って進めている場合、すでにEthers.jsを使用していることと思います。 Web3はEthersと同様、イーサリアムブロックチェーンへのリクエストを簡単に作成するために使用されるライブラリです。 このチュートリアルでは、自動再試行と堅牢なWebSocketサポートを提供する拡張Web3ライブラリ、[Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3)を使用します。
+NFTスマートコントラクトの作成に関する最初のチュートリアルに沿って進めている場合、すでにEthers.jsを使用した経験があるはずです。 Web3はEthersと同様、イーサリアムブロックチェーンへのリクエストを簡単に作成するために使用されるライブラリです。 このチュートリアルでは、自動再試行と堅牢なWebSocketサポートを提供する拡張Web3ライブラリである[Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3)を使用します。
プロジェクトのホームディレクトリで以下を実行します。
@@ -32,7 +30,7 @@ npm install @alch/alchemy-web3
## ステップ2: `mint-nft.js`ファイルを作成する {#create-mintnftjs}
-scriptsディレクトリ内に`mint-nft.js`ファイルを作成し、以下のコード行を追加します。
+`scripts`ディレクトリ内に`mint-nft.js`ファイルを作成し、以下のコード行を追加してください。
```js
require("dotenv").config()
@@ -43,19 +41,19 @@ const web3 = createAlchemyWeb3(API_URL)
## ステップ3: コントラクトABIを取得する {#contract-abi}
-コントラクトABI(アプリケーションバイナリインターフェイス)は、スマートコントラクトと対話するためのインターフェイスです。 コントラクトABIの詳細については、[こちら](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is)をご覧ください。 Hardhatは自動的にABIを生成して、`MyNFT.json`ファイルに保存します。 このABIを使用するには、`mint-nft.js`に次のコードを追加して、ABIをパースする必要があります。
+コントラクトABI (Application Binary Interface) は、スマートコントラクトと対話するためのインターフェイスです。 コントラクトABIの詳細は[こちら](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is)をご覧ください。 Hardhatは自動的にABIを生成し、`MyNFT.json`ファイルに保存します。 これを使用するには、`mint-nft.js`ファイルに以下のコード行を追加してコンテンツを解析する必要があります。
```js
const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
```
-ABIを表示したい場合は、次のコードを追加することでコンソールに出力できます:
+ABIを確認したい場合は、コンソールに出力できます:
```js
console.log(JSON.stringify(contract.abi))
```
-`mint-nft.js`を実行し、コンソールに出力されたABIを表示するには、ターミナルに移動して次のコードを実行します。
+`mint-nft.js`を実行し、コンソールに出力されたABIを確認するには、ターミナルに移動して以下を実行します。
```js
node scripts/mint-nft.js
@@ -63,61 +61,61 @@ node scripts/mint-nft.js
## ステップ4: IPFSを使用してNFTのメタデータを設定する {#config-meta}
-パート1のチュートリアルを思い出してください。スマートコントラクトの`mintNFT`関数は、NFTのメタデータを記述したJSONドキュメントで解決すべきtokenURIパラメータを取り込みます。その結果、NFTが生成され、名前、記述、画像、その他の属性などの設定可能なプロパティを実装することができます。
+パート1のチュートリアルで触れたように、`mintNFT`スマートコントラクト関数は、`tokenURI`パラメータを受け取ります。このパラメータは、NFTのメタデータを記述したJSONドキュメントに解決される必要があります。このメタデータこそがNFTに命を吹き込み、名前、説明、画像、その他の属性などの設定可能なプロパティを持たせることを可能にするのです。
-> _Interplanetary File System(IPFS)は、分散型ファイルシステムでデータを格納、共有するための分散プロトコルであり、ピアツーピアネットワークです。_
+> _Interplanetary File System (IPFS) は、分散ファイルシステムでデータを保存・共有するための、分散型プロトコルでありピアツーピアネットワークです。_
-私たちは、NFTアセットとメタデータを保存してNFTを真に分散化するために、便利なIPFS APIとツールキットであるPinataを使用します。 Pinataアカウントをお持ちでない場合は、[こちら](https://app.pinata.cloud)から無料アカウントにサインアップし、メールアドレスの認証手順を完了してください。
+NFTが真に分散化されるように、便利なIPFS APIおよびツールキットであるPinataを使用して、NFTのアセットとメタデータを保存します。 Pinataのアカウントをお持ちでない場合は、[こちら](https://app.pinata.cloud)から無料アカウントにサインアップし、メールアドレスの認証手続きを完了してください。
-アカウント作成後の手順:
+アカウントを作成したら:
-- 「Files」ページに移動し、ページの左上にある青色の「Upload」ボタンをクリックします。
+- 「Files」ページに移動し、ページの左上にある青い「Upload」ボタンをクリックします。
-- Pinataに画像をアップロードします。これがNFTの画像アセットになります。 アセットに好きな名前を付けてください。
+- 画像をPinataにアップロードします。これがあなたのNFTの画像アセットになります。 アセットには自由に名前を付けてかまいません。
-- アップロード後、「Files」ページのテーブルにファイル情報が表示されます。 また、CID列も表示されます。 隣のコピーボタンをクリックするとCIDをコピーできます。 アップロードは`https://gateway.pinata.cloud/ipfs/`で確認できます。 例えば、IPFSで使われている画像は、[こちら](https://gateway.pinata.cloud/ipfs/QmZdd5KYdCFApWn7eTZJ1qgJu18urJrP9Yh1TZcZrZxxB5)です。
+- アップロード後、「Files」ページのテーブルにファイル情報が表示されます。 CID列も表示されます。 隣にあるコピーボタンをクリックすると、CIDをコピーできます。 アップロードしたファイルは `https://gateway.pinata.cloud/ipfs/` で確認できます。 例えば、私たちが使用した画像はIPFS上の[こちら](https://gateway.pinata.cloud/ipfs/QmZdd5KYdCFApWn7eTZJ1qgJu18urJrP9Yh1TZcZrZxxB5)にあります。
-視覚型学習者のために、上記の手順を要約します。
+視覚的に学習したい方のために、上記の手順を以下にまとめます。

-次に、Pinataにもう1件ドキュメントをアップロードしますが、 その前にドキュメントを作成する必要があります。
+さて、Pinataにもう一つドキュメントをアップロードします。 しかしその前に、それを作成する必要があります。
-ルートディレクトリに`nft-metadata.json`というファイルを新規作成し、以下のjsonコードを追加してください。
+ルートディレクトリに `nft-metadata.json` という新しいファイルを作成し、以下のJSONコードを追加してください。
```json
{
"attributes": [
{
- "trait_type": "Breed",
- "value": "Maltipoo"
+ "trait_type": "品種",
+ "value": "マルプー"
},
{
- "trait_type": "Eye color",
- "value": "Mocha"
+ "trait_type": "目の色",
+ "value": "モカ"
}
],
- "description": "The world's most adorable and sensitive pup.",
+ "description": "世界で最も愛らしくて繊細な子犬です。",
"image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",
- "name": "Ramses"
+ "name": "ラムセス"
}
```
-json内のデータは自由に変更できます。 属性セクションを削除または追加できます。 最も重要なことは、画像フィールドがIPFS画像の位置を指していることを確認することです。そうしないと、NFTに(とても可愛い)犬の写真が含まれます。
+JSON内のデータは自由に変更してかまいません。 `attributes`セクションは削除したり、追加したりできます。 最も重要なのは、`image`フィールドがあなたのIPFS画像の場所を指していることを確認することです。さもなければ、あなたのNFTには(とてもかわいい!) 犬の写真が含まれてしまいます。
-JSONファイルの編集が終わったら、保存して、画像のアップロードと同じ手順でPinataにアップロードしてください。
+JSONファイルの編集が終わったら保存し、画像をアップロードしたのと同じ手順でPinataにアップロードしてください。
-
+
## ステップ5: コントラクトのインスタンスを作成する {#instance-contract}
-ここで、私たちのコントラクトと対話するには、コード内でインスタンスを作成する必要があります インスタンスの作成には、コントラクトアドレスが必要になります。コントラクトをデプロイする際に使用したアドレスを検索することで、デプロイメントまたは[Etherscan](https://sepolia.etherscan.io/)から取得できます。
+さて、コントラクトとやりとりするには、コード内でそのインスタンスを作成する必要があります。 そのためにはコントラクトアドレスが必要ですが、これはデプロイメントから取得するか、コントラクトのデプロイに使用したアドレスを[Blockscout](https://eth-sepolia.blockscout.com/)で検索することで取得できます。
-
+
-上記の例では、コントラクトのアドレスは、0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778です。
+上記の例では、コントラクトアドレスは`0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778`です。
-次に、Web3の[コントラクトメソッド](https://docs.web3js.org/api/web3-eth-contract/class/Contract)を活用して、ABIとアドレスを使用したコントラクトを作成します。 `mint-nft.js`ファイルに以下を追加します。
+次に、ABIとアドレスを使い、Web3の[contractメソッド](https://docs.web3js.org/api/web3-eth-contract/class/Contract)でコントラクトを作成します。 `mint-nft.js`ファイルに、以下を追加します。
```js
const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
@@ -125,39 +123,39 @@ const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
```
-## ステップ6: `.env`ファイルをアップデートする {#update-env}
+## ステップ6: `.env`ファイルを更新する {#update-env}
-それでは、イーサリアムチェーンにトランザクションを作成して送信するために、公開されているイーサリアムのアカウントアドレスを使用してアカウントのノンスを取得します(以下で説明します)。
+さて、イーサリアムチェーンにトランザクションを作成して送信するために、あなたの公開イーサリアムアカウントアドレスを使用してアカウントのノンス(後述)を取得します。
-`.env`ファイルにあなたの公開鍵を追加します。チュートリアルのパート1を完了している場合、`.env`ファイルは次のようになっているはずです。
+あなたの公開鍵を`.env`ファイルに追加してください。チュートリアルのパート1を完了している場合、`.env`ファイルは次のようになっているはずです:
```js
-API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
-PRIVATE_KEY = "your-private-account-address"
-PUBLIC_KEY = "your-public-account-address"
+API_URL = "https://eth-sepolia.g.alchemy.com/v2/あなたのAPIキー"
+PRIVATE_KEY = "あなたのプライベートアカウントアドレス"
+PUBLIC_KEY = "あなたのパブリックアカウントアドレス"
```
## ステップ7: トランザクションを作成する {#create-txn}
-まず、`mintNFT(tokenData)`という名前の関数を定義し、次のようにトランザクションを作成してみましょう。
+まず、`mintNFT(tokenData)`という名前の関数を定義し、以下のようにトランザクションを作成します。
-1. _PRIVATE_KEY_と_PUBLIC_KEY_を`.env`ファイルから取得します。
+1. `.env`ファイルから_PRIVATE_KEY_と_PUBLIC_KEY_を取得します。
-1. 次に、アカウントのノンスを確認します。 ノンスの指定は、あなたのアドレスから送信されたトランザクションの数を追跡するために使用されます。これは、セキュリティ目的で、[リプレイ攻撃](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce)を防ぐために必要となります。 あなたのアドレスから送信されたトランザクションの数を取得するには、 [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount)を使用します。
+2. 次に、アカウントのノンスを確認する必要があります。 ノンスの仕様は、あなたのアドレスから送信されたトランザクション数を追跡するために使用されます。これは、セキュリティ上の目的と、[リプレイ攻撃](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce)を防ぐために必要です。 あなたのアドレスから送信されたトランザクション数を取得するには、[getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount)を使用します。
-1. 最後に、以下の情報を使用してトランザクションを設定します。
+3. 最後に、以下の情報でトランザクションをセットアップします。
-- `'from': PUBLIC_KEY` — トランザクションの発信元は公開アドレス
+- `'from': PUBLIC_KEY` — トランザクションの発信元である、私たちの公開アドレス
-- `'to': contractAddress` — 対話し、トランザクションを送信したいコントラクト
+- `'to': contractAddress` — やりとりを行い、トランザクションを送信したいコントラクト
-- `'nonce': nonce` — アドレスから送信されたトランザクションの数を持つアカウントのノンス
+- `'nonce': nonce` — 私たちのアドレスから送信されたトランザクション数を含むアカウントのノンス
-- `'gas': estimatedGas` —トランザクションを完了するために必要な推定ガス
+- `'gas': estimatedGas` — トランザクションを完了するために必要な推定ガス量
-- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` — このトランザクションで実行したい計算。今回の場合は、NFTを発行すること。
+- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` — このトランザクションで実行したい計算、この場合はNFTのミント
-`mint-nft.js`ファイルは、現在このような状態になっているはずです。
+`mint-nft.js`ファイルは次のようになっているはずです:
```js
require('dotenv').config();
@@ -175,7 +173,7 @@ PUBLIC_KEY = "your-public-account-address"
async function mintNFT(tokenURI) {
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //get latest nonce
- //the transaction
+ //トランザクション
const tx = {
'from': PUBLIC_KEY,
'to': contractAddress,
@@ -188,9 +186,9 @@ PUBLIC_KEY = "your-public-account-address"
## ステップ8: トランザクションに署名する {#sign-txn}
-さて、トランザクションを作成したら、それを送信するために署名する必要があります。 ここで秘密鍵を使用します。
+トランザクションを作成したので、次に送信するために署名する必要があります。 ここで秘密鍵を使用します。
-`web3.eth.sendSignedTransaction`はトランザクションハッシュを提供することで、トランザクションがきちんとマイニングされ、ネットワークによってドロップされていないことを確認できます。 トランザクション署名のセクションにいくつかエラーチェックを追加することで、トランザクションが正常に完了したかどうかを確認できるようにしておきます。
+`web3.eth.sendSignedTransaction`はトランザクションハッシュを返します。これを使用して、トランザクションがマイニングされ、ネットワークによってドロップされなかったことを確認できます。 トランザクション署名のセクションでは、トランザクションが正常に実行されたかどうかを知るために、エラーチェックを追加していることにお気づきでしょう。
```js
require("dotenv").config()
@@ -208,7 +206,7 @@ const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
async function mintNFT(tokenURI) {
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce
- //the transaction
+ //トランザクション
const tx = {
from: PUBLIC_KEY,
to: contractAddress,
@@ -225,13 +223,13 @@ async function mintNFT(tokenURI) {
function (err, hash) {
if (!err) {
console.log(
- "The hash of your transaction is: ",
+ "トランザクションのハッシュ: ",
hash,
- "\nCheck Alchemy's Mempool to view the status of your transaction!"
+ "\nAlchemyのメンプールでトランザクションのステータスを確認してください!"
)
} else {
console.log(
- "Something went wrong when submitting your transaction:",
+ "トランザクションの送信中に問題が発生しました:",
err
)
}
@@ -239,24 +237,24 @@ async function mintNFT(tokenURI) {
)
})
.catch((err) => {
- console.log(" Promise failed:", err)
+ console.log(" Promiseが失敗しました:", err)
})
}
```
-## ステップ9: `mintNFT`を呼び出し、ノード`mint-nft.js`を実行する {#call-mintnft-fn}
+## ステップ9: `mintNFT`を呼び出し、`node mint-nft.js`を実行する {#call-mintnft-fn}
-Pinataにアップロードした`metadata.json`を覚えているでしょうか。 Pinataからそのハッシュコードを取得し、`https://gateway.pinata.cloud/ipfs/`をパラメータとして、関数`mintNFT`に渡します。
+Pinataにアップロードした`metadata.json`を覚えていますか? Pinataからそのハッシュコードを取得し、`https://gateway.pinata.cloud/ipfs/`をパラメータとして`mintNFT`関数に渡します。
-ハッシュコードを取得する方法をこちらにご紹介します。
+ハッシュコードを取得する方法は次のとおりです。
-_Pinataでnftメタデータハッシュコードを取得する方法_
+_PinataでNFTメタデータのハッシュコードを取得する方法_
-> 別のウィンドウで`https://gateway.pinata.cloud/ipfs/`を読み込んでみて、コピーしたハッシュコードが**metadata.json**にリンクしているか確認します。 以下のスクリーンショットと類似したページが表示されるはずです。
+> 別のウィンドウで `https://gateway.pinata.cloud/ipfs/` を読み込み、コピーしたハッシュコードがあなたの**metadata.json**にリンクしていることを再確認してください。 ページは下のスクリーンショットのようになっているはずです。
-_ページにjsonメタデータが表示されるはずです_
+_ページにJSONメタデータが表示されるはずです_
-最終的には、次のようなコードになっているはずです。
+すべてをまとめると、コードは次のようになります。
```js
require("dotenv").config()
@@ -274,7 +272,7 @@ const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
async function mintNFT(tokenURI) {
const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce
- //the transaction
+ //トランザクション
const tx = {
from: PUBLIC_KEY,
to: contractAddress,
@@ -291,13 +289,13 @@ async function mintNFT(tokenURI) {
function (err, hash) {
if (!err) {
console.log(
- "The hash of your transaction is: ",
+ "トランザクションのハッシュ: ",
hash,
- "\nCheck Alchemy's Mempool to view the status of your transaction!"
+ "\nAlchemyのメンプールでトランザクションのステータスを確認してください!"
)
} else {
console.log(
- "Something went wrong when submitting your transaction:",
+ "トランザクションの送信中に問題が発生しました:",
err
)
}
@@ -305,25 +303,27 @@ async function mintNFT(tokenURI) {
)
})
.catch((err) => {
- console.log("Promise failed:", err)
+ console.log("Promiseが失敗しました:", err)
})
}
mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")
```
-次に、`node scripts/mint-nft.js`を実行してNFTをデプロイします。 数秒後にターミナル上に次のようなレスポンスが表示されるはずです。
+さて、`node scripts/mint-nft.js`を実行して、NFTをミントしましょう。 数秒後、ターミナルに次のような応答が表示されるはずです。
- The hash of your transaction is: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8
+ ```
+ トランザクションのハッシュ: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8
- Alchemyのメンプールをチェックし、あなたのトランザクションのステータスを確認しましょう。
+ Alchemyのメンプールでトランザクションのステータスを確認してください!
+ ```
-[Alchemy mempool](https://dashboard.alchemyapi.io/mempool)にアクセスして、トランザクションのステータス(保留中、マイニング中、ネットワークによってドロップされたかどうか)を確認します。 トランザクションが削除された場合は、 [Sepolia Etherscan](https://sepolia.etherscan.io/)を確認してトランザクションハッシュを検索することもできます。
+次に、[Alchemyメンプール](https://dashboard.alchemyapi.io/mempool)にアクセスして、トランザクションのステータス(ペンディング、マイニング済み、またはネットワークによるドロップ)を確認します。 トランザクションがドロップされた場合は、[Blockscout](https://eth-sepolia.blockscout.com/)でトランザクションハッシュを検索して確認することも役立ちます。
-_EtherscanでNFTトランザクションハッシュを表示します_
+_EtherscanでNFTトランザクションハッシュを表示_
-以上で完了です。 イーサリアムブロックチェーン上にデプロイしてNFTをミントしました。
+以上です。 これで、イーサリアムブロックチェーン上でNFTをデプロイし、ミントしました
-`mint-nft.js`を使えば、あなたの心(ウォレット)が望むだけ、NFTをミントすることができます。 NFTのメタデータを記述した新しいtokenURIを必ず渡してください(この作業を怠ると、異なるIDを備えた同一のものを大量に作成してしまいます)。
+`mint-nft.js`を使えば、あなた(とウォレット)が望むだけNFTをミントできます。 必ずNFTのメタデータを記述した新しい`tokenURI`を渡すようにしてください(そうしないと、IDが違うだけで同一のものを大量に作ってしまうことになります)。
-ウォレットにNFTを表示する方法については、[パート3: ウォレットにNFTを表示する方法](/developers/tutorials/how-to-view-nft-in-metamask/)をご覧ください。
+おそらく、ウォレットで自分のNFTを披露したいと思うでしょう。そのために、ぜひ[パート3: ウォレットでNFTを表示する方法](/developers/tutorials/how-to-view-nft-in-metamask/)もチェックしてください。
diff --git a/public/content/translations/ja/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/ja/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md
index af2a8e5f252..c264704dcbf 100644
--- a/public/content/translations/ja/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md
+++ b/public/content/translations/ja/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md
@@ -1,30 +1,26 @@
---
-title: Solidity で、スマートコントラクトのテスト用モックアップを作成する方法
-description: テストでは、コントラクトのモックアップを使用すべき理由
+title: "Solidity で、スマートコントラクトのテスト用モックアップを作成する方法"
+description: "テストでは、コントラクトのモックアップを使用すべき理由"
author: Markus Waas
lang: ja
-tags:
- - "Solidity"
- - "スマートコントラクト"
- - "テスト"
- - "モック"
+tags: [ "Solidity", "スマートコントラクト", "テスト", "モックアップ作成" ]
skill: intermediate
published: 2020-05-02
source: soliditydeveloper.com
sourceUrl: https://soliditydeveloper.com/mocking-contracts
---
-[モック・オブジェクト](https://wikipedia.org/wiki/Mock_object) は、オブジェクト指向プログラミングにおいて一般的なデザインパターンです。 「モック」という言葉は、古フランス語で「からかう」という意味を持つ「mocquer」が由来で、「本物を模倣する」という意味に発展しました。これこそ、プログラミングにで「モックアップ」を作成する作業です。 あなたが作成したスマートコントラクトについて「からかう」必要はありませんが、「モックアップ」の作成はできる限り必ず行ってください。 後々、楽になります。
+「[モックオブジェクト](https://wikipedia.org/wiki/Mock_object)」は、オブジェクト指向プログラミングにおいて一般的なデザインパターンです。 「モック」という言葉は、古フランス語で「からかう」という意味を持つ「mocquer」が由来で、「本物を模倣する」という意味に発展しました。これこそ、プログラミングにで「モックアップ」を作成する作業です。 あなたが作成したスマートコントラクトについて「からかう」必要はありませんが、「モックアップ」の作成はできる限り必ず行ってください。 後々、楽になります。
-## コントラクトのモックアップを使った単体テスト {#unit-testing-contracts-with-mocks}
+## モックを使ったコントラクトの単体テスト {#unit-testing-contracts-with-mocks}
-コントラクトのモックアップを作成するとは、究極的に、オリジナルとほぼ同様に動作するものの、デベロッパが簡単に管理できる第2のバージョンを作成することです。 複雑なコントラクトを開発すると、[コントラクト全体の一部のみを単体テストする](/developers/docs/smart-contracts/testing/)必要が発生する場合が少なくありません。 問題となるのは、この一部分をテストする上で、非常に具体的なコントラクトの状態を再現する必要があるものの、再現するのが難しい場合です。
+コントラクトのモックアップを作成するとは、究極的に、オリジナルとほぼ同様に動作するものの、デベロッパが簡単に管理できる第2のバージョンを作成することです。 複雑なコントラクトを扱うことになると、[コントラクトのごく一部だけを単体テスト](/developers/docs/smart-contracts/testing/)したい場合がよくあります。 問題となるのは、この一部分をテストする上で、非常に具体的なコントラクトの状態を再現する必要があるものの、再現するのが難しい場合です。
テストに求められる状態を再現するために、テストを設定するための複雑なロジックを作成する代わりに、モックアップを作成すればよいのです。 コントラクトのモックアップは、継承を使って簡単に作成できます。 オリジナル版を継承したモックアップのコントラクトを作成するだけです。 モックアップでは、機能をオーバーライドすることができます。 この点については、具体例で見てみましょう。
-## 例:プライベートのERC-20コントラクト {#example-private-erc20}
+## 例: Private ERC20 {#example-private-erc20}
-ここでは、当初にプライベート期間が設定された ERC-20 コントラクトを使って説明します。 トークン所有者はプライベートユーザーを管理でき、当初トークンを受け取ることができるのはプライベートユーザーのみになります。 設定した時間が経過した後は、すべてのユーザーがトークンを使用できるようになります。 参考までに、この例では新しいOpenZeppelinコントラクトv3に含まれている[`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/5.x/extending-contracts#using-hooks)フックを使用しています。
+ここでは、当初にプライベート期間が設定された ERC-20 コントラクトを使って説明します。 トークン所有者はプライベートユーザーを管理でき、当初トークンを受け取ることができるのはプライベートユーザーのみになります。 設定した時間が経過した後は、すべてのユーザーがトークンを使用できるようになります。 ちなみに、新しいOpenZeppelin contracts v3の[`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/5.x/extending-contracts#using-hooks)フックを使用しています。
```solidity
pragma solidity ^0.6.0;
@@ -90,17 +86,17 @@ contract PrivateERC20Mock is PrivateERC20 {
- `PrivateERC20Mock.sol: TypeError: Overriding function is missing "override" specifier.`
- `PrivateERC20.sol: TypeError: Trying to override non-virtual function. Did you forget to add "virtual"?.`
-Solidityの新しいバージョン(0.6)を使用しているため、オーバーライド可能な関数については`virtual`のキーワードを追加して、オーバーライド関数をオーバーライドする必要があります。 このため、両方の`isPublic`関数にこのキーワードを追加します。
+新しいSolidityバージョン0.6を使用しているため、オーバーライドされる関数には`virtual`キーワードを、オーバーライドする関数には`override`を追加する必要があります。 では、両方の`isPublic`関数にそれらを追加しましょう。
-これで、単体テストで`PrivateERC20Mock`を使えるようになりました。 プライベート利用期間中の動作をテストしたい場合は、`setIsPublic(false)`を使用し、パブリック利用期間については`setIsPublic(true)`を使ってテストしてください。 もちろん、[time helpers](https://docs.openzeppelin.com/test-helpers/0.5/api#increase)を使って、対象時間を変更することもできます。 しかし、すでにモックアップの有用性について理解できたでしょう。単に時間を進めるよりも、モックアップを利用した方が望ましいシナリオがすぐに思い浮かぶはずです。
+これで、単体テストで代わりに`PrivateERC20Mock`を使用できます。 プライベート利用期間中の動作をテストしたい場合は`setIsPublic(false)`を、同様にパブリック利用期間のテストには`setIsPublic(true)`を使用します。 もちろん、この例では[タイムヘルパー](https://docs.openzeppelin.com/test-helpers/0.5/api#increase)を使って、時間も同様に変更することもできます。 しかし、すでにモックアップの有用性について理解できたでしょう。単に時間を進めるよりも、モックアップを利用した方が望ましいシナリオがすぐに思い浮かぶはずです。
-## 複数のコントラクトに対してモックアップを作成する場合 {#mocking-many-contracts}
+## 多数のコントラクトのモック {#mocking-many-contracts}
-モックアップごとに新たなコントラクトを作成するのは煩雑な作業ですね。 これを避けたい場合は、[MockContract](https://github.com/gnosis/mock-contract)ライブラリを参照してください。 このライブラリを用いることで、コントラクトの動作をその場でオーバーライドし、変更することができます。 ただしこのライブラリは、別のコントラクトに対する呼び出しのみに対応していますので、今回は使用できません。
+モックアップごとに新たなコントラクトを作成するのは煩雑な作業ですね。 これが気になる場合は、[MockContract](https://github.com/gnosis/mock-contract)ライブラリをご覧ください。 これにより、コントラクトの動作をその場でオーバーライドして変更できます。 ただしこのライブラリは、別のコントラクトに対する呼び出しのみに対応していますので、今回は使用できません。
-## モックアップは、その他にも利点があります {#mocking-can-be-even-more-powerful}
+## モックはさらに強力になりうる {#mocking-can-be-even-more-powerful}
モックアップ作成のメリットは、他にもあります。
-- 関数の追加:特定の関数をオーバーライドする機能だけでなく、関数を追加できることも有益です。 トークンを対象とする場合のよい例としては、`ミント`機能を追加することで、ユーザーが新規トークンを無料で手に入れられるようにすることができます。
+- 関数の追加:特定の関数をオーバーライドする機能だけでなく、関数を追加できることも有益です。 トークンの良い例として、追加の`mint`関数を持たせることで、どのユーザーでも新しいトークンを無料で取得できるようにすることが挙げられます。
- テストネットでの使用:Dapp と共に、テストネット上でコントラクトをデプロイ、テストする際は、モックアップの活用を検討すべきです。 本当に必要な場合を除き、関数をオーバーライドすることは避けるべきです。 結局のところ、実際のロジックをテストする必要があるからです。 しかし例えば、コントラクトのステートを、新たにデプロイする必要なしで開始時点にリセットするだけのリセット機能は、有益な場合があるでしょう。 言うまでもなく、メインネット用のコントラクトにはこのようなリセット機能を含めてはなりません。
diff --git a/public/content/translations/ja/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/ja/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
index e481f540dfb..717f159151b 100644
--- a/public/content/translations/ja/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
+++ b/public/content/translations/ja/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md
@@ -1,17 +1,12 @@
---
-title: スマートコントラクトのテストにEchidnaを使用する方法
-description: Echidnaを使用して、スマートコントラクトを自動でテストする方法
+title: "Echidnaを使用してスマートコントラクトをテストする方法"
+description: "Echidnaを使用してスマートコントラクトを自動テストする方法"
author: "Trailofbits"
lang: ja
-tags:
- - "Solidity"
- - "スマートコントラクト"
- - "セキュリティ"
- - "テスト"
- - "ファジング"
+tags: [ "Solidity", "スマートコントラクト", "セキュリティ", "テスト", "ファジング" ]
skill: advanced
published: 2020-04-10
-source: セキュアなコントラクトの構築
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna
---
@@ -19,53 +14,53 @@ sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/progr
Echidnaは、Dockerまたはコンパイル済みのバイナリを使用してインストールします。
-### DockerからEchidnaをインストールする {#echidna-through-docker}
+### DockerによるEchidna {#echidna-through-docker}
```bash
docker pull trailofbits/eth-security-toolbox
docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox
```
-_最後のコマンドは、現在のディレクトリにアクセスできるdockerでeth-security-toolboxを実行します。 ホストからファイルを変更し、dockerからファイル上のツールを実行できます。_
+_最後のコマンドは、現在のディレクトリにアクセスできるDockerでeth-security-toolboxを実行します。 ホストからファイルを変更し、Dockerからファイル上のツールを実行できます。_
-dockerで、以下を実行します:
+Docker内で次を実行します:
```bash
solc-select 0.5.11
cd /home/training
```
-### バイナリの入手先 {#binary}
+### バイナリ {#binary}
[https://github.com/crytic/echidna/releases/tag/v1.4.0.0](https://github.com/crytic/echidna/releases/tag/v1.4.0.0)
-## プロパティベースのファジングとは {#introduction-to-property-based-fuzzing}
+## プロパティベースファジング入門 {#introduction-to-property-based-fuzzing}
-Echidnaは、プロパティベースのファザーです。これについては、以前のブログ投稿([1](https://blog.trailofbits.com/2018/03/09/echidna-a-smart-fuzzer-for-ethereum/)、[2](https://blog.trailofbits.com/2018/05/03/state-machine-testing-with-echidna/)、[3](https://blog.trailofbits.com/2020/03/30/an-echidna-for-all-seasons/))を参照してください。
+Echidnaはプロパティベースのファザーであり、以前のブログ投稿([1](https://blog.trailofbits.com/2018/03/09/echidna-a-smart-fuzzer-for-ethereum/)、[2](https://blog.trailofbits.com/2018/05/03/state-machine-testing-with-echidna/)、[3](https://blog.trailofbits.com/2020/03/30/an-echidna-for-all-seasons/))で説明しています。
### ファジング {#fuzzing}
-[ファジング ](https://wikipedia.org/wiki/Fuzzing)は、セキュリティコミュニティでよく知られているテクニックです。 ファジングでは、プログラム内のバグを見つけるために、大小のランダムな入力を生成することを行います。 通常のソフトウェアを対象とするファザー([AFL](http://lcamtuf.coredump.cx/afl/)や[LibFuzzer](https://llvm.org/docs/LibFuzzer.html)など)は、効率的にバグを特定できるツールであると評価されています。
+[ファジング](https://wikipedia.org/wiki/Fuzzing)は、セキュリティコミュニティでよく知られているテクニックです。 プログラム内のバグを見つけるために、ある程度ランダムな入力を生成するものです。 従来のソフトウェア用のファザー([AFL](http://lcamtuf.coredump.cx/afl/)や[LibFuzzer](https://llvm.org/docs/LibFuzzer.html)など)は、バグを見つけるための効率的なツールとして知られています。
-入力をまったくランダムに生成するだけでなく、適切な入力を生成するための多くのテクニックや戦略を活用できます:
+純粋にランダムな入力生成以外に、適切な入力を生成するための多くのテクニックや戦略があります。以下に例を挙げます。
-- 各実行から取得したフィードバックに基づき、入力を生成する。 例えば、新しく生成された入力値が新しいパスの発見を導いている場合、それに近い新しい入力値を生成することは理にかなっています。
-- 構造上の制約を考慮した入力を生成する。 例えば、入力にチェックサム付のヘッダーが含まれている場合、ファザーにチェックサムを検証する入力を生成させることも有益です。
-- 既知の入力に基づいて新たな入力を生成する。大規模な有効な入力のデータセットにアクセスできる場合、まったくランダムに生成するのではなく、それらに基づいて新たな入力を生成することができます。 この場合、参照するデータを_シード_と呼びます。
+- 各実行からフィードバックを取得し、それを使用して生成をガイドします。 例えば、新しく生成された入力が新しいパスの発見につながる場合、それに近い新しい入力を生成することは理にかなっています。
+- 構造的制約を尊重して入力を生成する。 例えば、入力にチェックサム付きのヘッダーが含まれている場合、ファザーにチェックサムを検証する入力を生成させるのは理にかなっています。
+- 既知の入力を使用して新しい入力を生成する:有効な入力の大規模なデータセットにアクセスできる場合、ファザーはゼロから生成を開始するのではなく、それらから新しい入力を生成できます。 これらは通常、_シード_と呼ばれます。
-### プロパティベースのファジング {#property-based-fuzzing}
+### プロパティベースファジング {#property-based-fuzzing}
-Echidnaは、プロパティに基づくファジングを実行するファザーであり、[QuickCheck](https://wikipedia.org/wiki/QuickCheck)の影響を強く受けたプログラムです。 クラッシュを監視する従来のファザーとは異なり、Echidnaでは、ユーザー定義の不変条件を壊そうとします。
+Echidnaは、[QuickCheck](https://wikipedia.org/wiki/QuickCheck)に強くインスパイアされたプロパティベースファジングという、ファザーの特定の種類に属します。 クラッシュを見つけようとする従来のファザーとは対照的に、Echidnaはユーザー定義の不変条件を破ろうとします。
-スマートコントラクトにおける不変条件とは、コントラクトにおいて不適切または無効な状態が発生しうるSolidityの関数を意味します。具体的には、以下が挙げられます:
+スマートコントラクトにおける不変条件とは、コントラクトが到達しうる不正または無効な状態を表すSolidity関数であり、次のようなものが含まれます。
-- 不適切なアクセス制御:攻撃者がコントラクトの所有者になる場合。
-- 不適切な状態マシン:コントラクトの一次停止中に、トークンを送信できる。
-- 不適切な計算: ユーザーは残高をアンダーフローし無制限に無料トークンを取得できる。
+- 不正なアクセス制御:攻撃者がコントラクトの所有者になる。
+- 不正な状態マシン:コントラクトが一時停止している間にトークンを転送できる。
+- 不正な算術演算:ユーザーが残高をアンダーフローさせ、無制限の無料トークンを取得できる。
-### Echidnaを使って、プロパティをテストする {#testing-a-property-with-echidna}
+### Echidnaでプロパティをテストする {#testing-a-property-with-echidna}
-それでは、Echidnaを使ってスマートコントラクトをテストする方法を見てみましょう。 対象は、[ `token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol)のスマートコントラクトです。
+Echidnaを使ってスマートコントラクトをテストする方法を見ていきましょう。 対象は、次のスマートコントラクト[`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol)です。
```solidity
contract Token{
@@ -83,26 +78,26 @@ contract Token{
}
```
-このトークンは、以下のプロパティを持つと想定します:
+このトークンは、以下のプロパティを持つと想定します。
-- ユーザーは、最大1000トークンを所持できる
-- このトークン(ERC-20トークンではない)は、送信不可である
+- 誰でも最大1000トークンを保有できます
+- このトークンは転送できません(ERC20トークンではありません)
### プロパティを記述する {#write-a-property}
-Echidnaのプロパティは、Solidityの関数です。 プロパティは、以下の条件を満たす必要があります:
+Echidnaのプロパティは、Solidityの関数です。 プロパティは、以下の条件を満たす必要があります。
- 引数を持たない
-- 実行に成功した場合、 `true` を返す
-- `echidna`で始まる名前を持つ
+- 成功した場合に`true`を返す
+- 名前が`echidna`で始まる
-Echidnaは、以下を実行します:
+Echidnaは、以下を実行します。
-- このプロパティをテストするためのランダムなトランザクションを自動で生成する。
-- プロパティが `false`またはエラーを返すすべてのトランザクションを報告する。
-- プロパティの呼び出しに伴う副作用を無視する(つまり、プロパティが状態変数を変更した場合、テスト後にこの変更を破棄する)
+- プロパティをテストするために、任意のトランザクションを自動的に生成します。
+- プロパティが`false`を返すか、エラーをスローするトランザクションを報告します。
+- プロパティ呼び出し時の副作用を破棄する(つまり、プロパティが状態変数を変更した場合、テスト後にその変更は破棄されます)
-以下のプロパティは、呼び出し元のユーザーが所持するトークンが1000以下であることを確認します。
+以下のプロパティは、呼び出し元が1000トークンを超えて保有していないことをチェックします。
```solidity
function echidna_balance_under_1000() public view returns(bool){
@@ -120,36 +115,36 @@ contract TestToken is Token{
}
```
-[`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol)は、プロパティを実装し、このトークンを継承します。
+[`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol)はプロパティを実装し、トークンを継承します。
-### コントラクトを開始する {#initiate-a-contract}
+### コントラクトの初期化 {#initiate-a-contract}
-Echidnaでは、引数なしの[コンストラクタ](/developers/docs/smart-contracts/anatomy/#constructor-functions)が必要です。 コントラクトにおいて特定の初期化が必要な場合、コンストラクタ上で実行する必要があります。
+Echidnaには、引数のない[コンストラクタ](/developers/docs/smart-contracts/anatomy/#constructor-functions)が必要です。 コントラクトに特定の初期化が必要な場合、コンストラクタで行う必要があります。
-Echidnaには、いくつかの特定のアドレスが含まれます:
+Echidnaには、いくつかの特定のアドレスが含まれます。
-- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72`:コンストラクタを呼び出すアドレスです。
-- `0x10000`、`0x20000`、`0x00a329C0648769a73afAC7F9381e08fb43DBEA70`:他の関数をランダムに呼び出すアドレスです。
+- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72`はコンストラクタを呼び出します。
+- `0x10000`、`0x20000`、および`0x00a329C0648769a73afAC7F9381e08fb43DBEA70`は、他の関数をランダムに呼び出します。
-このチュートリアルでは特定の初期化を実行する必要がないため、コンストラクタは空になります。
+この例では特定の初期化は必要ないため、コンストラクタは空になります。
-### Echidnaを実行する {#run-echidna}
+### Echidnaの実行 {#run-echidna}
-以下のコードで、Echidnaを起動します:
+Echidnaは次のように起動します。
```bash
echidna-test contract.sol
```
-contract.solに複数のコントラクトが含まれる場合、実行したいコントラクトを指定できます:
+contract.solに複数のコントラクトが含まれる場合、対象を指定できます。
```bash
echidna-test contract.sol --contract MyContract
```
-### プロパティテストのまとめ {#summary-testing-a-property}
+### まとめ:プロパティのテスト {#summary-testing-a-property}
-以下は、このチュートリアルにおけるEchidnaの実行をまとめたものです。
+以下は、この例におけるEchidnaの実行をまとめたものです。
```solidity
contract TestToken is Token{
@@ -172,11 +167,12 @@ echidna_balance_under_1000: failed!💥
...
```
-Echidnaは、 `backdoor`が呼び出された場合、このプロパティが侵害されることを確認しました。
+Echidnaは、`backdoor`が呼び出された場合にプロパティが違反することを発見しました。
-## ファジング中に呼び出す関数を絞り込む {#filtering-functions-to-call-during-a-fuzzing-campaign}
+## ファジングキャンペーン中に呼び出す関数をフィルタリングする {#filtering-functions-to-call-during-a-fuzzing-campaign}
-ファジングの対象となる関数を絞り込む方法を見ていきましょう。 以下のスマートコントラクトを対象とします:
+ファジング対象となる関数をフィルタリングする方法を見ていきましょう。
+対象は、次のスマートコントラクトです。
```solidity
contract C {
@@ -227,7 +223,9 @@ contract C {
}
```
-この簡単な例は、状態変数を変更する特定のトランザクションのシーケンスをEchidnaに見つけさせるものです。 これは、ファザーにとって容易ではありません([Manticore](https://github.com/trailofbits/manticore)のようなシンボリック実行ツールを使用することをお勧めします)。 Echidnaで、以下のように検証を実行します:
+この簡単な例は、状態変数を変更する特定のトランザクションのシーケンスをEchidnaに見つけさせるものです。
+これはファザーにとって困難です([Manticore](https://github.com/trailofbits/manticore)のようなシンボリック実行ツールの使用が推奨されます)。
+Echidnaを実行して、これを確認できます。
```bash
echidna-test multi.sol
@@ -236,30 +234,32 @@ echidna_state4: passed! 🎉
Seed: -3684648582249875403
```
-### 対象の関数を絞り込む {#filtering-functions}
+### 関数のフィルタリング {#filtering-functions}
-2つのリセット関数(`reset1`と`reset2`)がすべての状態変数を`false`に設定するため、Echidnaはこのコントラクトをテストするための正しいシーケンスを見つけられません。 しかしEchidnaでは、リセット関数をブラックリストに含めるか、 `f`、`g`、 `h`、および `i`の関数のみをホワイトリストに含める特別の機能が利用できます。
+2つのリセット関数(`reset1`と`reset2`)がすべての状態変数を`false`に設定するため、Echidnaがこのコントラクトをテストするための正しいシーケンスを見つけるのは困難です。
+しかし、Echidnaの特別な機能を使用して、リセット関数をブラックリストに登録するか、`f`、`g`、
+`h`、`i`関数のみをホワイトリストに登録することができます。
-関数をブラックリストに登録するには、設定ファイルを以下のように指定します:
+関数をブラックリストに登録するには、この設定ファイルを使用します。
```yaml
filterBlacklist: true
filterFunctions: ["reset1", "reset2"]
```
-関数を絞り込むもう一つの方法は、ホワイトリストに含まれる関数を列挙することです。 これには、設定ファイルを以下のように指定します:
+関数をフィルタリングするもう1つのアプローチは、ホワイトリストに登録された関数をリストアップすることです。 そのためには、この設定ファイルを使用します。
```yaml
filterBlacklist: false
filterFunctions: ["f", "g", "h", "i"]
```
-- `filterBlacklist`の初期値は`true`です。
-- 絞り込みは、名前のみ(パラメータなし)で実行されます。 `f()`と`f(uint256)`の両方が含まれる場合、`"f"`で絞り込むと両方の関数がヒットします。
+- `filterBlacklist`のデフォルト値は`true`です。
+- フィルタリングは、名前のみ(パラメータなし)で実行されます。 `f()`と`f(uint256)`の両方がある場合、フィルタ`"f"`は両方の関数にマッチします。
-### Echidnaを実行する {#run-echidna-1}
+### Echidnaの実行 {#run-echidna-1}
-設定ファイル `blacklist.yaml` に従ってEchidnaを実行するには、以下のようにします:
+Echidnaを構成ファイル`blacklist.yaml`で実行するには、次のようにします。
```bash
echidna-test multi.sol --config blacklist.yaml
@@ -272,11 +272,11 @@ echidna_state4: failed!💥
i()
```
-Echidnaは、プロパティをfalseにするトランザクションのシーケンスを瞬時に特定します。
+Echidnaは、プロパティを偽にするトランザクションのシーケンスをほぼ瞬時に見つけます。
-### 対象の関数を絞り込む作業のまとめ {#summary-filtering-functions}
+### まとめ:関数のフィルタリング {#summary-filtering-functions}
-Echidnaでは、ファジングで呼び出す機能を絞り込むために、ブラックリストあるいはホワイトリストの関数を使用します:
+Echidnaは、ファジングキャンペーン中に呼び出す関数を、以下を使用してブラックリストまたはホワイトリストに登録できます。
```yaml
filterBlacklist: true
@@ -288,11 +288,11 @@ echidna-test contract.sol --config config.yaml
...
```
-Echidnaは、`filterBlacklist`のブール値に基づき、`f1`、`f2`、および `f3`の関数をブラックリストに含めるか、これらの関数のみを呼び出してファジングを実行します。
+Echidnaは、`filterBlacklist`ブール値の値に応じて、`f1`、`f2`、`f3`をブラックリストに登録するか、これらのみを呼び出すファジングキャンペーンを開始します。
## EchidnaでSolidityのアサーションをテストする方法 {#how-to-test-soliditys-assert-with-echidna}
-次の短いチュートリアルでは、Echidnaを使って、コントラクトに含まれるアサーションをテストします。 以下のようなコントラクトを想定します:
+この短いチュートリアルでは、Echidnaを使用してコントラクトのアサーションチェックをテストする方法を説明します。 以下のようなコントラクトを想定します。
```solidity
contract Incrementor {
@@ -309,7 +309,7 @@ contract Incrementor {
### アサーションを記述する {#write-an-assertion}
-引き算を実行した後に、`tmp`の値が`counter`の値以下であることを確認したいとします。 Echidnaのプロパティで記述することもできますが、`tmp`値をどこかに格納する必要があります。 これには、以下のようなアサーションを用いることができます:
+その差を返した後に、`tmp`が`counter`以下であることを確認したいと思います。 Echidnaのプロパティを記述することもできますが、`tmp`の値をどこかに保存する必要があります。 代わりに、このようなアサーションを使用できます。
```solidity
contract Incrementor {
@@ -324,15 +324,15 @@ contract Incrementor {
}
```
-### Echidnaを実行する {#run-echidna-2}
+### Echidnaの実行 {#run-echidna-2}
-アサーションの失敗をテストできるようにするには、[Echidnaの設定ファイル](https://github.com/crytic/echidna/wiki/Config)として `config.yaml` を作成します:
+アサーション失敗テストを有効にするには、[Echidna設定ファイル](https://github.com/crytic/echidna/wiki/Config) `config.yaml`を作成します。
```yaml
checkAsserts: true
```
-このコントラクトをEchidnaで実行すると、次のような期待通りの結果が得られます:
+このコントラクトをEchidnaで実行すると、期待通りの結果が得られます。
```bash
echidna-test assert.sol --config config.yaml
@@ -346,11 +346,11 @@ assertion in inc: failed!💥
Seed: 1806480648350826486
```
-このように、Echidnaでは、アサーション違反の一部を`inc`関数で報告します。 1つの関数に対し複数のアサーションを含めることは可能ですが、どのアサーションが失敗したのか区別できなくなります。
+ご覧のとおり、Echidnaは`inc`関数でのアサーションの失敗を報告します。 1つの関数に複数のアサーションを追加することは可能ですが、Echidnaはどのアサーションが失敗したかを特定できません。
-### アサーションをいつ、どのように使用すべきか {#when-and-how-use-assertions}
+### アサーションを使用する状況とその方法 {#when-and-how-use-assertions}
-アサーションは、特にチェックしたい条件が`f`という特定の操作を適切に用いることと直接関係する場合に、プロパティを明示しない代替手段として用いることができます。 コードにアサーションを追加することで、このコードを実行した直後に強制的にチェックが実行されます。
+アサーションは、特にチェック対象の条件が何らかの操作`f`の正しい使用に直接関連する場合、明示的なプロパティの代替として使用できます。 コードの後にアサーションを追加すると、そのコードが実行された直後にチェックが強制的に行われます。
```solidity
function f(..) public {
@@ -362,7 +362,7 @@ function f(..) public {
```
-反対に、Echidnaのプロパティを明示的に使用する場合、トランザクションがランダムに実行されるため、チェックをどの時点で強制的に実行させるかを決定しにくくなります。 この場合、以下のような回避策を用いることもできます:
+対照的に、明示的なEchidnaプロパティを使用すると、トランザクションがランダムに実行され、いつチェックされるかを正確に強制する簡単な方法はありません。 この回避策を行うことは依然として可能です。
```solidity
function echidna_assert_after_f() public returns (bool) {
@@ -371,22 +371,22 @@ function echidna_assert_after_f() public returns (bool) {
}
```
-しかし、以下の問題点が残ります:
+しかし、いくつかの問題があります。
-- `f`が`internal`あるいは`external`と宣言されている場合、違反になる。
-- どの引数を使って`f`を呼び出すべきかが不明確である。
-- `f`が元に戻された場合、このプロパティは違反になる。
+- `f`が`internal`または`external`として宣言されている場合は失敗します。
+- `f`を呼び出すのにどの引数を使用すべきかが不明確です。
+- `f`がリバートされると、プロパティは失敗します。
-全般的なアサーションの使用については、この[John Regehrの提案](https://blog.regehr.org/archives/1091)に従うことを推奨します:
+一般に、アサーションの使用方法については、[John Regehr氏の推奨事項](https://blog.regehr.org/archives/1091)に従うことをお勧めします。
-- アサーションチェック中には、副作用を強制しない。 例:`assert(ChangeStateAndReturn() == 1)`
-- 明らかなステートメントは、アサートしない。 例:`var`を`uint`と宣言している場合、`assert(var >= 0)`は必要ない。
+- アサーションチェック中に副作用を強制しないでください。 例:`assert(ChangeStateAndReturn() == 1)`
+- 明らかなステートメントをアサートしないでください。 例えば、`var`が`uint`として宣言されている場合の`assert(var >= 0)`などです。
-最後に、`assert`の代わりに`require`を用いるのは**避けてください**。Echidnaではrequireを検出できません。(ただしこの場合でも、コントラクトは元に戻されます)。
+最後に、`assert`の代わりに`require`を**使用しないでください**。Echidnaはそれを検出できません(ただし、コントラクトはいずれにしてもリバートします)。
-### アサーションチェックのまとめ {#summary-assertion-checking}
+### まとめ:アサーションチェック {#summary-assertion-checking}
-以下は、この例におけるEchidnaの実行をまとめたものです:
+以下は、この例におけるEchidnaの実行をまとめたものです。
```solidity
contract Incrementor {
@@ -413,11 +413,11 @@ assertion in inc: failed!💥
Seed: 1806480648350826486
```
-Echidnaは、`inc`のアサーションにつき、この関数が大きな引数で複数回呼び出された場合に違反となりうることを発見しました。
+Echidnaは、`inc`のアサーションが、この関数が大きな引数で複数回呼び出された場合に失敗する可能性があることを見つけました。
-## Echidnaコーパスを収集、修正する {#collecting-and-modifying-an-echidna-corpus}
+## Echidnaコーパスの収集と変更 {#collecting-and-modifying-an-echidna-corpus}
-次に、Echidnaを使ってトランザクションのコーパスを収集し、これを利用する方法について見ていきましょう。 対象は、[`magic.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/magic.sol)のスマートコントラクトです。
+Echidnaを使ってトランザクションのコーパスを収集し、利用する方法について見ていきましょう。 対象は、次のスマートコントラクト[`magic.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/magic.sol)です。
```solidity
contract C {
@@ -437,7 +437,9 @@ contract C {
}
```
-以下の短いコードは、状態変数を変更する特定の値をEchidnaに発見させます。 これは、ファザーにとって容易ではありません([Manticore](https://github.com/trailofbits/manticore)のようなシンボリック実行ツールを使用することをお勧めします)。 Echidnaで、以下のように検証を実行します:
+この簡単な例では、状態変数を変更するために、Echidnaに特定の値を探索させます。 これはファザーにとって困難です
+([Manticore](https://github.com/trailofbits/manticore)のようなシンボリック実行ツールの使用が推奨されます)。
+Echidnaを実行して、これを確認できます。
```bash
echidna-test magic.sol
@@ -448,30 +450,31 @@ echidna_magic_values: passed! 🎉
Seed: 2221503356319272685
```
-ただしEchidnaでは、ファジングの実行中もコーパスを収集することができます。
+しかし、このファジングキャンペーンの実行中にEchidnaを使用してコーパスを収集することは依然として可能です。
-### コーパスを収集する {#collecting-a-corpus}
+### コーパスの収集 {#collecting-a-corpus}
-コーパスを収集するには、まずコーパスのディレクトリを作成します:
+コーパス収集を有効にするには、コーパスディレクトリを作成します。
```bash
mkdir corpus-magic
```
-さらに、[Echidnaの設定ファイル](https://github.com/crytic/echidna/wiki/Config)である `config.yaml` を作成します:
+そして、[Echidna設定ファイル](https://github.com/crytic/echidna/wiki/Config)である`config.yaml`を作成します。
```yaml
coverage: true
corpusDir: "corpus-magic"
```
-これで、ツールを実行しながら収集したコーパスをチェックできるようになりました:
+これでツールを実行し、収集したコーパスを確認できます。
```bash
echidna-test magic.sol --config config.yaml
```
-この段階ではEchidnaはまだ適切なmagic値を特定できませんが、収集したコーパスを確認することはできます。 例えば、以下のようなファイルが収集されました:
+Echidnaはまだ正しいマジック値を見つけることができませんが、収集したコーパスを見ることができます。
+例えば、これらのファイルの1つは次のとおりでした。
```json
[
@@ -516,17 +519,18 @@ echidna-test magic.sol --config config.yaml
]
```
-言うまでもなく、この入力はプロパティ違反をトリガーしません。 しかし、次のステップでこれを修正することができます。
+明らかに、この入力はプロパティの失敗をトリガーしません。 しかし、次のステップでは、そのためにこれを変更する方法を見ていきます。
-### コーパスをシードする {#seeding-a-corpus}
+### コーパスのシーディング {#seeding-a-corpus}
-Echidnaを`magic`関数に対応するように設定する必要があります。 この入力が適切なパラメータを使用できるように、コピーし、変更します。
+`magic`関数を扱うために、Echidnaには少し助けが必要です。 入力をコピーして変更し、適切な
+パラメータを使用するようにします。
```bash
cp corpus/2712688662897926208.txt corpus/new.txt
```
-`magic(42,129,333,0)`を呼び出せるように`new.txt`を変更します。 その上で、Echidnaを再実行します:
+`new.txt`を`magic(42,129,333,0)`を呼び出すように変更します。 これでEchidnaを再実行できます。
```bash
echidna-test magic.sol --config config.yaml
@@ -542,11 +546,11 @@ Seed: -7293830866560616537
```
-今回は、プロパティ違反がただちに検出されました。
+今回は、プロパティが即座に違反していることがわかりました。
-## ガス消費量が多いトンラザクションを見つける {#finding-transactions-with-high-gas-consumption}
+## ガス消費量の多いトランザクションの発見 {#finding-transactions-with-high-gas-consumption}
-ガス消費量が多いトランザクションを特定するために、Echidnaを使用する方法について見ていきましょう。 対象は、次のスマートコントラクトです:
+Echidnaを使用してガス消費量が多いトランザクションを見つける方法を見ていきましょう。 対象は、次のスマートコントラクトです。
```solidity
contract C {
@@ -571,9 +575,10 @@ contract C {
}
```
-ここでは、`expensive`でガス消費量が高くなる可能性があります。
+ここで`expensive`は大きなガス消費量を持つ可能性があります。
-この時点では、Echidna上で常にテストすべきプロパティを設定する必要があり、`echidna_test`は常に`true`を返します。 Echidnaを実行して、これを確認します:
+現在、Echidnaは常にテスト対象のプロパティを必要とします。ここでは`echidna_test`が常に`true`を返します。
+Echidnaを実行して、これを確認できます。
```
echidna-test gas.sol
@@ -583,24 +588,24 @@ echidna_test: passed! 🎉
Seed: 2320549945714142710
```
-### ガス消費量を測定する {#measuring-gas-consumption}
+### ガス消費量の測定 {#measuring-gas-consumption}
-Ethidnaでガスの消費量を確認できるようにするには、 `config.yaml`を以下のように設定します:
+Echidnaでガス消費を有効にするには、設定ファイル`config.yaml`を作成します。
```yaml
estimateGas: true
```
-この例では、結果を分かりやすくするために、次のようにトランザクションシーケンスのサイズを減らしています。
+この例では、結果を理解しやすくするために、トランザクションシーケンスのサイズも小さくします。
```yaml
seqLen: 2
estimateGas: true
```
-### Echidnaを実行する {#run-echidna-3}
+### Echidnaの実行 {#run-echidna-3}
-設定が完了したら、次のようにEchidnaを実行します:
+設定ファイルが作成されたら、次のようにEchidnaを実行できます。
```bash
echidna-test gas.sol --config config.yaml
@@ -617,12 +622,13 @@ Seed: -325611019680165325
```
-- 表示されたガス量は、[HEVM](https://github.com/dapphub/dapptools/tree/master/src/hevm#hevm-)による見積もりです。
+- 表示されるガスは、[HEVM](https://github.com/dapphub/dapptools/tree/master/src/hevm#hevm-)によって提供される推定値です。
-### ガス量を削減する呼び出しを対象外にする {#filtering-out-gas-reducing-calls}
+### ガスを削減する呼び出しの除外 {#filtering-out-gas-reducing-calls}
-**ファジング実行時に呼び出す関数を絞り込む方法**のチュートリアルでは、特定の関数をテストの対象外にする方法を示しました。
-この作業は、ガス量を正確に見積もる上で非常に重要です。 以下の例を検討してみましょう:
+上記の「**ファジングキャンペーン中に呼び出す関数のフィルタリング**」のチュートリアルでは、テストからいくつかの関数を削除する方法を示しています。
+これは、正確なガス見積もりを得るために重要となる場合があります。
+次の例を考えてみましょう。
```solidity
contract C {
@@ -648,7 +654,7 @@ contract C {
}
```
-Echidnaがすべての関数を呼び出せる場合、ガス代が高いトランザクションを見つけることは困難になるでしょう。
+Echidnaがすべての関数を呼び出せる場合、ガス代が高いトランザクションを簡単に見つけることはできません。
```
echidna-test pushpop.sol --config config.yaml
@@ -662,7 +668,8 @@ clear used a maximum of 35916 gas
push used a maximum of 40839 gas
```
-なぜかと言えば、ガス代は`addrs`のサイズに依存しており、ランダムに呼び出した場合は配列がほぼ空になるためです。 このような場合、 `pop`と`clear`をブラックリストに追加することで、より正確な結果を得ることができます。
+これは、コストが`addrs`のサイズに依存し、ランダムな呼び出しでは配列がほとんど空のままになる傾向があるためです。
+しかし、`pop`と`clear`をブラックリストに登録すると、はるかに良い結果が得られます。
```yaml
filterBlacklist: true
@@ -677,9 +684,9 @@ push used a maximum of 40839 gas
check used a maximum of 1484472 gas
```
-### ガス消費量が高いトランザクションを見つける作業のまとめ {#summary-finding-transactions-with-high-gas-consumption}
+### まとめ:ガス消費量の多いトランザクションの発見 {#summary-finding-transactions-with-high-gas-consumption}
-Echidnaでは、`estimateGas`の設定オプションを使用してガス消費量の多いトランザクションを特定することができます:
+Echidnaは、`estimateGas`設定オプションを使用して、ガス消費量の多いトランザクションを見つけることができます。
```yaml
estimateGas: true
@@ -690,4 +697,4 @@ echidna-test contract.sol --config config.yaml
...
```
-Echidnaは、ファジングを実行した後、各関数ごとにガス消費量が最大となるシーケンスを報告します。
+ファジングキャンペーンが終了すると、Echidnaは各関数の最大ガス消費量を持つシーケンスを報告します。
diff --git a/public/content/translations/ja/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/ja/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
index baa9cab81c5..ee62b3aec76 100644
--- a/public/content/translations/ja/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
+++ b/public/content/translations/ja/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md
@@ -1,17 +1,12 @@
---
-title: Manticoreを使ってスマートコントラクトのバグを特定する方法
-description: Manticoreを使って、自動でスマートコントラクト上のバグを特定する
+title: "Manticoreを使ってスマートコントラクトのバグを特定する方法"
+description: "Manticoreを使って、自動でスマートコントラクト上のバグを特定する方法"
author: Trailofbits
lang: ja
-tags:
- - "Solidity"
- - "スマートコントラクト"
- - "セキュリティ"
- - "テスト"
- - "フォーマルな検証"
+tags: [ "Solidity", "スマートコントラクト", "セキュリティ", "テスト", "形式的検証" ]
skill: advanced
published: 2020-01-13
-source: セキュアなコントラクトの構築
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore
---
@@ -19,25 +14,25 @@ sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/progr
## インストール {#installation}
-Manticoreを使用するには、Python 3.6 が必要です。 pipでインストールすることも、Dockerを使用してインストールすることもできます。
+Manticoreには、Python 3.6以上が必要です。 pipでインストールすることも、Dockerを使用してインストールすることもできます。
-### DockerでManticoreをインストールする場合 {#manticore-through-docker}
+### Docker経由のManticore {#manticore-through-docker}
```bash
docker pull trailofbits/eth-security-toolbox
docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox
```
-_最後のコマンドは、現在のディレクトリにアクセスできるdockerでeth-security-toolboxを実行します。 ホストからファイルを変更し、dockerからファイル上のツールを実行することができます。_
+_最後のコマンドは、現在のディレクトリにアクセスできるDockerでeth-security-toolboxを実行します。 ホストからファイルを変更し、Dockerからファイル上のツールを実行できます。_
-Dockerで、以下を実行します:
+Docker内で、以下を実行します。
```bash
solc-select 0.5.11
cd /home/trufflecon/
```
-### pipでManticoreをインストールする場合 {#manticore-through-pip}
+### pip経由のManticore {#manticore-through-pip}
```bash
pip3 install --user manticore
@@ -45,9 +40,9 @@ pip3 install --user manticore
solc 0.5.11を推奨します。
-### スクリプトを実行する {#running-a-script}
+### スクリプトの実行 {#running-a-script}
-Python 3では、以下のPythonスクリプトを実行します:
+Python 3でPythonスクリプトを実行するには:
```bash
python3 script.py
@@ -55,60 +50,60 @@ python3 script.py
## 動的シンボリック実行の概要 {#introduction-to-dynamic-symbolic-execution}
-### 動的シンボリック実行とは何か {#dynamic-symbolic-execution-in-a-nutshell}
+### 動的シンボリック実行の簡単な説明 {#dynamic-symbolic-execution-in-a-nutshell}
-動的シンボリック実行(DSE)は、高度な意味認識に基づき状態空間を探索するプログラム解析手法です。 この手法は、`path predicates`と呼ばれる数式で表される「プログラム・パス」を発見するものです。 概念的には、この手法は2つのステップによりパス述語を操作します:
+動的シンボリック実行(DSE)は、高度な意味認識に基づき状態空間を探索するプログラム解析手法です。 この手法は、`パス述語`と呼ばれる数式で表される「プログラムパス」の発見に基づいています。 概念的には、この手法は2つのステップでパス述語を操作します:
-1. プログラムの入力に対する制約を参照して、プログラム・パスを構築します。
-2. プログラム・パスは、関連パスを実行させるプログラムの入力を生成します。
+1. パス述語は、プログラムの入力に対する制約を使用して構築されます。
+2. パス述語は、関連するパスを実行させるプログラム入力を生成するために使用されます。
-このアプローチでは、具体値で実行する際に、特定されたすべてのプログラムの状態をトリガーしうるという意味で誤検出が発生しません。 例えば、解析において整数のオーバーフローが特定された場合、このオーバーフローは確実に再現可能です。
+このアプローチでは、特定されたすべてのプログラム状態が具体的な実行中にトリガーされうるという意味で、誤検出(偽陽性)は発生しません。 例えば、解析で整数オーバーフローが発見された場合、その再現性が保証されます。
-### パス述語の具体例 {#path-predicate-example}
+### パス述語の例 {#path-predicate-example}
-DSEの仕組みを理解するために、以下の例を考えてみましょう。
+DSEがどのように機能するかを理解するために、次の例を考えてみましょう。
```solidity
function f(uint a){
if (a == 65) {
- // A bug is present
+ // バグが存在します
}
}
```
-`f()`には2つのパスが含まれているため、DSEにより、2つの異なるパス述語が構築されます。
+`f()`には2つのパスが含まれているため、DSEは2つの異なるパス述語を構築します。
-- 第1のパス: `a == 65`
-- 第2のパス: `Not (a == 65)`
+- パス1: `a == 65`
+- パス2: `Not (a == 65)`
-それぞれのパス述語は、いわゆる[SMTソルバー](https://wikipedia.org/wiki/Satisfiability_modulo_theories)に投入できる数式であり、SMTソルバーはこの等式を解決しようとします。 `第1のパス`では、ソルバーは、このパスが`a = 65`で探索可能だと返します。 `第2のパス`では、ソルバーは、`a`に対し、65以外の任意の値を与えることができます(例: `a = 0`)。
+各パス述語は、いわゆる[SMTソルバー](https://wikipedia.org/wiki/Satisfiability_modulo_theories)に与えることができる数式であり、ソルバーはその方程式を解こうとします。 `パス1`では、ソルバーは `a = 65` でパスを探索できると応答します。 `パス2`では、ソルバーは `a` に65以外の任意の値、例えば `a = 0` を与えることができます。
-### プロパティを検証する {#verifying-properties}
+### プロパティの検証 {#verifying-properties}
-Manticoreでは、各パスの実行全体を完全に制御できます。 このため、ほぼすべての事項に対して任意の制限を加えることができます。 この制御を通じて、コントラクトのプロパティを作成することができます。
+Manticoreでは、各パスのすべての実行を完全に制御できます。 その結果、ほとんどすべてのものに任意の制約を追加できます。 この制御により、コントラクトに関するプロパティを作成できます。
-次の例を考えてみましょう:
+次の例を考えてみましょう。
```solidity
function unsafe_add(uint a, uint b) returns(uint c){
- c = a + b; // no overflow protection
+ c = a + b; // オーバーフロー保護なし
return c;
}
```
-この関数を探索するには、1つのパスしか存在しません。
+この関数には、探索するパスが1つしかありません。
-- パス1: `c = a + b`
+- パス1: `c = a + b`
-Manticoreを使用することで、オーバーフローの有無を確認し、パス述語に制限を加えられます。
+Manticoreを使用すると、オーバーフローをチェックし、パス述語に制約を追加できます。
- `c = a + b AND (c < a OR c < b)`
-上記の述語パスが実行可能となる`a`および`b`の値を見つけられる場合、オーバーフローが特定できたことになります。 例えば、ソルバーは、`a = 10 , b = MAXUINT256`という入力を生成できます。
+上記のパス述語が実行可能になるような `a` と `b` の評価を見つけることができれば、オーバーフローを発見したことになります。 例えば、ソルバーは `a = 10 , b = MAXUINT256` という入力を生成できます。
-次に、上記を修正したコードを見てみましょう:
+修正版を考えてみましょう。
```solidity
function safe_add(uint a, uint b) returns(uint c){
@@ -119,17 +114,17 @@ function safe_add(uint a, uint b) returns(uint c){
}
```
-オーバーフローを確認するために数式は、以下のようになるでしょう:
+オーバーフローチェックに関連する数式は次のようになります。
-- `c = a + b AND (c >= a) AND (c=>b) AND (c < a OR c < b)`
+- `c = a + b AND (c >= a) AND (c >= b) AND (c < a OR c < b)`
-この数式は解くことができません。言い換えれば、`safe_add`において、`c`の値が常に増加することを**証明**しています。
+この数式は解けません。言い換えれば、これは `safe_add` において `c` が常に増加することの**証明**です。
-このように、DSEはコード上の任意の制限について検証できるパワフルなツールです。
+したがって、DSEはコード上の任意の制約を検証できる強力なツールです。
-## Manticoreで実行する {#running-under-manticore}
+## Manticoreでの実行 {#running-under-manticore}
-以下に、Manticore APIを用いて、スマートコントラクトを探索する方法を紹介します。 対象となるスマートコントラクトは、[`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol)です。
+ここでは、Manticore APIを使ってスマートコントラクトを探索する方法を見ていきます。 対象は、次のスマートコントラクト [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol) です。
```solidity
pragma solidity >=0.4.24 <0.6.0;
@@ -143,15 +138,15 @@ contract Simple {
}
```
-### スタンドアロンの探索を実行する {#run-a-standalone-exploration}
+### スタンドアロン探索の実行 {#run-a-standalone-exploration}
-以下のコマンドから、スマートコントラクト上で直接Manticoreを実行できます(`project`は、Solidityファイルでもプロジェクトディレクトリでも構いません)。
+次のコマンドで、スマートコントラクト上で直接Manticoreを実行できます(`project`はSolidityファイル、またはプロジェクトディレクトリです):
```bash
$ manticore project
```
-実行すると、以下のようなテストケースが出力されます(順番は異なる可能性があります):
+次のようなテストケースの出力が得られます(順序は変わる可能性があります):
```
...
@@ -166,39 +161,40 @@ $ manticore project
...
```
-Manticoreは、追加情報が提供されない限り、新規のシンボリック・トランザクションを使って、コントラクト上で新規パスが発見されるまでコントラクトを探索します。 Manticoreでは、トランザクションが失敗した場合(例:状態が元に戻された後)は、新規のトランザクションを実行しません。
+追加情報がない場合、Manticoreはコントラクト上で新しいパスを探索しなくなるまで、新しいシンボリック
+トランザクションでコントラクトを探索します。 Manticoreは、失敗したトランザクションの後(例: revertの後)には、新しいトランザクションを実行しません。
-Manticoreでは、 `mcore_*`ディレクトリに情報を出力します。 このディレクトリには、以下が含まれます:
+Manticoreは、`mcore_*`ディレクトリに情報を出力します。 このディレクトリには、とりわけ次のものが含まれます。
-- `global.summary`:カバレッジとコンパイラに関する警告
-- `test_XXXXX.summary`:テストケースごとのカバレッジ、最後の命令、およびアカウント残高
-- `test_XXXXX.tx`:テストケースごとの詳細なトランザクションリスト
+- `global.summary`: カバレッジとコンパイラの警告
+- `test_XXXXX.summary`: カバレッジ、最後の命令、テストケースごとのアカウント残高
+- `test_XXXXX.tx`: テストケースごとのトランザクションの詳細リスト
-この例では、以下に該当する7つのテストケースが特定されました(ファイル名の順番は異なるかもしれません):
+ここでは、Manticoreは7つのテストケースを見つけます。これらは以下に対応します(ファイル名の順序は変わる可能性があります):
-| | トランザクション 0 | トランザクション 1 | トランザクション 2 | 結果 |
-|:--------------------:|:----------:|:----------:| ---------- |:------:|
-| **test_00000000.tx** | コントラクトの作成 | f(!=65) | f(!=65) | STOP |
-| **test_00000001.tx** | コントラクトの作成 | フォールバック関数 | | REVERT |
-| **test_00000002.tx** | コントラクトの作成 | | | RETURN |
-| **test_00000003.tx** | コントラクトの作成 | f(65) | | REVERT |
-| **test_00000004.tx** | コントラクトの作成 | f(!=65) | | STOP |
-| **test_00000005.tx** | コントラクトの作成 | f(!=65) | f(65) | REVERT |
-| **test_00000006.tx** | コントラクトの作成 | f(!=65) | フォールバック関数 | REVERT |
+| | トランザクション0 | トランザクション1 | トランザクション2 | 結果 |
+| :-------------------------------------------------------: | :-------: | :------------------------: | -------------------------- | :----: |
+| **test_00000000.tx** | コントラクト作成 | f(!=65) | f(!=65) | STOP |
+| **test_00000001.tx** | コントラクト作成 | フォールバック関数 | | REVERT |
+| **test_00000002.tx** | コントラクト作成 | | | RETURN |
+| **test_00000003.tx** | コントラクト作成 | f(65) | | REVERT |
+| **test_00000004.tx** | コントラクト作成 | f(!=65) | | STOP |
+| **test_00000005.tx** | コントラクト作成 | f(!=65) | f(65) | REVERT |
+| **test_00000006.tx** | コントラクト作成 | f(!=65) | フォールバック関数 | REVERT |
_探索サマリーにおける「f(!=65)」は、f が 65 以外の値で呼び出されたことを意味します。_
-ご覧のように、Manticoreでは、すべての成功した/元に戻されたトランザクションにつき、固有のテストケースを生成します。
+お気づきのように、Manticoreは成功したトランザクションやrevertされたトランザクションごとに、一意のテストケースを生成します。
-高速な探索を行いたい場合は、`--quick-mode`フラグを使用してください(バグ検出、ガス代計算等が省略されます)。
+高速なコード探索を行いたい場合は `--quick-mode` フラグを使用してください(バグ検出器、ガス計算などを無効にします)。
-### Manticore APIを使ってスマートコントラクトを操作する {#manipulate-a-smart-contract-through-the-api}
+### APIによるスマートコントラクトの操作 {#manipulate-a-smart-contract-through-the-api}
-このセクションでは、Manticore Python APIを使ってスマートコントラクトを操作する方法について詳しく説明します。 Pythonの拡張子である`*.py`を持つ新規ファイルを作成し、APIコマンド(基本知識については以下で説明します)をファイルに追加して必要なコードを書いてから、`$ python3 *.py`コマンドで実行します。 また、Pythonのコンソールから直接コマンドを実行することもできます。コンソールを起動する際のコマンドは、`$ python3`です。
+このセクションでは、Manticore Python APIを介してスマートコントラクトを操作する方法について詳しく説明します。 Pythonの拡張子である\*.pyを持つ新規ファイルを作成し、APIコマンド(基本知識については以下で説明します)をファイルに追加して必要なコードを書いてから、$ python3 \*.pyコマンドで実行します。 また、Pythonのコンソールから直接コマンドを実行することもできます。コンソールを起動する際のコマンドは、$ python3です。
-### アカウントを作成する {#creating-accounts}
+### アカウントの作成 {#creating-accounts}
-まず、以下のコマンドを持つ新規のブロックチェーンを立ち上げる必要があります。
+最初に行うべきことは、次のコマンドで新しいブロックチェーンを開始することです。
```python
from manticore.ethereum import ManticoreEVM
@@ -206,13 +202,13 @@ from manticore.ethereum import ManticoreEVM
m = ManticoreEVM()
```
-[m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account)により、コントラクトではないアカウントが作成されます。
+非コントラクトアカウントは [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) を使用して作成されます。
```python
user_account = m.create_account(balance=1000)
```
-Solidityで作成したコントラクトについては、[m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract)でデプロイします。
+Solidityコントラクトは [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract) を使用してデプロイできます。
```solidity
source_code = '''
@@ -225,24 +221,24 @@ contract Simple {
}
}
'''
-# Initiate the contract
+# コントラクトを初期化する
contract_account = m.solidity_create_contract(source_code, owner=user_account)
```
#### まとめ {#summary}
-- [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account)と[m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract)を使用して、ユーザーアカウントとコントラクトアカウントを作成できます。
+- [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) と [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract) でユーザーアカウントとコントラクトアカウントを作成できます。
-### トランザクションを実行する {#executing-transactions}
+### トランザクションの実行 {#executing-transactions}
-Manticoreは、2種類のトランザクションに対応しています:
+Manticoreは2種類のトランザクションをサポートしています。
-- 生トランザクション:すべての関数を探索します。
-- 名前付きトランザクション:1つの関数だけを探索します。
+- Rawトランザクション: すべての関数が探索されます
+- 名前付きトランザクション: 1つの関数のみが探索されます
-#### 生トランザクション {#raw-transaction}
+#### Rawトランザクション {#raw-transaction}
-生トランザクションは、[m.transaction](https://manticore.readthedocs.io/en/latest/evm.html?highlight=transaction#manticore.ethereum.ManticoreEVM.transaction)で実行されます。
+Rawトランザクションは [m.transaction](https://manticore.readthedocs.io/en/latest/evm.html?highlight=transaction#manticore.ethereum.ManticoreEVM.transaction) を使用して実行されます。
```python
m.transaction(caller=user_account,
@@ -251,12 +247,12 @@ m.transaction(caller=user_account,
value=value)
```
-呼び出し元、アドレス、データ、トランザクションの値は、具体値あるいはシンボリック値のどちらでも構いません:
+トランザクションの呼び出し元、アドレス、データ、または値は、具象値またはシンボリック値のいずれかです。
-- [m.make_symbolic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_value#manticore.ethereum.ManticoreEVM.make_symbolic_value)は、シンボリック値を生成します。
-- [m.make_symbolic_buffer(size)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer)は、シンボリックなバイト配列を生成します。
+- [m.make_symbolic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_value#manticore.ethereum.ManticoreEVM.make_symbolic_value) はシンボリック値を生成します。
+- [m.make_symbolic_buffer(size)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer) はシンボリックバイト配列を生成します。
-以下の例を確認してください:
+以下の例をご覧ください:
```python
symbolic_value = m.make_symbolic_value()
@@ -267,40 +263,41 @@ m.transaction(caller=user_account,
value=symbolic_value)
```
-データがシンボリック値の場合、Manticoreは、トランザクションの実行時にコントラクトに含まれるすべての関数を探索します。 関数がどのように選択されるかを理解するには、[Hands on the Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/)の記事におけるフォールバック関数についての説明を参照してください。
+データがシンボリックの場合、Manticoreはトランザクションの実行中にコントラクトのすべての関数を探索します。 関数の選択がどのように機能するかを理解するには、[Hands on the Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/)の記事にあるフォールバック関数の説明を参照すると役立ちます。
#### 名前付きトランザクション {#named-transaction}
-関数は、名前から実行できます。 `f(uint var)`につき、シンボリック値を用いて、user_accountから、0 etherで実行する場合、以下を使用します:
+関数は名前で実行できます。
+`f(uint var)` をシンボリック値で、user_accountから、0 etherで実行するには、次のようにします。
```python
symbolic_var = m.make_symbolic_value()
contract_account.f(symbolic_var, caller=user_account, value=0)
```
-トランザクションの`value`を指定しない場合、デフォルトでは0になります。
+トランザクションの `value` が指定されていない場合、デフォルトで0になります。
#### まとめ {#summary-1}
-- トランザクションの引数は、具体値またはシンボリック値のどちらでもよい。
-- 生トランザクションは、すべての関数を探索する。
-- 関数は、名前で呼び出すことができる。
+- トランザクションの引数は具象値またはシンボリック値にできます
+- Rawトランザクションはすべての関数を探索します
+- 関数は名前で呼び出すことができます
### ワークスペース {#workspace}
-`m.workspace`は、生成されたすべてのファイルにおける出力ディレクトリとして使用されるディレクトリです。
+`m.workspace` は、生成されたすべてのファイルの出力ディレクトリとして使用されるディレクトリです。
```python
print("Results are in {}".format(m.workspace))
```
-### 探索を終了する {#terminate-the-exploration}
+### 探索の終了 {#terminate-the-exploration}
-探索を停止するには、[m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize)を使用します。 このメソッドが呼び出された時点で、さらにトランザクションは送信されなくなり、Manticoreは探索済みの各パスにつきテストケースを生成します。
+探索を停止するには [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize) を使用します。 このメソッドが呼び出されると、それ以上のトランザクションは送信されなくなり、Manticoreは探索された各パスのテストケースを生成します。
-### Manticoreを使った実行のまとめ {#summary-running-under-manticore}
+### まとめ: Manticoreでの実行 {#summary-running-under-manticore}
-上記のステップをまとめると、以下のようになります:
+これまでのすべてのステップをまとめると、次のようになります。
```python
from manticore.ethereum import ManticoreEVM
@@ -317,14 +314,14 @@ symbolic_var = m.make_symbolic_value()
contract_account.f(symbolic_var)
print("Results are in {}".format(m.workspace))
-m.finalize() # stop the exploration
+m.finalize() # 探索を停止
```
-紹介したすべてのコードは、[`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py)でアクセスできます。
+上記のすべてのコードは [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) にあります。
-## スローイングパスを取得する {#getting-throwing-paths}
+## 例外をスローするパスの取得 {#getting-throwing-paths}
-次に、 `f()`において例外を発生させるパスに対する、特定のインプットを生成します。 ここでも、対象となるスマートコントラクトは[`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol)です。
+次に、`f()`で例外を発生させるパスの特定の入力を生成します。 対象は、引き続き次のスマートコントラクト [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol) です。
```solidity
pragma solidity >=0.4.24 <0.6.0;
@@ -337,26 +334,26 @@ contract Simple {
}
```
-### 状態情報を使用する {#using-state-information}
+### 状態情報の使用 {#using-state-information}
-実行された各パスには、それぞれのブロックチェーンの状態が含まれています。 状態は、readyまたはkilledのどちらかです。killedは、THROWまたはREVERTに達したことを意味します。
+実行された各パスには、それぞれのブロックチェーンの状態があります。 状態はready(準備完了)かkilled(強制終了)のいずれかです。killedはTHROWまたはREVERT命令に到達したことを意味します。
-- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing):readyに該当する状態のリスト(REVERT/INVALIDを実行しなかった状態)
-- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings):killedに該当する状態のリスト
-- [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings):すべての状態
+- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): 準備完了状態のリスト(REVERT/INVALIDを実行していない状態)
+- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): 強制終了された状態のリスト
+- [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): すべての状態
```python
for state in m.all_states:
- # do something with state
+ # stateで何かを行う
```
-状態情報は、アクセス可能です。 以下の例をご覧ください:
+状態情報にアクセスできます。 以下の例をご覧ください:
-- `state.platform.get_balance(account.address)`:アカウント残高
-- `state.platform.transactions`:トランザクションのリスト
-- `state.platform.transactions[-1].return_data`:最後のトランザクションで返されたデータ
+- `state.platform.get_balance(account.address)`: アカウントの残高
+- `state.platform.transactions`: トランザクションのリスト
+- `state.platform.transactions[-1].return_data`: 最後のトランザクションによって返されたデータ
-最後のトランザクションによって返されるデータは配列ですが、以下のようにABI.deserializeで値に変換できます:
+最後のトランザクションによって返されたデータは配列であり、ABI.deserializeで値に変換できます。例:
```python
data = state.platform.transactions[0].return_data
@@ -365,7 +362,7 @@ data = ABI.deserialize("uint", data)
### テストケースの生成方法 {#how-to-generate-testcase}
-テストケースを生成するには、「[m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase)」を使用します。
+テストケースを生成するには [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase) を使用します。
```python
m.generate_testcase(state, 'BugFound')
@@ -373,13 +370,13 @@ m.generate_testcase(state, 'BugFound')
### まとめ {#summary-2}
-- 状態は、m.all_statesでイテレートできる
-- `state.platform.get_balance(account.address)`は、アカウント残高を返す
-- `state.platform.transactions`は、トランザクションのリストを返す
-- `transaction.return_data`は、返されたデータを示す
-- `m.generate_testcase(state, name)`は、状態に対する入力を生成する
+- m.all_statesで状態をイテレートできます
+- `state.platform.get_balance(account.address)`はアカウントの残高を返します
+- `state.platform.transactions`はトランザクションのリストを返します
+- `transaction.return_data`は返されたデータです
+- `m.generate_testcase(state, name)`は状態の入力を生成します
-### スローイングパス取得のまとめ {#summary-getting-throwing-path}
+### まとめ: 例外をスローするパスの取得 {#summary-getting-throwing-path}
```python
from manticore.ethereum import ManticoreEVM
@@ -395,7 +392,8 @@ contract_account = m.solidity_create_contract(source_code, owner=user_account)
symbolic_var = m.make_symbolic_value()
contract_account.f(symbolic_var)
-## Check if an execution ends with a REVERT or INVALID
+## 実行がREVERTまたはINVALIDで終了するかどうかを確認します
+
for state in m.terminated_states:
last_tx = state.platform.transactions[-1]
if last_tx.result in ['REVERT', 'INVALID']:
@@ -403,13 +401,14 @@ for state in m.terminated_states:
m.generate_testcase(state, 'ThrowFound')
```
-紹介したすべてのコードは、[`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py)でアクセスできます。
+上記のすべてのコードは [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) にあります。
-_terminated_stateが返したすべての状態は結果の値がREVERTまたはINVALIDであるため、上記よりも簡略なスクリプトを作成することもできました。上記のスクリプト例は、Manticore APIの操作方法を説明することを目的としたものです。_
+_terminated_stateによって返されるすべての状態は結果としてREVERTまたはINVALIDを持つため、もっと単純なスクリプトを生成することもできましたが、この例はAPIの操作方法を実証するためだけのものです。_
-## 制約を追加する {#adding-constraints}
+## 制約の追加 {#adding-constraints}
-次に、探索を制限する方法について確認しましょう。 ここでは、`f()`のドキュメンテーションにおいて、この関数は決して`a == 65`で呼び出されることはないと記載されていると想定します。このため、`a == 65`のバグは、実際にはバグではありません。 ここでも、対象のスマートコントラクトは[`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol)です。
+探索を制約する方法を見ていきます。 `f()`のドキュメントには、この関数が`a == 65`で呼び出されることはないと
+記載されていると仮定します。したがって、`a == 65`のバグは実際のバグではありません。 対象は、引き続き次のスマートコントラクト [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol) です。
```solidity
pragma solidity >=0.4.24 <0.6.0;
@@ -424,22 +423,22 @@ contract Simple {
### 演算子 {#operators}
-[演算子](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py)モジュールは、制約を容易に操作する上で役立ちます。特に、以下の操作を提供します:
+[Operators](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py)モジュールは制約の操作を容易にし、とりわけ以下を提供します。
-- Operators.AND
-- Operators.OR
-- Operators.UGT(符号なし大なり)
-- Operators.UGE(符号なし以上)
-- Operators.ULT(符号なし小なり)
-- Operators.ULE(符号なし、以下)
+- Operators.AND,
+- Operators.OR,
+- Operators.UGT (符号なしでより大きい),
+- Operators.UGE (符号なしで以上),
+- Operators.ULT (符号なしでより小さい),
+- Operators.ULE (符号なしで以下)。
-このモジュールをインポートするには、以下を使用します:
+モジュールをインポートするには、次を使用します。
```python
from manticore.core.smtlib import Operators
```
-`Operators.CONCAT`は、配列に値を連結するために使用します。 例えば、トランザクションのreturn_dataは、他の値に対して検証可能な値に変更する必要があります:
+`Operators.CONCAT`は、配列を値に連結するために使用されます。 例えば、トランザクションのreturn_dataは、別の値と比較チェックするために値に変更する必要があります。
```python
last_return = Operators.CONCAT(256, *last_return)
@@ -447,11 +446,12 @@ last_return = Operators.CONCAT(256, *last_return)
### 制約 {#state-constraint}
-制約の対象は、グローバルあるいは特定の状態のみのどちらでも構いません。
+制約は、グローバルまたは特定の状態に対して使用できます。
#### グローバル制約 {#state-constraint}
-グローバル制約を追加するには、`m.constraint(constraint)`を使用します。 例えば以下のように、シンボリックアドレスからコントラクトを呼び出し、このアドレスを特定の値に制限することができます:
+グローバル制約を追加するには `m.constrain(constraint)` を使用します。
+例えば、シンボリックアドレスからコントラクトを呼び出し、このアドレスを特定の値に制限することができます。
```python
symbolic_address = m.make_symbolic_value()
@@ -462,23 +462,25 @@ m.transaction(caller=user_account,
value=0)
```
-#### 状態に対する制約 {#state-constraint}
+#### 状態制約 {#state-constraint}
-特定の状態に対して制約を追加するには、[state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain)を使用します。 特定の状態における一部のプロパティをチェックしてから、状態に制限を追加することができます。
+[state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain) を使用して、特定の状態に制約を追加します。
+これは、探索後に状態を制約して、そのプロパティをチェックするために使用できます。
-### 制約を確認する {#checking-constraint}
+### 制約のチェック {#checking-constraint}
-制約が実行可能かどうかを確認するには、`solver.check(state.constraints)`を使用します。 例えば以下では、symbolic_valueが「65」以外の値でなければならないという制約を追加した上で、状態が実行可能かどうかをチェックします。
+`solver.check(state.constraints)`を使用して、制約がまだ実行可能かどうかを確認します。
+例えば、次はsymbolic_valueを65とは異なる値に制約し、状態がまだ実行可能かどうかをチェックします。
```python
state.constrain(symbolic_var != 65)
if solver.check(state.constraints):
- # state is feasible
+ # 状態は実行可能です
```
-### 制約追加のまとめ {#summary-adding-constraints}
+### まとめ: 制約の追加 {#summary-adding-constraints}
-これまでのコードに制約を追加すると、以下のようになります:
+前のコードに制約を追加すると、次のようになります。
```python
from manticore.ethereum import ManticoreEVM
@@ -499,11 +501,12 @@ contract_account.f(symbolic_var)
no_bug_found = True
-## Check if an execution ends with a REVERT or INVALID
+## 実行がREVERTまたはINVALIDで終了するかどうかを確認します
+
for state in m.terminated_states:
last_tx = state.platform.transactions[-1]
if last_tx.result in ['REVERT', 'INVALID']:
- # we do not consider the path were a == 65
+ # a == 65のパスは考慮しません
condition = symbolic_var != 65
if m.generate_testcase(state, name="BugFound", only_if=condition):
print(f'Bug found, results are in {m.workspace}')
@@ -513,4 +516,4 @@ if no_bug_found:
print(f'No bug found')
```
-ここで紹介したすべてのコードは、[`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py)からアクセスできます。
+上記のすべてのコードは [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) にあります。
diff --git a/public/content/translations/ja/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/ja/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
index 2196e56b178..2931f5de6a3 100644
--- a/public/content/translations/ja/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
+++ b/public/content/translations/ja/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md
@@ -1,34 +1,29 @@
---
-title: Slitherを使用してスマートコントラクトのバグを見つける方法
-description: Slitherを使用してスマートコントラクトのバグを自動的に見つける方法
+title: "Slitherを使用してスマートコントラクトのバグを見つける方法"
+description: "Slitherを使用してスマートコントラクトのバグを自動的に見つける方法"
author: Trailofbits
lang: ja
-tags:
- - "Solidity"
- - "スマートコントラクト"
- - "セキュリティ"
- - "テスト"
- - "静的解析"
+tags: [ "Solidity", "スマートコントラクト", "セキュリティ", "テスト" ]
skill: advanced
published: 2020-06-09
-source: セキュアなコントラクトの構築
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither
---
-## Slitherの使い方 {#how-to-use-slither}
+## Slitherの使用方法 {#how-to-use-slither}
このチュートリアルでは、Slitherを使って、スマートコントラクトのバグを自動で検出する方法を学びます。
- [インストール](#installation)
-- [コマンドラインの使い方](#command-line)
-- [静的解析入門](#static-analysis):静的解析の簡単な紹介
-- [API](#api-basics):Python APIの説明
+- [コマンドラインの使用方法](#command-line)
+- [静的解析入門](#static-analysis): 静的解析の簡単な紹介
+- [API](#api-basics): Python APIの説明
## インストール {#installation}
-Slitherには、Python 3.6以上が必要です。 pipでインストールすることも、Dockerを使用してインストールすることもできます。
+SlitherにはPython 3.6以上が必要です。 pipでインストールすることも、Dockerを使用してインストールすることもできます。
-pipによるSlitherのインストール
+pipによるSlitherのインストール:
```bash
pip3 install --user slither-analyzer
@@ -41,18 +36,18 @@ docker pull trailofbits/eth-security-toolbox
docker run -it -v "$PWD":/home/trufflecon trailofbits/eth-security-toolbox
```
-_最後のコマンドは、現在のディレクトリにアクセスできるDockerでeth-security-toolboxを実行します。 ホストからファイルを変更し、Dockerからファイル上のツールを実行することができます。_
+_最後のコマンドは、現在のディレクトリにアクセスできるDockerでeth-security-toolboxを実行します。 ホストからファイルを変更し、Dockerからファイル上のツールを実行できます。_
-Docker内で実行する:
+Docker内で、以下を実行します。
```bash
solc-select 0.5.11
cd /home/trufflecon/
```
-### スクリプトを実行する {#running-a-script}
+### スクリプトの実行 {#running-a-script}
-Python3でPythonスクリプトを実行するには、以下を実行します:
+Python 3でPythonスクリプトを実行するには:
```bash
python3 script.py
@@ -60,23 +55,23 @@ python3 script.py
### コマンドライン {#command-line}
-**コマンドラインとユーザー定義スクリプトの比較**:Slitherには、多くの一般的なバグを見つけるための事前定義された検出器のセットが付属しています。 コマンドラインでSlitherを呼び出すとすべての検出器が実行されますので、静的解析の詳しい知識は必要ありません:
+**コマンドラインとユーザー定義スクリプト。** Slitherには、多くの一般的なバグを見つけるための事前定義された検出器のセットが付属しています。 コマンドラインからSlitherを呼び出すとすべての検出器が実行されるため、静的解析に関する詳細な知識は必要ありません。
```bash
slither project_paths
```
-Slitherでは、検出器に加えて、[プリンター](https://github.com/crytic/slither#printers)と[ツール](https://github.com/crytic/slither#tools)によるコードレビュー機能も利用できます。
+検出器に加えて、Slitherにはその[printers](https://github.com/crytic/slither#printers)と[tools](https://github.com/crytic/slither#tools)を介したコードレビュー機能があります。
-プライベート検出器およびGitHubでの統合にアクセスするには、[crytic.io](https://github.com/crytic)を使用します。
+[crytic.io](https://github.com/crytic)を使用すると、プライベートな検出器やGitHubとの統合にアクセスできます。
## 静的解析 {#static-analysis}
-Slither静的解析フレームワークの機能と設計は、ブログ投稿 ([1](https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/)、[2](https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/)) と[学術論文](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf)で説明されています。
+Slither静的解析フレームワークの機能と設計については、ブログ投稿 ([1](https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/), [2](https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/)) や [学術論文](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf)で説明されています。
-静的解析には、さまざまな種類があります。 静的解析の技法は、[clang](https://clang-analyzer.llvm.org/)や[gcc](https://lwn.net/Articles/806099/)といったコンパイラで採用されているだけでなく、[Infer](https://fbinfer.com/)、[CodeClimate](https://codeclimate.com/)、および[FindBugs](http://findbugs.sourceforge.net/)、ならびに[Frama-C](https://frama-c.com/)や[Polyspace](https://www.mathworks.com/products/polyspace.html)といったフォーマルなメソッドに基づくツールの基盤でもあります。
+静的解析には、さまざまな種類があります。 おそらくご存じのように、[clang](https://clang-analyzer.llvm.org/)や[gcc](https://lwn.net/Articles/806099/)などのコンパイラはこれらの研究技術に依存していますが、それはまた、([Infer](https://fbinfer.com/)、[CodeClimate](https://codeclimate.com/)、[FindBugs](http://findbugs.sourceforge.net/)、そして[Frama-C](https://frama-c.com/)や[Polyspace](https://www.mathworks.com/products/polyspace.html)のような形式的手法に基づくツール) の基礎ともなっています。
-ここでは、静的解析の手法や研究者について網羅的に取り上げる余裕はありません。 その代わりに、皆さんがバグを特定し、コードを理解する上で効果的に静的解析の手法を利用できるように、Slitherの仕組みを理解する上で必要な事項のみに焦点を当てます。
+ここでは、静的解析の技術と研究者を網羅的に検討するわけではありません。 その代わり、皆さんがバグを発見しコードを理解するためにSlitherをより効果的に使えるよう、Slitherがどのように機能するかを理解するために必要なことに焦点を当てます。
- [コード表現](#code-representation)
- [コード解析](#analysis)
@@ -84,13 +79,13 @@ Slither静的解析フレームワークの機能と設計は、ブログ投稿
### コード表現 {#code-representation}
-単一の実行パスについて推論する動的解析とは対照的に、静的解析では一度にすべてのパスを対象として推論します。 これには、別のコード表現が必要です。 最も一般的なコード表現は、抽象構文木(AST)および制御フローグラフ(CFG)の2つです。
+単一の実行パスについて推論する動的解析とは対照的に、静的解析では一度にすべてのパスを対象として推論します。 そのために、異なるコード表現に依存しています。 最も一般的なものは、抽象構文木 (AST) と制御フローグラフ (CFG) の2つです。
-### 抽象構文木(AST) {#abstract-syntax-trees-ast}
+### 抽象構文木 (AST) {#abstract-syntax-trees-ast}
-ASTは、コンパイラがコードを解析するたびに用いられます。 おそらく、静的解析を実行できる最も基本的な構造だと言えるでしょう。
+ASTは、コンパイラがコードを解析するたびに使用されます。 これは、おそらく静的解析を実行できる最も基本的な構造です。
-一言で言えば、ASTは構造化されたツリーであり、通常、各リーフに変数または定数が含まれ、内部ノードはオペランドまたは制御フロー操作です。 次のコードを検討してみましょう:
+要するに、ASTは構造化された木であり、通常、各リーフには変数または定数が含まれ、内部ノードはオペランドまたは制御フロー操作です。 次のコードを考えてみましょう。
```solidity
function safeAdd(uint a, uint b) pure internal returns(uint){
@@ -101,15 +96,15 @@ function safeAdd(uint a, uint b) pure internal returns(uint){
}
```
-対応するASTは、次のとおりです:
+対応するASTは以下の通りです。

-Slitherでは、solcがエクスポートしたASTを使用します。
+SlitherはsolcによってエクスポートされたASTを使用します。
-ASTは簡単に構築できますが、入れ子構造を持ちます。 このため、解析が簡単でない場合があります。 例えば、`a + b <= a`の式で使用される操作を識別するには、まず`<=`を解析し、次に`+`を解析する必要があります。 一般的なアプローチは、ツリーを再帰的に移動するいわゆるVisitorパターンを使用することです。 Slitherには、[`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py)という汎用的なVisitorが含まれています。
+ASTは簡単に構築できますが、入れ子構造になっています。 そのため、解析が必ずしも簡単ではない場合があります。 例えば、`a + b <= a`という式で使われる演算を特定するには、まず`<=`を解析し、次に`+`を解析しなければなりません。 一般的なアプローチは、木構造を再帰的に走査する、いわゆるビジターパターンを使用することです。 Slitherには、[`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py)に汎用的なビジターが含まれています。
-次のコードは、`ExpressionVisitor`を使用して式に加算が含まれているかどうかを検出します:
+次のコードは`ExpressionVisitor`を使用して、式に加算が含まれているかどうかを検出します。
```python
from slither.visitors.expression.expression import ExpressionVisitor
@@ -124,58 +119,58 @@ class HasAddition(ExpressionVisitor):
if expression.type == BinaryOperationType.ADDITION:
self._result = True
-visitor = HasAddition(expression) # expression is the expression to be tested
+visitor = HasAddition(expression) # expression はテスト対象の式です
print(f'The expression {expression} has a addition: {visitor.result()}')
```
-### 制御フローグラフ(CFG) {#control-flow-graph-cfg}
+### 制御フローグラフ (CFG) {#control-flow-graph-cfg}
-2番目によく用いられるコード表現は、制御フローグラフ(CFG)です。 名前が示すように、すべての実行パスを可視化するグラフベースの表現です。 各ノードには、1つまたは複数の命令が含まれます。 グラフのエッジ部分は、制御フロー操作(if/then/else、ループなど)を表します。 先ほどの例をCFGで表すと、次のようになります:
+2番目に一般的なコード表現は、制御フローグラフ (CFG) です。 その名の通り、すべての実行パスを公開するグラフベースの表現です。 各ノードには、1つまたは複数の命令が含まれます。 グラフのエッジは、制御フロー操作 (if/then/else、ループなど) を表します。 前の例のCFGは次のようになります。

-CFGは、大部分の解析の土台となる表現です。
+CFGは、ほとんどの解析がその上に構築される表現です。
-他にも、様々なコード表現が存在します。 それぞれの表現には、実行したい解析に応じて長所と短所があります。
+他にも多くのコード表現が存在します。 それぞれの表現には、実行したい解析に応じて長所と短所があります。
### 解析 {#analysis}
-Slitherで実行できる最もシンプルな解析タイプは、構文解析です。
+Slitherで実行できる最も簡単な種類の解析は、構文解析です。
### 構文解析 {#syntax-analysis}
-Slitherは、コードおよび表現に含まれるさまざまな構成要素を移動しながら、パターンマッチングに類似したアプローチで矛盾や欠陥を発見します。
+Slitherは、パターンマッチングのようなアプローチを用いて、コードのさまざまな構成要素とその表現を走査し、矛盾や欠陥を見つけることができます。
-例えば、以下の検出器は構文関連の問題を探します:
+例えば、以下の検出器は構文関連の問題を探します。
-- [状態変数のシャドーイング](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing):すべての状態変数でイテレートし、継承されたコントラクトから変数がシャドーされているかを確認します([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62))。
+- [状態変数のシャドーイング](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): すべての状態変数を反復処理し、継承されたコントラクトの変数をシャドーイングしているものがないかチェックします ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62))
-- [不適切なERC-20インターフェース](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface):不適切なERC-20関数の署名を探します([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55))。
+- [不正確なERC20インターフェース](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): 不正確なERC20関数のシグネチャを探します ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55))
### 意味解析 {#semantic-analysis}
-構文解析とは対照的に、意味解析は、より深くコードの「意味」を解析します。 この解析手法は、いくつかの種類に大別できます。 意味解析は、より強力で有益な結果を得られますが、より複雑なコードを書く必要があります。
+構文解析とは対照的に、意味解析はより深く掘り下げ、コードの「意味」を解析します。 この系統には、いくつかの広範な種類の解析が含まれます。 それらはより強力で有用な結果につながりますが、記述もより複雑になります。
-意味解析は、最も高度な脆弱性検出に用いられています。
+意味解析は、最も高度な脆弱性検出に使用されます。
-#### データ依存解析 {#fixed-point-computation}
+#### データ依存性解析 {#fixed-point-computation}
-`variable_a`の値が`variable_b`の影響を受けるパスが存在する場合、`variable_a`の変数は`variable_b`に対して依存関係を持ちます。
+`variable_a`の値が`variable_b`に影響されるパスが存在する場合、変数`variable_a`は`variable_b`にデータ依存していると言われます。
-次のコードでは、`variable_a`は`variable_b`に依存しています:
+次のコードでは、`variable_a`は`variable_b`に依存しています。
```solidity
// ...
variable_a = variable_b + 1;
```
-Slitherでは、中間表現(以下を参照)を利用して、[データの依存関係](https://github.com/crytic/slither/wiki/data-dependency)を解析する機能が搭載されています。
+Slitherには、その中間表現 (後のセクションで説明) のおかげで、組み込みの[データ依存性](https://github.com/crytic/slither/wiki/data-dependency)機能が備わっています。
-データ依存関係を解析する具体例としては、[危険をもたらす厳密な等値の検出器](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities)を参照してください。 ここで、Slitherは、ある危険な値に対する厳密な等値比較を発見しようと試みます([incorrect_strict_equality.py#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87))。その上で、攻撃者がコントラクトをトラップできる状態を防止するために、`==`ではなく、`>=`または`<=`を使用するようにユーザーに警告します。 検出器はまず、`balanceOf(address)`の呼び出しにおける戻り値を危険な値だと見なし([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64))、データ依存関係エンジンを使用してその使用状況を追跡します。
+データ依存性の使用例は、[危険な厳密等価性検出器](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities)にあります。 ここでは、Slitherは危険な値との厳密な等価比較を探し ([incorrect_strict_equality.py#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87))、攻撃者がコントラクトを罠にかけるのを防ぐために、`==`ではなく`>=`または`<=`を使用すべきであるとユーザーに通知します。 とりわけ、検出器は `balanceOf(address)` の呼び出しの戻り値を危険とみなし ([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64))、その使用状況を追跡するためにデータ依存性エンジンを使用します。
-#### 不動点の計算 {#fixed-point-computation}
+#### 不動点計算 {#fixed-point-computation}
-解析がエッジを辿ってCFG全体を移動する場合、すでに訪問済みのノードを発見する可能性が高いでしょう。 例えば、以下のようなループがある場合です:
+解析がCFGを走査してエッジをたどる場合、すでに訪れたノードに遭遇する可能性があります。 例えば、以下のようにループが存在する場合です。
```solidity
for(uint i; i < range; ++){
@@ -183,23 +178,23 @@ for(uint i; i < range; ++){
}
```
-この場合、解析をいつ停止するかを指定する必要があります。 それには、(1)ノードごとにイテレートする上限回数を設定するか、(2)いわゆる_不動点_を計算する、という2つの戦略があります。 不動点とは、当該ノードをさらに解析しても有益な情報が得られない点を意味します。
+解析はいつ停止すべきかを知る必要があります。 ここには2つの主要な戦略があります。(1) 各ノードを有限回反復する、(2) いわゆる_不動点_を計算する。 不動点とは、基本的に、そのノードを解析しても、もはや有意義な情報が得られないことを意味します。
-不動点を使用する実例としては、リエントランシー検出器が挙げられます。Slitherでは、当該のノードを探索し、外部からの呼び出しを見つけて、ストレージへの書き込み/読み取りを行います。 この処理を通じて不動点に到達すると([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131))、探索を停止し、様々なリエントランシーのパターン([reentrancy_beign.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_benign.py))、([reentrancy_read_before_write.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_read_before_write.py))、([reentrancy_eth.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_eth.py))に基づき、結果を解析してリエントランシーが存在するか否かを判定します。
+不動点の使用例は、リエントランシー検出器に見られます。Slitherはノードを探索し、外部呼び出し、ストレージへの書き込みと読み込みを探します。 不動点に達すると ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131))、探索を停止し、さまざまなリエントランシーパターン ([reentrancy_benign.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_benign.py), [reentrancy_read_before_write.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_read_before_write.py), [reentrancy_eth.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_eth.py)) を通じて結果を解析し、リエントランシーが存在するかどうかを確認します。
-効率的な不動点計算を用いた解析を作成するには、解析において情報がどのように拡散するかをよく理解しておく必要があります。
+効率的な不動点計算を用いた解析を書くには、解析がどのように情報を伝播させるかをよく理解する必要があります。
### 中間表現 {#intermediate-representation}
-中間表現(IR)は、オリジナルのコードよりも静的解析を実行しやすくした言語です。 Slitherでは、SolidityをSlither独自のIRである[SlithIR](https://github.com/crytic/slither/wiki/SlithIR)に変換します。
+中間表現 (IR) とは、元の言語よりも静的解析に適した言語のことです。 Slitherは、Solidityを独自の中間表現である [SlithIR](https://github.com/crytic/slither/wiki/SlithIR) に変換します。
-基本的なチェックを作成したいだけの場合は、SlithIRを理解する必要はありません。 ただし、より高度な意味解析を作成したい場合は、SlithIRの知識が有益になるでしょう。 [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir)および[SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa)のプリンターは、コードがどのように変換されるかを理解する上で役立ちます。
+基本的なチェックを書きたいだけなら、SlithIRを理解する必要はありません。 しかし、高度な意味解析を書く予定がある場合は、役立つでしょう。 [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir) および [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa) プリンターは、コードがどのように変換されるかを理解するのに役立ちます。
## APIの基本 {#api-basics}
-Slitherには、コントラクトの基本的な属性や関数について探索できるAPIが含まれています。
+Slitherには、コントラクトとその関数の基本的な属性を探索できるAPIがあります。
-コードベースを読み込むには、以下を実行します:
+コードベースを読み込むには、次のようにします。
```python
from slither import Slither
@@ -207,32 +202,32 @@ slither = Slither('/path/to/project')
```
-### コントラクトや関数を探索する {#exploring-contracts-and-functions}
+### コントラクトと関数の探索 {#exploring-contracts-and-functions}
-`Slither`オブジェクトは、以下を持ちます:
+`Slither`オブジェクトには以下のものがあります。
-- `contracts (list(Contract)`:コントラクトのリスト
-- `contracts_derived (list(Contract)`:他のコントラクトに継承されていないコントラクトのリスト(コントラクトのサブセット)
-- `get_contract_from_name (str)`:名前でコントラクトを返します
+- `contracts (list(Contract))`: コントラクトのリスト
+- `contracts_derived (list(Contract))`: 他のコントラクトによって継承されていないコントラクトのリスト (コントラクトのサブセット)
+- `get_contract_from_name (str)`: 名前からコントラクトを返します
-`Contract`オブジェクトには、以下のものがあります。
+`Contract`オブジェクトには以下のものがあります。
-- `name (str)`:コントラクトの名前
-- `functions (list(Function))`:関数のリスト
-- `modifiers (list(Modifier))`:修飾子のリスト
-- `all_functions_called (list(Function/Modifier))`:コントラクトがリーチできるすべての内部関数のリスト
-- `inheritance (list(Contract))`:継承されたコントラクトのリスト
-- `get_function_from_signature (str)`:署名から関数を返します
-- `get_modifier_from_signature (str)`:署名から修飾子を返します
-- `get_state_variable_from_name (str)`:名前から状態変数を返します
+- `name (str)`: コントラクトの名前
+- `functions (list(Function))`: 関数のリスト
+- `modifiers (list(Modifier))`: 修飾子のリスト
+- `all_functions_called (list(Function/Modifier))`: コントラクトから到達可能なすべての内部関数のリスト
+- `inheritance (list(Contract))`: 継承されたコントラクトのリスト
+- `get_function_from_signature (str)`: シグネチャからFunctionを返します
+- `get_modifier_from_signature (str)`: シグネチャからModifierを返します
+- `get_state_variable_from_name (str)`: 名前からStateVariableを返します
-`Function`オブジェクトまたは`Modifier`オブジェクトは、以下を持ちます:
+`Function`または`Modifier`オブジェクトには以下のものがあります。
-- `name (str)`:関数の名前
-- `contract (contract)`:この関数を宣言したコントラクト
-- `nodes (list(Node))`:この関数/修飾子のCFGを攻勢するノードのリスト
-- `entry_point (Node)`: CFG (制御フローグラフ) のエントリポイント
-- `variables_read (list(Variable))`: 読み込まれた変数のリスト
+- `name (str)`: 関数の名前
+- `contract (contract)`: 関数が宣言されているコントラクト
+- `nodes (list(Node))`: 関数/修飾子のCFGを構成するノードのリスト
+- `entry_point (Node)`: CFGのエントリポイント
+- `variables_read (list(Variable))`: 読み取られた変数のリスト
- `variables_written (list(Variable))`: 書き込まれた変数のリスト
-- `state_variables_read (list(StateVariable))`: 読み込まれた状態変数のリスト (読み込まれた変数のサブセット)
-- `state_variables_written (list(StateVariable))`: 書き込まれた状態変数のリスト (書き込まれた変数のサブセット)
+- `state_variables_read (list(StateVariable))`: 読み取られた状態変数のリスト (variables`readのサブセット)
+- `state_variables_written (list(StateVariable))`: 書き込まれた状態変数のリスト (variables`writtenのサブセット)
diff --git a/public/content/translations/ja/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/ja/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
index 8c4d3d5f70e..5ae9977cda8 100644
--- a/public/content/translations/ja/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
+++ b/public/content/translations/ja/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md
@@ -1,12 +1,9 @@
---
-title: Tellorをオラクルとしてセットアップする方法
-description: プロトコルにTellorオラクルを統合する作業を開始するためのガイド
+title: "Tellorをオラクルとしてセットアップする方法"
+description: "プロトコルにTellorオラクルを統合する作業を開始するためのガイド"
author: "Tellor"
lang: ja
-tags:
- - "Solidity"
- - "スマートコントラクト"
- - "オラクル"
+tags: [ "Solidity", "スマートコントラクト", "オラクル" ]
skill: beginner
published: 2021-06-29
source: Tellor Docs
@@ -15,11 +12,11 @@ sourceUrl: https://docs.tellor.io/tellor/
確認クイズ:あなたのプロトコルはもうすぐ完成しますが、オフチェーンのデータにアクセスするにはオラクルが必要です。何をすればよいでしょうか?
-## (ソフトな)前提知識 {#soft-prerequisites}
+## (緩やかな) 前提条件 {#soft-prerequisites}
この投稿は、なるべくシンプルかつ明快に、オラクルフィードにアクセスする方法を説明するものです。 ただし、オラクルについて理解するには以下のプログラミングスキルが必要です。
-前提条件:
+前提知識:
- ターミナルを操作できる
- npmがインストール済みである
@@ -29,17 +26,17 @@ Tellorは、実装可能かつ開発継続中のオープンソースのオラ
## 概要 {#overview}
-Tellorは、オフチェーンのデータポイントの値(例:BTC/USD)を請求できるオラクルシステムです。報告者は、イーサリアムの全スマートコントラクトがアクセスできるオンチェーンのデータバンクに対してこの値を追加するために競います。 このデータバンクへの入力は、ステーキング済みの報告者で構成されるネットワークにより保護されています。 Tellorは、暗号資産経済におけるインセンティブの仕組みを活用し、Tellorのトークン、トリビュート(TRB)、および紛争メカニズムに基づき、正直なデータを提出した報告者に報酬を与え、悪意のユーザーを処罰します。
+Tellorは、オフチェーンのデータポイントの値(例:BTC/USD)を請求できるオラクルシステムです。報告者は、イーサリアムの全スマートコントラクトがアクセスできるオンチェーンのデータバンクに対してこの値を追加するために競います。 このデータバンクへの入力は、ステーキング済みの報告者で構成されるネットワークにより保護されています。 Tellorは暗号経済的なインセンティブの仕組みを活用し、TellorのトークンであるTributes(TRB)の発行と紛争メカニズムを通じて、誠実なデータを提出したレポーターに報酬を与え、悪意のあるアクタを罰します。
このチュートリアルでは、以下について説明します:
- 導入および稼働に必要な初回ツールキットの設定方法
- 簡単な実例に基づくステップごとの説明
-- 現在Tellorをテストできるネットワークのアドレスリスト
+- 現在Tellorをテストできるテストネットのネットワークアドレス一覧
-## Tellorを使うには {#usingtellor}
+## UsingTellorの使用 {#usingtellor}
-まず、Tellorをオラクルとして使用するために必要な基本ツールをインストールします。 Tellorのユーザーコントラクトをインストールするには、[このパッケージ](https://github.com/tellor-io/usingtellor)を使ってください。
+まず、Tellorをオラクルとして使用するために必要な基本ツールをインストールします。 Tellor User Contractsをインストールするには、[このパッケージ](https://github.com/tellor-io/usingtellor)を使用します:
`npm install usingtellor`
@@ -49,7 +46,7 @@ Tellorは、オフチェーンのデータポイントの値(例:BTC/USD)
### BTC/USDの例 {#btcusd-example}
-この「UsingTellor」コントラクトを継承し、Tellorのアドレスをコントラクタの引数として渡します:
+この「UsingTellor」コントラクトを継承し、Tellorのアドレスをコンストラクタの引数として渡します:
具体的なコードは、以下のようになります:
@@ -59,7 +56,7 @@ import "usingtellor/contracts/UsingTellor.sol";
contract PriceContract is UsingTellor {
uint256 public btcPrice;
- //This Contract now has access to all functions in UsingTellor
+ //このコントラクトは、UsingTellor のすべての関数にアクセスできるようになりました
constructor(address payable _tellorAddress) UsingTellor(_tellorAddress) public {}
@@ -77,8 +74,8 @@ function setBtcPrice() public {
}
```
-コントラクトアドレスの完全なリストについては、[こちら](https://docs.tellor.io/tellor/the-basics/contracts-reference)を参照してください。
+コントラクトアドレスの完全なリストは、[こちら](https://docs.tellor.io/tellor/the-basics/contracts-reference)を参照してください。
-利便性のために、UsingTellorのリポジトリには簡単な統合を目的としたバージョンである[Tellor Playground](https://github.com/tellor-io/TellorPlayground)コントラクトが含まれています。 有益な関数のリストについては、 [こちら](https://github.com/tellor-io/sampleUsingTellor#tellor-playground)を参照してください。
+利便性のために、UsingTellorのリポジトリには簡単な統合を目的としたバージョンである[Tellor Playground](https://github.com/tellor-io/TellorPlayground)コントラクトが含まれています。 便利な関数の一覧は[こちら](https://github.com/tellor-io/sampleUsingTellor#tellor-playground)をご覧ください。
-Tellorオラクルをより堅牢に実装したい場合は、[こちらで](https://github.com/tellor-io/usingtellor/blob/master/README.md)利用可能な関数の全リストを確認してください。
+Tellorオラクルのより堅牢な実装については、利用可能な関数の完全なリストを[こちら](https://github.com/tellor-io/usingtellor/blob/master/README.md)で確認してください。
diff --git a/public/content/translations/ja/developers/tutorials/how-to-view-nft-in-metamask/index.md b/public/content/translations/ja/developers/tutorials/how-to-view-nft-in-metamask/index.md
index 21fdf826cb0..4bb6d8afa0e 100644
--- a/public/content/translations/ja/developers/tutorials/how-to-view-nft-in-metamask/index.md
+++ b/public/content/translations/ja/developers/tutorials/how-to-view-nft-in-metamask/index.md
@@ -1,36 +1,33 @@
---
-title: ウォレットでNFTを表示する方法(NFTチュートリアルシリーズのパート3/3)
-description: このチュートリアルでは、既存のMetaMask上にNFTを表示する方法について説明します。
+title: "ウォレットでNFTを表示する方法(NFTチュートリアルシリーズ パート3/3)"
+description: "このチュートリアルでは、MetaMaskで既存のNFTを表示する方法について説明します。"
author: "Sumi Mudgil"
-tags:
- - "ERC-721"
- - "Alchemy"
- - "Solidity"
+tags: [ "ERC-721", "Alchemy", "Solidity" ]
skill: beginner
lang: ja
published: 2021-04-22
---
-このチュートリアルは、NFTチュートリアルシリーズのパート3/3です。ここでは、新しくミントされたNFTを見ていきますが、 MetaMaskを使用して、メインネットや任意のテストネットなど、ERC-721トークンの一般的なチュートリアルを使用することができます。 イーサリアム上でNFTをミントする方法については、[パート1のNFTスマートコントラクトの作成&デプロイ方法](/developers/tutorials/how-to-write-and-deploy-an-nft)をご覧ください。
+このチュートリアルは、NFTチュートリアルシリーズのパート3/3で、新しくミントしたNFTを表示します。 ただし、この一般的なチュートリアルは、メインネットや任意のテストネットを含め、MetaMaskを使用するあらゆるERC-721トークンに利用できます。 Ethereumで独自のNFTをミントする方法を学びたい場合は、[パート1「NFTスマートコントラクトの作成とデプロイ方法」](/developers/tutorials/how-to-write-and-deploy-an-nft)をご覧ください。
-朗報です。 これからご説明する仮想ウォレットで新しくミントされたNFTを表示する方法は、NFTチュートリアルシリーズの中で最短かつ最も簡単なパートです。 この例では、前の2つのパートで使用していたMetaMaskを使用します。
+おめでとうございます! NFTチュートリアルシリーズの中で最も短く、最も簡単なパートにたどり着きました。それは、仮想ウォレットで新しくミントしたNFTを表示する方法です。 この例では、前の2つのパートで使用したMetaMaskを使用します。
-前提条件として、モバイルにMetaMaskをインストールしておく必要があり、NFTを割り当てたアカウントも必要となります。[iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202)または[Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US)から無料でアプリを入手できます。
+前提条件として、モバイル版MetaMaskをインストールし、NFTをミントしたアカウントを含めておく必要があります。アプリは[iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202)または[Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US)で無料で入手できます。
## ステップ1: ネットワークをSepoliaに設定する {#set-network-to-sepolia}
-アプリの上部にある「Wallet」ボタンを押すと、ネットワークを選択するよう指示されます。 Sepoliaネットワーク上でNFTをミントしたので、ネットワークとしてSepoliaを選択します。
+アプリの上部にある「ウォレット」ボタンを押すと、ネットワークを選択するよう促されます。 NFTはSepoliaネットワークでミントしたため、ネットワークとしてSepoliaを選択します。

-## ステップ2: 収集品をMetaMaskに追加する {#add-nft-to-metamask}
+## ステップ2: コレクティブルをMetaMaskに追加する {#add-nft-to-metamask}
-Sepoliaネットワークに接続後、右側の「Collectibles」タブを選択し、NFTスマートコントラクトアドレスとNFTのERC-721トークンIDを追加します。そうすることで、チュートリアルのパートIIでデプロイしたNFTからのトランザクションハッシュに基づいてEtherscanで見つけることができます。
+Sepoliaネットワークに接続したら、右側にある「コレクティブル」タブを選択し、NFTのスマートコントラクトアドレスとERC-721トークンIDを追加します。これらは、チュートリアルのパートIIでデプロイしたNFTのトランザクションハッシュを基に、Etherscanで確認できます。

-何度か再読込をしないと表示されないこともありますが、NFTはそこに存在しています 。
+NFTを表示するために数回更新が必要な場合がありますが、最終的には表示されます !

-おめでとうございます。 NFTのミントに成功しました。NFTを表示することもできます。 あなたがNFTの世界で新たな旋風を巻き起こすのを楽しみにしています。
+おめでとうございます! NFTのミントに成功し、表示できるようになりました。 あなたがNFTの世界で新たな旋風を巻き起こすのを楽しみにしています。
diff --git a/public/content/translations/ja/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/ja/developers/tutorials/how-to-write-and-deploy-an-nft/index.md
index e1bb40929f2..01c09af8750 100644
--- a/public/content/translations/ja/developers/tutorials/how-to-write-and-deploy-an-nft/index.md
+++ b/public/content/translations/ja/developers/tutorials/how-to-write-and-deploy-an-nft/index.md
@@ -1,12 +1,8 @@
---
-title: NFTの作成&デプロイ方法(NFTチュートリアルシリーズの1/3)
-description: このチュートリアルは、イーサリアムとInterPlanetary File System(IPFS)を使用して、非代替性トークン(ERC-721トークン)のスマートコントラクトを作成、デプロイする方法について、段階的に学ぶNFTシリーズのパート1です
+title: "NFTの作成とデプロイ方法(NFTチュートリアルシリーズ 1/3)"
+description: "このチュートリアルは、イーサリアムとInterPlanetary File System(IPFS)を使用して、非代替性トークン(ERC-721トークン)のスマートコントラクトを作成、デプロイする方法について、段階的に学ぶNFTシリーズのパート1です"
author: "Sumi Mudgil"
-tags:
- - "ERC-721"
- - "Alchemy"
- - "Solidity"
- - "スマートコントラクト"
+tags: [ "ERC-721", "Alchemy", "Solidity", "スマートコントラクト" ]
skill: beginner
lang: ja
published: 2021-04-22
@@ -14,72 +10,79 @@ published: 2021-04-22
NFTによってブロックチェーンが世間の目に触れるようになった今、イーサリアムブロックチェーン上に自分のNFTコントラクト(ERC-721トークン)を公開することで、自身のモチベーションを高める絶好の機会となります。
-Alchemyは、Makersplace(直近では、Christie'sでレコードデジタルアートワークが$69Mで落札され、記録を更新)、 Dapper Labs(NBA Top Shot&Crypto Kittiesのクリエイター)、OpenSea(世界最大のNFTマーケットプレイス)、Zora、Super Rare、NFTFi、Foundation、Enjin、Origin Protocol、Immutableなど、NFTスペースで著名人の力になれることを非常に誇りに思っています。
+Alchemyは、Makersplace (最近、クリスティーズで6900万ドルの記録的なデジタルアート作品の販売を達成)、Dapper Labs (NBA Top Shot & Crypto Kittiesの制作者)、OpenSea (世界最大のNFTマーケットプレイス)、Zora、Super Rare、NFTfi、Foundation、Enjin、Origin Protocol、Immutableなど、NFT分野のビッグネームを支えていることを非常に誇りに思っています。
-このチュートリアルでは、[MetaMask](https://metamask.io/)、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org/)、[Pinata](https://pinata.cloud/)、[Alchemy](https://alchemy.com/signup/eth)を使用してSepoliaテストネットワーク上でERC-721スマートコントラクトの作成とデプロイのウォークスルーを行います(現時点でしっかりと理解できていなくても、心配はご無用です。後ほどご説明します) 。
+このチュートリアルでは、[MetaMask](https://metamask.io/)、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org/)、[Pinata](https://pinata.cloud/)、[Alchemy](https://alchemy.com/signup/eth)を使用して、Sepoliaテストネット上でERC-721スマートコントラクトを作成し、デプロイする手順を説明します (これらの意味がまだ分からなくても心配はいりません — これから説明します!)。
チュートリアルのパート2では、スマートコントラクトを使用してNFTをミントする方法について、パート3では、MetaMaskでNFTを表示する方法について説明します。
-ご質問があれば[Alchemy Discord](https://discord.gg/gWuC7zB)にお問い合わせいただくか、 [AlchemyのNFT API docs](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api)をご覧ください。
+もちろん、いつでも質問があれば、[Alchemy Discord](https://discord.gg/gWuC7zB)でお気軽にお問い合わせいただくか、[AlchemyのNFT APIドキュメント](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api)をご覧ください!
## ステップ1: イーサリアムネットワークに接続する {#connect-to-ethereum}
-イーサリアムのブロックチェーンにリクエストを行う方法はたくさんありますが、ここでは分かりやすくするため、[Alchemy](https://alchemy.com/signup/eth)の無料アカウントを使用します。このアカウントはブロックチェーンの開発者プラットフォームとAPIで、独自のノードを実行せずにイーサリアムチェーンと通信できるものです。
+イーサリアムのブロックチェーンにリクエストを送信する方法はいくつかありますが、簡単にするために、[Alchemy](https://alchemy.com/signup/eth)の無料アカウントを使用します。Alchemyは、独自のノードを実行することなくイーサリアムチェーンと通信できる、ブロックチェーン開発者向けのプラットフォームおよびAPIです。
-このチュートリアルでは、スマートコントラクトのデプロイメントの仕組みを理解するために、Alchemyの開発者用ツールも活用します。 Alchemyアカウントをお持ちでない場合は、 [こちら](https://alchemy.com/signup/eth)から無料で登録できます。
+このチュートリアルでは、スマートコントラクトのデプロイメントの仕組みを理解するために、Alchemyの開発者用ツールも活用します。 まだAlchemyアカウントをお持ちでない場合は、[こちら](https://alchemy.com/signup/eth)から無料で登録できます。
-## ステップ2: アプリ(およびAPIキー)を作成する {#make-api-key}
+## ステップ2: アプリ (およびAPIキー) を作成する {#make-api-key}
-Alchemyのアカウントを作成すると、アプリを作成することでAPIキーを生成できます。 これにより、Sepoliaテストネットワークへのリクエストが可能になります。 テストネットワークの詳細については、[こちらのガイド](https://docs.alchemyapi.io/guides/choosing-a-network)をご覧ください。
+Alchemyのアカウントを作成した後、アプリを作成することでAPIキーを生成することができます。 これにより、Sepoliaテストネットワークへのリクエストが可能になります。 テストネットについてさらに詳しく知りたい場合は、[こちらのガイド](https://docs.alchemyapi.io/guides/choosing-a-network)をご覧ください。
1. ナビゲーションバーの「Apps」にマウスを合わせて、「Create App)」をクリックし、Alchemyダッシュボードの「Create App」ページに移動してください。
-
+
2. アプリに名前を付け(私たちは「My First NFT!」にしました)、簡単な説明を記述し、「Ethereum」チェーンを選択して、ネットワークに「Sepolia」を設定します。 マージ以降、他のテストネットは非推奨となっています。

-3. 「Create app」をクリックして完了です。 下記のテーブルにアプリが表示されます。
+3. 「Create app」をクリックします。 アプリが下の表に表示されます。
-## ステップ 3: イーサリアムアカウント(アドレス)を作成する {#create-eth-address}
+## ステップ3: イーサリアムアカウント (アドレス) を作成する {#create-eth-address}
-トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 イーサリアムのトランザクションの仕組みの詳細については、イーサリアム・ファウンデーションの[こちらのページ](/developers/docs/transactions/)をご覧ください。
+トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 イーサリアム上のトランザクションの仕組みについてさらに詳しく知りたい場合は、イーサリアム・ファウンデーションの[こちらのページ](/developers/docs/transactions/)をご覧ください。
-Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Sepolia Test Network」に切り替えてください。
+MetaMaskアカウントは、[こちら](https://metamask.io/download)から無料でダウンロードして作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Sepolia Test Network」に切り替えてください。
-
+
-## ステップ4: フォーセットからイーサリアムを追加する {#step-4-add-ether-from-a-faucet}
+## ステップ4: フォーセットからイーサを追加する {#step-4-add-ether-from-a-faucet}
-テストネットワークにスマートコントラクトをデプロイするには、偽のETHが複数必要になります。 ETHを取得するには、Alchemyがホストする[Sepoliaフォーセット](https://sepoliafaucet.com/)へ行き、ログインしてアカウントアドレスを入力し、「Send Me ETH」をクリックしてください。 MetamaskアカウントにETHが表示されるはずです。
+テストネットワークにスマートコントラクトをデプロイするには、偽のETHが複数必要になります。 ETHを入手するには、Alchemyがホストする[Sepoliaフォーセット](https://sepoliafaucet.com/)にアクセスし、ログインしてアカウントアドレスを入力し、「Send Me ETH」をクリックします。 MetamaskアカウントにETHが表示されるはずです。
## ステップ5: 残高を確認する {#check-balance}
-残高を再度確認するには、 [Alchemy CHAINS APIS](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)を使用して [eth_getBalance](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D)をリクエストしてみましょう。 リクエストすると、ウォレット内のETHの量が返却されます。 Metamaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。
+残高があることを再確認するために、[Alchemyのcomposerツール](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D)を使用して[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)リクエストを実行してみましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 MetaMaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。
- `{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}`
+ ```
+ {"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}
+ ```
-> **注:** この結果の単位はweiであり、ETHではありません。 weiはETHの最小単位として使われています。 「wei」 から「ETH」への変換は次の通りです: 1 eth = 1018 wei 。 例えば、0xde0b6b3a7640000を10進数に変換すると1*1018 weiとなり、1ETHに相当します。
+> **注** この結果はETHではなく、wei単位です。 weiはETHの最小単位として使われています。 「wei」 から「ETH」への変換は次の通りです: 1 eth = 1018 wei 。 例えば、0xde0b6b3a7640000を10進数に変換すると1\*1018 weiとなり、1ETHに相当します。
-ご安心ください。 私たちの偽物のお金はすべてそこにあります。
+ふう! 私たちの偽物のお金はすべてそこにあります。
## ステップ6: プロジェクトを初期化する {#initialize-project}
まず、プロジェクトのフォルダを作成する必要があります。 コマンドラインに移動し、次のように入力します。
+ ```
mkdir my-nft
cd my-nft
+ ```
-プロジェクトフォルダに入ったら、 npm initを使用してプロジェクトを初期化します。 npmがインストールされていない場合は、[こちらの手順](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm)に従ってください。([Node.js](https://nodejs.org/en/download/)も必要となりますので、こちらもダウンロードしてください。)
+プロジェクトフォルダに入ったら、 npm initを使用してプロジェクトを初期化します。 まだnpmをインストールしていない場合は、[これらの手順](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm)に従ってください ([Node.js](https://nodejs.org/en/download/)も必要なので、そちらもダウンロードしてください!)。
+ ```
npm init
+ ```
インストール時の質問に対する回答方法は自由です。参考までに過去の回答方法は次のとおりです。
+
```json
package name: (my-nft)
version: (1.0.0)
- description: My first NFT!
+ description: 初めてのNFT!
entry point: (index.js)
test command:
git repository:
@@ -91,7 +94,7 @@ Metamaskのアカウントは[こちら](https://metamask.io/download)から無
{
"name": "my-nft",
"version": "1.0.0",
- "description": "My first NFT!",
+ "description": "初めてのNFT!",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
@@ -100,26 +103,32 @@ Metamaskのアカウントは[こちら](https://metamask.io/download)から無
"license": "ISC"
}
```
+
「package.json」を承認してください。これで準備が完了しました。
## ステップ7: [Hardhat](https://hardhat.org/getting-started/#overview)をインストールする {#install-hardhat}
-Hardhatは、イーサリアムのソフトウェアをコンパイル、デプロイ、テスト、デバッグするための開発環境です。 開発者がライブチェーンにデプロイする前に、スマートコントラクトやDappsをローカルに構築する際に役立ちます。
+Hardhatは、イーサリアムのソフトウェアをコンパイル、デプロイ、テスト、デバッグするための開発環境です。 デベロッパーがライブチェーンにデプロイする前に、スマートコントラクトや分散型アプリケーション(Dapp)をローカルに構築する際に役立ちます。
「my-nft」プロジェクトの中で実行してください。
+ ```
npm install --save-dev hardhat
+ ```
-[インストール手順](https://hardhat.org/getting-started/#overview)の詳細については、こちらのページをご覧ください。
+[インストール手順](https://hardhat.org/getting-started/#overview)の詳細については、このページをご覧ください。
## ステップ8: Hardhatプロジェクトを作成する {#create-hardhat-project}
-プロジェクトフォルダ内で実行してください。
+プロジェクトフォルダ内で以下を実行します。
+ ```
npx hardhat
+ ```
-次に、ウェルカムメッセージと選択肢が表示されます。 「create an empty hardhat.config.js」を選択してください。
+ウェルカムメッセージと、次に何をするのかを選択できるオプションが表示されます。 「create an empty hardhat.config.js」を選択してください。
+ ```
888 888 888 888 888
888 888 888 888 888
888 888 888 888 888
@@ -128,11 +137,12 @@ Hardhatは、イーサリアムのソフトウェアをコンパイル、デプ
888 888 .d888888 888 888 888 888 888 .d888888 888
888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
- 👷 Welcome to Hardhat v2.0.11 👷
- ? What do you want to do? …
- Create a sample project
- ❯ Create an empty hardhat.config.js
- Quit
+ 👷 Hardhat v2.0.11へようこそ 👷
+ ? 何を行いますか? …
+ サンプルプロジェクトを作成する
+ ❯ 空のhardhat.config.jsを作成する
+ 終了
+ ```
「hardhat.config.js」というファイルが生成され、ここでプロジェクトのセットアップの全てを指定します (ステップ13)。
@@ -140,8 +150,10 @@ Hardhatは、イーサリアムのソフトウェアをコンパイル、デプ
プロジェクトを整理するために、2つの新しいフォルダを作成します。 コマンドラインでプロジェクトのルートディレクトリに移動し、次のように入力します。
+ ```
mkdir contracts
mkdir scripts
+ ```
- 「contracts/」は、NFT スマートコントラクトコードを保持する場所です。
@@ -149,16 +161,16 @@ Hardhatは、イーサリアムのソフトウェアをコンパイル、デプ
## ステップ10: コントラクトを作成する {#write-contract}
-さて、環境が整ったところで、もっと面白いことをやりましょう。_スマートコントラクトのコードの作成です。_
+環境が整ったので、もっと面白いこと、つまり_スマートコントラクトのコード作成_に取り掛かりましょう!
-お気に入りのエディタでmy-nftプロジェクトを開きます(通常は[VScode](https://code.visualstudio.com/)を使用しています)。 スマートコントラクトは、Solidityと呼ばれる言語で記述されています。MyNFT.solスマートコントラクトの作成にこの言語を使用します。
+お気に入りのエディタ (私たちは[VSCode](https://code.visualstudio.com/)が好きです) でmy-nftプロジェクトを開いてください。 スマートコントラクトは、Solidityと呼ばれる言語で記述されています。MyNFT.solスマートコントラクトの作成にこの言語を使用します。
-1. `contracts`フォルダに移動し、MyNFT.solという名前の新規ファイルを作成します。
+1. `contracts`フォルダに移動し、MyNFT.solという名前の新しいファイルを作成します
-2. 以下は、 NFTスマートコントラクトコードです。これは[OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721)ライブラリのERC-721実装に基づいています。 以下の内容をコピーして、MyNFT.solファイルに貼り付けます。
+2. 以下は、[OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721)ライブラリのERC-721実装をベースにした、私たちのNFTスマートコントラクトのコードです。 以下の内容をコピーして、MyNFT.solファイルに貼り付けます。
```solidity
- //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
+ //[https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) をベースにしたコントラクト
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
@@ -188,29 +200,29 @@ Hardhatは、イーサリアムのソフトウェアをコンパイル、デプ
}
```
-3. OpenZeppelinのコントラクトライブラリからクラスを継承しているので、コマンドラインで`npm install @openzeppelin/contracts`を実行して、ライブラリをフォルダにインストールします。
+3. OpenZeppelinのコントラクトライブラリからクラスを継承しているため、コマンドラインで`npm install @openzeppelin/contracts^4.0.0`を実行して、ライブラリをフォルダにインストールします。
-では、このコードの_役割_は一体何でしょうか。 一行ずつ分解してみましょう。
+では、このコードは一体何を_している_のでしょうか? 一行ずつ分解してみましょう。
-スマートコントラクトの先頭で、3つの[OpenZeppelin](https://openzeppelin.com/)スマートコントラクトのクラスをインポートしています。
+スマートコントラクトの冒頭で、3つの[OpenZeppelin](https://openzeppelin.com/)スマートコントラクトクラスをインポートします:
-- @openzeppelin/contracts/token/ERC721/ERC721.solには、ERC-721標準の実装が含まれており、NFTスマートコントラクトはこれを継承しています。 (有効なNFTであるためには、スマートコントラクトはERC-721標準のすべてのメソッドを実装する必要があります。) 継承されたERC-721関数の詳細については、[こちら](https://eips.ethereum.org/EIPS/eip-721)のインターフェイス定義をご覧ください。
+- @openzeppelin/contracts/token/ERC721/ERC721.solには、ERC-721標準の実装が含まれており、NFTスマートコントラクトはこれを継承しています。 (有効なNFTであるためには、スマートコントラクトはERC-721標準のすべてのメソッドを実装する必要があります。) 継承されたERC-721関数の詳細については、[こちら](https://eips.ethereum.org/EIPS/eip-721)のインターフェース定義をご確認ください。
- @openzeppelin/contracts/utils/Counters.solは、1つずつ増減するカウンタを提供しており、 私たちのスマートコントラクトは、ミントされたNFTの合計数を追跡し、新しいNFTにユニークなIDを設定するためにカウンタを使用しています。 (スマートコントラクトを使用してミントされた各NFTには、ユニークなIDが割り当てられている必要があります。ここでは、ユニークIDは、存在するNFTの合計数によって決定されます。 例えば、スマートコントラクトでミントした最初のNFTには「1」のIDが付与され、2番目のNFTには「2」のIDが付与されます。)
-- @openzeppelin/contracts/access/Ownable.solは[アクセスコントロール](https://docs.openzeppelin.com/contracts/3.x/access-control)をスマートコントラクトに設定するため、スマートコントラクトの所有者(あなた)だけがNFTをミントできます。 (注: アクセス制御の実装は完全に任意です。 スマートコントラクトを使って誰でもNFTをミントできるようにしたい場合は、10行目の「Ownable」、17行目の「onlyOwner」を削除します。)
+- @openzeppelin/contracts/access/Ownable.solは、スマートコントラクトに[アクセス制御](https://docs.openzeppelin.com/contracts/3.x/access-control)を設定するので、スマートコントラクトの所有者 (あなた) のみがNFTをミントできます。 (注: アクセス制御の実装は完全に任意です。 スマートコントラクトを使って誰でもNFTをミントできるようにしたい場合は、10行目の「Ownable」、17行目の「onlyOwner」を削除します。)
-インポートステートメントの後にカスタムNFTスマートコントラクトがありますが、非常に短いもので、カウンタ、コンストラクタ、単一の関数しか含まれていません。 これは、NFTの所有者を返す`ownerOf`とNFTの所有権を他のアカウントに転送する`transferFrom`など、NFTを作成するために必要な大部分のメソッドを実装しているOpenZeppelinコントラクトを継承したおかげです。
+インポートステートメントの後にカスタムNFTスマートコントラクトがありますが、非常に短いもので、カウンタ、コンストラクタ、単一の関数しか含まれていません。 これは、継承したOpenZeppelinコントラクトのおかげです。このコントラクトには、NFTの所有者を返す`ownerOf`や、NFTの所有権をあるアカウントから別のアカウントに移転する`transferFrom`など、NFTの作成に必要なメソッドのほとんどが実装されています。
ERC-721コンストラクタでは、「MyNFT」と「NFT」の2つの文字列を渡すことに気づくでしょう。 最初の変数はスマートコントラクトの名前で、2番目の変数はそのシンボルです。 これらの変数にはそれぞれに自由に名前を付けることができます。
-最後に、`mintNFT(address recipient, string memory tokenURI)`という関数で、NFTをミントすることできます。 この関数には2つの変数が必要です。
+最後に、NFTをミントできる`mintNFT(address recipient, string memory tokenURI)`関数があります! この関数には2つの変数が必要です。
-- `address recipient`は、新しくミントされたNFTを受け取るアドレスを指定します。
+- `address recipient`は、新しくミントされたNFTを受け取るアドレスを指定します
-- `string memory tokenURI`は、NFTのメタデータを記述したJSONドキュメントに解決される必要がある文字列です。 NFTのメタデータは、名前、説明、画像、その他の属性など、設定可能なプロパティを持つことができます。 チュートリアルのパート2では、このメタデータの設定方法について説明します。
+- `string memory tokenURI`は、NFTのメタデータを記述するJSONドキュメントに解決されるべき文字列です。 NFTのメタデータは、名前、説明、画像、その他の属性など、設定可能なプロパティを持つことができます。 チュートリアルのパート2では、このメタデータの設定方法について説明します。
-`mintNFT`は継承されたERC-721ライブラリから複数のメソッドを呼び出し、最終的にミントされたばかりのNFTのIDを示す数値を返します。
+`mintNFT`は、継承されたERC-721ライブラリからいくつかのメソッドを呼び出し、最終的に新しくミントされたNFTのIDを表す数値を返します。
## ステップ11: MetaMaskとAlchemyをプロジェクトに接続する {#connect-metamask-and-alchemy}
@@ -218,24 +230,28 @@ ERC-721コンストラクタでは、「MyNFT」と「NFT」の2つの文字列
仮想ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使用した署名が必要です。 この許可をプログラムに与えるために、秘密鍵(とAlchemyのAPIキー)を環境ファイルに安全に格納する作業を行います。
-トランザクションの送信の詳細については、web3を使用したトランザクションの送信に関する[こちらのチュートリアル](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)をご覧ください。
+トランザクションの送信について詳しく知るには、web3を使用したトランザクション送信に関する[このチュートリアル](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)をご覧ください。
まず、プロジェクトディレクトリにdotenvパッケージをインストールします。
+ ```
npm install dotenv --save
+ ```
-次に、 `.env`ファイルをプロジェクトのルートディレクトリに作成し、そのファイルにMetamaskの秘密鍵とHTTP Alchemy APIのURLを追加します。
+次に、プロジェクトのルートディレクトリに`.env`ファイルを作成し、MetaMaskの秘密鍵とHTTP Alchemy API URLを追加します。
-- MetaMaskから秘密鍵をエクスポートするには、 [こちらの手順](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key)に従ってください。
+- MetaMaskから秘密鍵をエクスポートするには、[これらの手順](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key)に従ってください
- HTTP Alchemy API URLを取得し、クリップボードにコピーするには、以下を参照してください。
-
+
-`.env`ファイルは次のようになります。
+これで、`.env`は次のようになります:
+ ```
API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY="your-metamask-private-key"
+ ```
これらの変数を実際にコードに接続するために、ステップ13で hardhat.config.jsファイル内のこれらの変数を参照します。
@@ -243,21 +259,23 @@ ERC-721コンストラクタでは、「MyNFT」と「NFT」の2つの文字列
## ステップ12: Ethers.jsをインストールする {#install-ethers}
-Ethers.jsは、よりユーザーフレンドリーなメソッドで[標準のJSON-RPCメソッド](/developers/docs/apis/json-rpc/)をラップすることにより、イーサリアムとの対話やリクエストを簡単にするライブラリです。
+Ethers.jsは、[標準のJSON-RPCメソッド](/developers/docs/apis/json-rpc/)をよりユーザーフレンドリーなメソッドでラップすることで、イーサリアムとの対話やリクエストを容易にするライブラリです。
-Hardhatは、追加のツールと拡張機能のための[プラグイン](https://hardhat.org/plugins/)の統合を非常に簡単にしてくれます。 コントラクトのデプロイメントに[Ethersプラグイン](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers)を利用します([Ethers.js](https://github.com/ethers-io/ethers.js/)には、複数の非常にクリーンなコントラクトのデプロイメント方法があります)。
+Hardhatでは、追加のツールや拡張機能のための[プラグイン](https://hardhat.org/plugins/)を非常に簡単に統合できます。 コントラクトのデプロイには[Ethersプラグイン](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers)を活用します([Ethers.js](https://github.com/ethers-io/ethers.js/)には非常にクリーンなコントラクトデプロイメントメソッドがあります)。
プロジェクトのホームディレクトリで以下を実行します。
+ ```
npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0
+ ```
-次のステップでは、 hardhat.config.js でもイーサリアムが必要になります。
+次のステップのhardhat.config.jsでもEthers(.js)が必要になります。
-## ステップ13: hardhat.config.jsをアップデートする {#update-hardhat-config}
+## ステップ13: hardhat.config.jsを更新する {#update-hardhat-config}
-これまでにいくつかの依存関係とプラグインを追加しました。プロジェクトがそれらすべてを知るように、 hardhat.config.js を更新する必要があります。
+ここまでで、いくつかの依存関係とプラグインを追加しました。次に、プロジェクトがそれらすべてを認識できるように、hardhat.config.jsをアップデートする必要があります。
-「hardhat.config.js」を以下のように更新してください:
+hardhat.config.jsを以下のようにアップデートします。
```js
/**
@@ -281,28 +299,30 @@ Hardhatは、追加のツールと拡張機能のための[プラグイン](http
## ステップ14: コントラクトをコンパイルする {#compile-contract}
-ここまででしっかりと動作していることを確認するため、コントラクトをコンパイルしてみましょう。 コンパイルは、Hardhat の組み込まれた機能の1つです。
+ここまでの作業がうまくいっていることを確認するために、コントラクトをコンパイルしてみましょう。 コンパイルは、組み込みのHardhatタスクの1つです。
コマンドラインで以下を実行します。
+ ```
npx hardhat compile
+ ```
-SPDX license identifier not provided in source file という警告が表示されるかもしれません。しかし、それについて心配する必要はありません — うまくいけば、他のすべてが良く見えるでしょう! 表示された場合は、いつでも[Alchemy discord](https://discord.gg/u72VCg3)でメッセージを送信できます。
+SPDXライセンス識別子がソースファイルで提供されていないという警告が表示される場合がありますが、心配する必要はありません。警告が表示されないのがベストですが、 うまくいかない場合は、いつでも[Alchemy Discord](https://discord.gg/u72VCg3)でメッセージを送ることができます。
-## ステップ15: デプロイスクリプトを書く {#write-deploy}
+## ステップ15: デプロイスクリプトを作成する {#write-deploy}
コントラクトの作成と設定ファイルの作成が完了したら、いよいよコントラクトのデプロイのためのスクリプトを作成します。
-`scripts/` フォルダに移動し、 `deploy.js` という名前の新しいファイルを作成し、以下の内容を追加します:
+`scripts/`フォルダに移動して`deploy.js`という名前の新しいファイルを作成し、以下の内容を追加します:
```js
async function main() {
const MyNFT = await ethers.getContractFactory("MyNFT")
- // Start deployment, returning a promise that resolves to a contract object
+ // デプロイを開始し、コントラクトオブジェクトに解決されるプロミスを返す
const myNFT = await MyNFT.deploy()
await myNFT.deployed()
- console.log("Contract deployed to address:", myNFT.address)
+ console.log("コントラクトがデプロイされたアドレス:", myNFT.address)
}
main()
@@ -313,40 +333,48 @@ main()
})
```
-Hardhatがコードの各行で行っている驚くべき内容については、Hardhatの[コントラクトチュートリアル](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)で説明されています。以下では、その説明を採用しています。
+Hardhatは、[コントラクトのチュートリアル](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)で、これらのコードの各行が何をするかを非常にうまく説明しています。ここではその説明を採用しました。
+ ```
const MyNFT = await ethers.getContractFactory("MyNFT");
+ ```
-ethers.js の中の ContractFactory は新しいスマートコントラクトを作成するための抽象化です。ここでの MyNFT は NFT コントラクトのインスタンスのためのファクトリです。 hardhat-ethers プラグインを使用する場合、 ContractFactory および Contract インスタンスはデフォルトで最初の署名者に接続されます。
+ethers.jsのContractFactoryは新しいスマートコントラクトをデプロイするための抽象化であり、ここでのMyNFTはNFTコントラクトのインスタンスのためのファクトリです。 hardhat-ethersプラグインを使用する場合、 ContractFactoryおよびContractインスタンスはデフォルトで最初の署名者に接続されます。
+ ```
const myNFT = await MyNFT.deploy();
+ ```
-ContractFactory の deploy() を呼び出すとデプロイメントが開始し、 Contract を解決するための Promise が返されます。 これは、スマートコントラクトの各関数に対するメソッドを持つオブジェクトです。
+ContractFactoryのdeploy()を呼び出すとデプロイメントが開始し、 Contractを解決するためのPromiseが返されます。 これは、スマートコントラクトの各関数に対するメソッドを持つオブジェクトです。
## ステップ16: コントラクトをデプロイする {#deploy-contract}
-ようやく、スマートコントラクトをデプロイする準備が整いました。 プロジェクトディレクトリのルートに戻り、コマンドラインで以下を実行します:
+ようやく、スマートコントラクトをデプロイする準備が整いました。 プロジェクトディレクトリのルートに戻り、コマンドラインで以下を実行します。
+ ```
npx hardhat --network sepolia run scripts/deploy.js
+ ```
次のような画面が表示されるはずです。
+ ```
Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650
+ ```
-[Sepolia etherscan](https://sepolia.etherscan.io/)に移動し、コントラクトアドレスを検索すると、正常にデプロイされたことが確認できるはずです。 すぐに見られない場合は、しばらくお待ちください。 トランザクションは以下のようなものになります。
+[Sepolia etherscan](https://sepolia.etherscan.io/)にアクセスし、コントラクトアドレスを検索すると、正常にデプロイされたことを確認できるはずです。 すぐに表示されない場合は、しばらくお待ちください。 トランザクションは以下のようなものになります。
-
+
-From アドレスは MetaMask アカウントアドレスと一致し、To アドレスは「Contract Creation」となります。 トランザクション内容をクリックすると、To フィールドにコントラクトアドレスが表示されます:
+FromアドレスはあなたのMetaMaskアカウントのアドレスと一致し、Toアドレスには「Contract Creation」と表示されます。 このトランザクションをクリックすると、Toフィールドにコントラクトアドレスが表示されます。
-
+
-Yassss! イーサリアム(テストネット)チェーンにNFTスマートコントラクトをデプロイできました。
+おめでとうございます。 イーサリアム(テストネット)チェーンにNFTスマートコントラクトをデプロイできました。
-内部で何が起こっているのかを理解するために、[Alchemyダッシュボード](https://dashboard.alchemyapi.io/explorer)のExplorerタブに移動してみましょう。 Alchemy のアプリが複数ある場合は、必ずアプリでフィルタリングし、「MyNFT」を選択してください。
+内部で何が起こっているのかを理解するために、[Alchemyダッシュボード](https://dashboard.alchemyapi.io/explorer)のExplorerタブに移動してみましょう。 Alchemyのアプリが複数ある場合は、必ずアプリでフィルタリングして、「MyNFT」を選択してください。
-
+
-ここでは、 .deploy() 関数を呼び出した際に、Hardhat/Ethers が内部で作った JSON-RPC の呼び出しをいくつか見ることができます。 ここで呼び出している2つの重要なJSON-RPCは、実際にSepoliaチェーン上でコントラクトを書き込むリクエストの[eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction)と、(トランザクションを送信する際の典型的なパターンである) ハッシュを与えられたトランザクションに関する情報を読み取るリクエスト[eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash)です。 トランザクションの送信の詳細については、このチュートリアルの [Web3 を使用したトランザクションの送信](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) をご覧ください。
+ここでは、Hardhat/Ethersが.deploy()関数を呼び出した際に、内部で行ったJSON-RPCの呼び出しを見ることができます。 ここで特筆すべき重要な2つのリクエストは、実際にSepoliaチェーンにスマートコントラクトを書き込むためのリクエストである[eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction)と、ハッシュが与えられたトランザクションに関する情報を読み取るためのリクエスト (トランザクション送信時の典型的なパターン) である[eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash)です。 トランザクションの送信についてさらに詳しく知るには、[Web3を使用したトランザクション送信](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)に関するこのチュートリアルをご覧ください。
-以上がこのチュートリアルのパート1です。 [パート2](/developers/tutorials/how-to-mint-an-nft/) では、NFT を発行することで実際にスマートコントラクトとやりとりをします。そして、[パート3](/developers/tutorials/how-to-view-nft-in-metamask/) では、Etherreum ウォレット内の NFT を確認する方法を示します!
+チュートリアルのパート1は以上です。 [パート2では、NFTをミントしてスマートコントラクトと実際にやり取りし](/developers/tutorials/how-to-mint-an-nft/)、[パート3ではイーサリアムウォレットでNFTを表示する方法](/developers/tutorials/how-to-view-nft-in-metamask/)をご紹介します!
diff --git a/public/content/translations/ja/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/ja/developers/tutorials/interact-with-other-contracts-from-solidity/index.md
index de8baa117fa..5c95191a15c 100644
--- a/public/content/translations/ja/developers/tutorials/interact-with-other-contracts-from-solidity/index.md
+++ b/public/content/translations/ja/developers/tutorials/interact-with-other-contracts-from-solidity/index.md
@@ -1,13 +1,8 @@
---
-title: Solidityを使用した他のコントラクトの活用
-description: 既存のコントラクトからスマートコントラクトをデプロイし、それを活用する方法
+title: "Solidityから他のコントラクトとやり取りする"
+description: "既存のコントラクトからスマートコントラクトをデプロイし、それとやり取りする方法"
author: "jdourlens"
-tags:
- - "スマートコントラクト"
- - "Solidity"
- - "Remix"
- - "デプロイ"
- - "構成可能性"
+tags: [ "スマートコントラクト", "Solidity", "Remix", "デプロイ", "構成可能性" ]
skill: advanced
lang: ja
published: 2020-04-05
@@ -16,9 +11,9 @@ sourceUrl: https://ethereumdev.io/interact-with-other-contracts-from-solidity/
address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
---
-これまでのチュートリアルでは、[最初のスマートコントラクトをデプロイする方法](/developers/tutorials/deploying-your-first-smart-contract/)と、[修飾子によるアクセス制御](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/)や[Solidityでのエラー処理](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/)といったいくつかの機能を追加する方法について学びました。 このチュートリアルでは、既存のコントラクトからスマートコントラクトをデプロイし、それを活用する方法について説明します。
+これまでのチュートリアルでは、[最初のスマートコントラクトのデプロイ方法](/developers/tutorials/deploying-your-first-smart-contract/)や、[修飾子(modifier)を使ったアクセス制御](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/)、[Solidityでのエラー処理](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/)といった機能の追加など、多くのことを学びました。 このチュートリアルでは、既存のコントラクトからスマートコントラクトをデプロイし、それとやり取りする方法を学びます。
-ここでは、`CounterFactory`という名前のファクトリーを作成することで、誰でも自分の`Counter`スマートコントラクトを所有できるようにするコントラクトを作成します。 初めに、これが`Counter`スマートコントラクトの初期コードです。
+ここでは、`CounterFactory`という名前のファクトリーを作成することで、誰もが自分自身の`Counter`スマートコントラクトを持てるようにするコントラクトを作成します。 まず、これが最初の`Counter`スマートコントラクトのコードです。
```solidity
pragma solidity 0.5.17;
@@ -31,12 +26,12 @@ contract Counter {
modifier onlyOwner(address caller) {
- require(caller == _owner, "You're not the owner of the contract");
+ require(caller == _owner, "あなたはこのコントラクトの所有者ではありません");
_;
}
modifier onlyFactory() {
- require(msg.sender == _factory, "You need to use the factory");
+ require(msg.sender == _factory, "ファクトリーを使用する必要があります");
_;
}
@@ -56,19 +51,19 @@ contract Counter {
}
```
-ファクトリーのアドレスとコントラクト所有者のアドレスを追跡するために、コントラクトコードを少し変更していることに注意してください。 他のコントラクトからコントラクトコードを呼び出した場合、msg.senderはコントラクトファクトリーのアドレスを参照します。 コントラクトを使用して他のコントラクトとやり取りすることはよくあることなので、これは**理解しておくべき非常に重要なポイント**です。 したがって、複雑なケースでは誰が送信者なのかに注意を払う必要があります。
+ファクトリーのアドレスとコントラクト所有者のアドレスを追跡するために、コントラクトコードを少し変更したことに注意してください。 他のコントラクトからコントラクトコードを呼び出すと、`msg.sender`は私たちのコントラクトファクトリーのアドレスを参照します。 コントラクトを使って他のコントラクトとやり取りするのは一般的な方法であるため、これは**理解しておくべき、本当に重要な点**です。 したがって、複雑なケースでは誰が送信者(`sender`)なのかに注意する必要があります。
-このために、`onlyFactory`という修飾子も追加しました。この修飾子は、元の呼び出し元をパラメータとして渡すファクトリーのみが、状態変更関数を呼び出せるようにします。
+このため、元の呼び出し元をパラメータとして渡すファクトリーによってのみ状態変更関数が呼び出されるように、`onlyFactory`修飾子も追加しました。
-他のすべてのカウンターを管理する新しい`CounterFactory`内で、所有者をカウンターコントラクトのアドレスに関連付けるマッピングを追加します。
+他のすべての`Counter`を管理する新しい`CounterFactory`の中に、所有者とそのカウンターコントラクトのアドレスを関連付けるマッピングを追加します。
```solidity
mapping(address => Counter) _counters;
```
-イーサリアムでは、マッピングはJavaScriptのオブジェクトに相当します。これは、型Aのキーを型Bの値にマッピングできます。ここでは、所有者のアドレスをそのカウンターのインスタンスにマッピングしています。
+イーサリアムでは、マッピングはJavaScriptのオブジェクトに相当し、型Aのキーを型Bの値にマッピングできます。このケースでは、所有者のアドレスをその`Counter`のインスタンスにマッピングします。
-ユーザーのために新しいカウンターをインスタンス化する場合は、次のようになります。
+誰かのために新しい`Counter`をインスタンス化するには、次のようになります。
```solidity
function createCounter() public {
@@ -77,9 +72,9 @@ mapping(address => Counter) _counters;
}
```
-まず、そのユーザーがすでにカウンターを所有しているかどうかを確認します。 もしカウンターを所有していなければ(カウンターの数が0ならば)、そのアドレスを`Counter`コンストラクタに渡して新しいカウンターをインスタンス化し、新しく作成したインスタンスをマッピングに割り当てます。
+まず、その人がすでにカウンターを所有しているかどうかをチェックします。 その人がカウンターを所有していない場合、その人のアドレスを`Counter`のコンストラクタに渡して新しいカウンターをインスタンス化し、新しく作成されたインスタンスをマッピングに割り当てます。
-特定のカウンターの数を取得する場合は、次のようになります。
+特定の`Counter`のカウント数を取得するには、次のようになります。
```solidity
function getCount(address account) public view returns (uint256) {
@@ -92,9 +87,9 @@ function getMyCount() public view returns (uint256) {
}
```
-最初の関数は、指定されたアドレスにCounterコントラクトが存在するかどうかをチェックし、存在する場合にインスタンスから`getCount`メソッドを呼び出します。 2番目の関数`getMyCount`は、msg.senderを直接`getCount`関数に渡す短い関数です。
+最初の関数は、指定されたアドレスに対して`Counter`コントラクトが存在するかどうかをチェックし、その後インスタンスから`getCount`メソッドを呼び出します。 2番目の関数`getMyCount`は、`msg.sender`を直接`getCount`関数に渡すための、ただのショートカットです。
-`increment`関数もかなり類似していますが、`Counter`コントラクトに元のトランザクション送信者を渡します。
+`increment`関数も非常によく似ていますが、元のトランザクションの送信者(`sender`)を`Counter`コントラクトに渡します。
```solidity
function increment() public {
@@ -103,11 +98,11 @@ function increment() public {
}
```
-この関数を何度も呼び出すと、カウンターがオーバーフローする可能性がありますので注意してください。 オーバーフローが発生しないように、できる限り[SafeMathライブラリ](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/)を使用してください。
+何度も呼び出されると、カウンターがオーバーフローを起こす可能性があることに注意してください。 この可能性から保護するために、[SafeMathライブラリ](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/)をできるだけ使用すべきです。
-このコントラクトをデプロイするためには、`CounterFactory`と`Counter`の両方のコードが必要です。 例えばRemixでデプロイする場合、CounterFactoryを選択する必要があります。
+このコントラクトをデプロイするには、`CounterFactory`と`Counter`の両方のコードを提供する必要があります。 例えばRemixでデプロイする場合、`CounterFactory`を選択する必要があります。
-これが完成したコードです。
+こちらが全コードです。
```solidity
pragma solidity 0.5.17;
@@ -120,12 +115,12 @@ contract Counter {
modifier onlyOwner(address caller) {
- require(caller == _owner, "You're not the owner of the contract");
+ require(caller == _owner, "あなたはこのコントラクトの所有者ではありません");
_;
}
modifier onlyFactory() {
- require(msg.sender == _factory, "You need to use the factory");
+ require(msg.sender == _factory, "ファクトリーを使用する必要があります");
_;
}
@@ -172,6 +167,6 @@ contract CounterFactory {
コンパイル後、Remixのデプロイセクションで、デプロイするファクトリーを選択します。
-
+
-コントラクトファクトリーを使うと、値の変化を確認できます。 もし、別のアドレスからスマートコントラクトを呼び出したい場合は、Remixのアカウントの選択で別のアドレスに変更する必要があります。
+その後、コントラクトファクトリーを操作して、値が変化することを確認できます。 もし、異なるアドレスからスマートコントラクトを呼び出したい場合は、Remixのアカウント選択でアドレスを変更する必要があります。
diff --git a/public/content/translations/ja/developers/tutorials/ipfs-decentralized-ui/index.md b/public/content/translations/ja/developers/tutorials/ipfs-decentralized-ui/index.md
new file mode 100644
index 00000000000..720e7681bad
--- /dev/null
+++ b/public/content/translations/ja/developers/tutorials/ipfs-decentralized-ui/index.md
@@ -0,0 +1,73 @@
+---
+title: "IPFSを利用した分散型ユーザーインターフェース"
+description: "このチュートリアルでは、dappのユーザーインターフェースを保存するためにIPFSを使用する方法を学びます。 アプリケーションのデータとビジネスロジックは分散化されていますが、検閲耐性のあるユーザーインターフェースがなければ、ユーザーはいずれにせよそれにアクセスできなくなる可能性があります。"
+author: Ori Pomerantz
+tags: [ "ipfs" ]
+skill: beginner
+lang: ja
+published: 2024-06-29
+---
+
+あなたは素晴らしい新しいdappを作成しました。 そのための[ユーザーインターフェース](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/)も作成しました。 しかし、あなたのユーザーインターフェースはクラウド上の1つのサーバーにすぎず、誰かがそれを停止させて検閲しようとすることを恐れています。 このチュートリアルでは、ユーザーインターフェースを**[Interplanetary File System (IPFS)](https://ipfs.tech/developers/)**上に置くことで検閲を回避する方法を学びます。そうすれば、関心のある誰もが将来のアクセスのためにサーバーにそれをピン留めできるようになります。
+
+[Fleek](https://resources.fleek.xyz/docs/)などのサードパーティサービスを使用して、すべての作業を行うこともできます。 このチュートリアルは、たとえ作業量が増えても、自分たちが何をしているのかを十分に理解したい人向けです。
+
+## ローカルでの開始 {#getting-started-locally}
+
+複数の[サードパーティIPFSプロバイダー](https://docs.ipfs.tech/how-to/work-with-pinning-services/#use-a-third-party-pinning-service)がありますが、テストのためにローカルでIPFSを実行することから始めるのが最善です。
+
+1. [IPFSユーザーインターフェース](https://docs.ipfs.tech/install/ipfs-desktop/#install-instructions)をインストールします。
+
+2. Webサイトのディレクトリを作成します。 [Vite](https://vite.dev/)を使用している場合は、次のコマンドを使用します。
+
+ ```sh
+ pnpm vite build
+ ```
+
+3. IPFS Desktopで、**[インポート] > [フォルダー]** をクリックし、前の手順で作成したディレクトリを選択します。
+
+4. アップロードしたばかりのフォルダを選択し、**[名前の変更]** をクリックします。 より意味のある名前を付けます。
+
+5. もう一度選択し、**[リンクを共有]** をクリックします。 URLをクリップボードにコピーします。 `https://ipfs.io/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ` のようなリンクになります。
+
+6. **[ステータス]** をクリックします。 **[詳細設定]** タブを展開してゲートウェイアドレスを表示します。 例えば、私のシステムではアドレスは `http://127.0.0.1:8080` です。
+
+7. リンク手順のパスとゲートウェイアドレスを組み合わせて、あなたのアドレスを見つけます。 例えば、上記の例では、URLは `http://127.0.0.1:8080/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ` です。 そのURLをブラウザで開いて、あなたのサイトを表示します。
+
+## アップロード {#uploading}
+
+これでIPFSを使ってローカルでファイルを提供できるようになりましたが、これはあまりエキサイティングなことではありません。 次のステップは、あなたがオフラインのときに世界中から利用できるようにすることです。
+
+よく知られている[ピニングサービス](https://docs.ipfs.tech/concepts/persistence/#pinning-services)がいくつかあります。 そのうちの1つを選びます。 どのサービスを使用するにしても、アカウントを作成し、IPFSデスクトップの**コンテンツ識別子 (CID)** を提供する必要があります。
+
+個人的には、[4EVERLAND](https://docs.4everland.org/storage/4ever-pin/guides) が最も使いやすいと思いました。 その手順は次のとおりです。
+
+1. [ダッシュボード](https://dashboard.4everland.org/overview)にアクセスし、ウォレットでログインします。
+
+2. 左のサイドバーで **[ストレージ] > [4EVER Pin]** をクリックします。
+
+3. **[アップロード] > [Selected CID]** をクリックします。 コンテンツに名前を付け、IPFSデスクトップからCIDを提供します。 現在、CIDは`Qm`で始まり、`QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`のように[base-58でエンコード](https://medium.com/bootdotdev/base64-vs-base58-encoding-c25553ff4524)されたハッシュを表す44文字の英数字が続く文字列ですが、[これは変更される可能性](https://docs.ipfs.tech/concepts/content-addressing/#version-1-v1)があります。
+
+4. 初期ステータスは**Queued**です。 **Pinned**に変わるまでリロードします。
+
+5. CIDをクリックしてリンクを取得します。 私のアプリケーションは[こちら](https://bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im/)でご覧いただけます。
+
+6. 1か月以上ピン留めするには、アカウントを有効化する必要があるかもしれません。 アカウントの有効化には約1ドルかかります。 閉じてしまった場合は、ログアウトしてから再度ログインすると、再び有効化を求められます。
+
+## IPFSからの使用 {#using-from-ipfs}
+
+この時点で、あなたはIPFSコンテンツを提供する中央集権型のゲートウェイへのリンクを持っています。 要するに、あなたのユーザーインターフェースは少し安全になったかもしれませんが、まだ検閲耐性はありません。 真の検閲耐性を得るには、ユーザーはIPFSを[ブラウザから直接](https://docs.ipfs.tech/install/ipfs-companion/#prerequisites)使用する必要があります。
+
+それがインストールされ(そしてデスクトップIPFSが動作していれば)、任意のサイトで[/ipfs/``](https://any.site/ipfs/bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im)にアクセスすると、そのコンテンツが分散型の方法で提供されます。
+
+## 欠点 {#drawbacks}
+
+IPFSファイルを確実に削除することはできないため、ユーザーインターフェースを変更している間は、中央集権型のままにするか、IPFS上で可変性を提供するシステムである[Interplanetary Name System (IPNS)](https://docs.ipfs.tech/concepts/ipns/#mutability-in-ipfs)を使用するのがおそらく最善です。 もちろん、可変なものは検閲される可能性があります。IPNSの場合は、それに対応する秘密鍵を持つ人物に圧力をかけることで検閲されます。
+
+さらに、一部のパッケージはIPFSとの間に問題を抱えているため、あなたのWebサイトが非常に複雑な場合、これは良い解決策ではないかもしれません。 そしてもちろん、サーバーとの統合に依存するものは、クライアントサイドをIPFSに置くだけでは分散化できません。
+
+## 結論 {#conclusion}
+
+イーサリアムがdappのデータベースとビジネスロジックの側面を分散化できるように、IPFSはユーザーインターフェースを分散化できるようにします。 これにより、あなたのdappに対するもう一つの攻撃ベクトルを遮断できます。
+
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
diff --git a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md
index 416e46b50bc..ed7ec7e198a 100644
--- a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md
+++ b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md
@@ -1,17 +1,15 @@
---
-title: create-eth-appでDappのフロントエンド開発をはじめましょう
-description: create-eth-appの使い方と機能の概要
+title: "create-eth-appでdappのフロントエンド開発を始めましょう"
+description: "create-eth-appの使い方と機能の概要"
author: "Markus Waas"
tags:
- - "create-eth-app"
- - "フロントエンド"
- - "JavaScript"
- - "ethers.js"
- - "The Graph"
- - "Aave"
- - "Compound"
- - "Uniswap"
- - "Sablier"
+ [
+ "フロントエンド",
+ "JavaScript",
+ "ethers.js",
+ "the graph",
+ "DeFi"
+ ]
skill: beginner
lang: ja
published: 2020-04-27
@@ -19,11 +17,11 @@ source: soliditydeveloper.com
sourceUrl: https://soliditydeveloper.com/create-eth-app
---
-[create-eth-app](https://github.com/PaulRBerg/create-eth-app)については、前回の記事([Solidity の全体像](https://soliditydeveloper.com/solidity-overview-2020))で紹介しました。 今回は、create-eth-app をどのように使うか、どのような機能が統合されているか、およびさらに拡張する方法について学びます。 create-eth-app は、[ Sablier ](http://sablier.com/)の創業者である Paul Razvan Berg が立ち上げたプロジェクトで、フロントエンド開発をすばやく開始できるだけでなく、さまざまなオプションの統合機能も活用できます。
+前回は[Solidityの全体像](https://soliditydeveloper.com/solidity-overview-2020)を確認し、すでに[create-eth-app](https://github.com/PaulRBerg/create-eth-app)についても言及しました。 今回は、その使い方、統合されている機能、そしてそれを拡張するための追加のアイデアについて解説します。 [Sablier](http://sablier.com/)の創業者であるPaul Razvan Bergによって始められたこのアプリは、フロントエンド開発をすぐに開始でき、いくつかのオプションの統合機能から選択することができます。
## インストール {#installation}
-インストールには、Yarn 0.25 以上が必要です(`npm install yarn --global`)。 とても簡単です!
+インストールには、Yarn 0.25以上が必要です (`npm install yarn --global`)。 次のように実行するだけで簡単です:
```bash
yarn create eth-app my-eth-app
@@ -31,44 +29,44 @@ cd my-eth-app
yarn react-app:start
```
-このアプリでは、 [create-react-app](https://github.com/facebook/create-react-app)を利用しています。 アプリを表示するには、ブラウザで `http://localhost:3000/` を開きます。 本番環境にデプロイする準備ができたら、yarn build を実行してソースコードをまとめたファイルを作成します。 このアプリを手軽にホスティングするには、 [Netlify](https://www.netlify.com/)を利用すると良いでしょう。 GitHub リポジトリを作成して Netlify に登録し、ビルドコマンドをセットアップすれば完了です! あなたのアプリはインターネットに公開され、誰でも利用できるようになります。 これらはすべて無料です。
+内部で[create-react-app](https://github.com/facebook/create-react-app)を使用しています。 アプリを表示するには、`http://localhost:3000/`を開きます。 本番環境にデプロイする準備ができたら、`yarn build`で最小化されたバンドルを作成します。 これを簡単にホストする方法の一つとして、[Netlify](https://www.netlify.com/)があります。 GitHubリポジトリを作成し、それをNetlifyに追加し、ビルドコマンドをセットアップすれば完了です! あなたのアプリはホストされ、誰でも利用できるようになります。 そして、そのすべてが無料です。
## 機能 {#features}
-### React と create-react-app {#react--create-react-app}
+### Reactとcreate-react-app {#react--create-react-app}
-まずは、このアプリの核心である React と、*create-react-app*で提供される追加の機能すべてについて説明します。 イーサリアムとの統合を希望しない場合は、このアプリだけを使うのも良い方法です。 [React](https://reactjs.org/)を使えば、インタラクティブな UI を簡単に作成できます。 React は、[Vue](https://vuejs.org/)ほど初心者向けではありませんが、広く使われており、より多くの機能が提供されているだけでなく、何千ものライブラリを利用して機能を追加できます。 *create-react-app*も UI 開発を手軽に開始するのに役立つアプリで、以下の機能が含まれています。
+まず、このアプリの心臓部であるReactと、_create-react-app_に付属するすべての追加機能です。 Ethereumとの統合を望まない場合は、これだけを使用するのも良い選択肢です。 [React](https://react.dev/)を使えば、インタラクティブなUIをとても簡単に構築できます。 [Vue](https://vuejs.org/)ほど初心者向けではないかもしれませんが、依然として広く使われており、より多くの機能を持ち、そして最も重要なことに、何千もの追加のライブラリから選択することができます。 _create-react-app_を使えば、非常に簡単に始めることができ、次のものが含まれています:
-- React、JSX、ES6、TypeScript、および Flow の構文に対応
-- スプレッド構文などの ES6 に含まれない言語拡張
-- オートプレフィックス CSS により、-webkit- などの接頭辞が不必要
-- カバレッジレポート機能を搭載した、高速でインタラクティブな単体テストランナー
-- よくある間違いをリアルタイムで警告する開発環境用サーバ
-- 本番環境用に、JS、CSS、および画像ファイルをハッシュやソースマップとバンドルできるビルドスクリプト
+- React、JSX、ES6、TypeScript、Flow構文のサポート。
+- オブジェクトスプレッド演算子のようなES6を超える言語拡張。
+- 自動で接頭辞が付加されるCSS。-webkit-やその他の接頭辞は不要です。
+- カバレッジレポート機能を搭載した、高速でインタラクティブな単体テストランナー。
+- よくある間違いについて警告するライブ開発サーバー。
+- ハッシュとソースマップを使用して、本番用にJS、CSS、画像をバンドルするビルドスクリプト。
-特に*create-eth-app* は、新しい[副作用フック](https://reactjs.org/docs/hooks-effect.html)を利用しています。 これは、強力かつとてもコンパクトな、いわゆる関数コンポーネントを書くための方法です。 副作用フックを*create-eth-app*で活用する方法については、以下の Apollo に関するセクションを参照してください。
+特に_create-eth-app_は、新しい[副作用フック](https://legacy.reactjs.org/docs/hooks-effect.html)を利用しています。 強力でありながら非常に小さい、いわゆる関数コンポーネントを記述するためのメソッドです。 副作用フックをcreate-eth-appで活用する方法については、以下のApolloに関するセクションを参照してください。
### Yarn Workspaces {#yarn-workspaces}
-[Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces/)では、複数のパッケージをひとつのルートフォルダで管理することができ、`yarn install`を使って依存関係を一度にインストールすることができます。 このアプローチは、スマートコントラクトのアドレスや ABI 管理(スマートコントラクトをどこにデプロイしたか、スマートコントラクトとどのようなやり取りを行うか)などの小さなパッケージを追加したり、The Graph との統合において特に有益であり、どちらの機能も`create-eth-app`に含まれています。
+[Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces/)では、複数のパッケージをひとつのルートフォルダで管理することができ、`yarn install`を使って依存関係を一度にインストールすることができます。 このアプローチは、スマートコントラクトのアドレスやABI管理(スマートコントラクトをどこにデプロイしたか、スマートコントラクトとどのようなやり取りを行うか)などの小さなパッケージを追加したり、The Graphとの統合において特に有益であり、どちらの機能もcreate-eth-appに含まれています。
### ethers.js {#ethersjs}
-大部分のユーザーは現在でも[Web3.js](https://docs.web3js.org/)を使用していますが、昨年は[ethers.js](https://docs.ethers.io/)を Web3.js の代替として利用するユーザーが増加したため、*create-eth-app*には ethers.js が統合されています。 このライブラリで作業してもよいですし、Web3 に切り替えてもよいです。あるいは、もうすくベータが外れる[ethers.js v5](https://docs.ethers.org/v5/)にアップグレードするのもよいでしょう。
+[Web3](https://docs.web3js.org/)がまだ主流で使われていますが、[ethers.js](https://docs.ethers.io/)は昨年、代替として多くの注目を集めており、_create-eth-app_に統合されているものです。 これを使用するか、Web3に変更するか、またはベータ版がもうすぐ終了する[ethers.js v5](https://docs.ethers.org/v5/)へのアップグレードを検討することができます。
### The Graph {#the-graph}
-[GraphQL](https://graphql.org/)は、[RESTful API](https://restfulapi.net/)とは違う方法でデータを扱います。 特に分散型ブロックチェーンのデータを扱う場合、RESTful API よりもいくつかの利点があります。 その理由に興味がある方は、[GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a)をご覧ください。
+[GraphQL](https://graphql.org/)は、[Restful API](https://restfulapi.net/)と比較して、データを処理するための代替方法です。 特に分散型ブロックチェーンデータにとって、Restful APIよりもいくつかの利点があります。 この背後にある理由に興味がある場合は、[GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a)をご覧ください。
-通常、スマートコントラクトからは直接データを取得することができます。 最後に行った取引の時間を取得したい場合は、 `MyContract.methods.latestTradeTime().call()`を呼び出すだけで、infura のようなイーサリアムノードからデータを取得し、あなたの Dapp で使うことができます。 しかし、何百もの異なる種類のデータが必要な場合は事情が異なります。 ノードからのデータ取得が何百回も発生し、その都度[RTT](https://wikipedia.org/wiki/Round-trip_delay_time)が必要となるため、Dapp の処理速度が低下し、非効率になってしまいます。 ひとつの回避策としては、一度に複数のデータを返すデータ取得用の関数をスマートコントラクト側で用意する方法があるでしょう。 しかし、これは常に最善の方法とは言えません。
+通常、スマートコントラクトから直接データを取得します。 最新の取引の時刻を読み取りたいですか? `MyContract.methods.latestTradeTime().call()`を呼び出すだけで、Ethereumノードからdappにデータを取得します。 しかし、何百もの異なるデータポイントが必要な場合はどうでしょうか? そうなると、ノードへのデータフェッチが何百回も発生し、そのたびに[RTT](https://wikipedia.org/wiki/Round-trip_delay_time)が必要になり、dappが遅く非効率になります。 一つの回避策として、一度に複数のデータを返すフェッチャーコール関数をコントラクト内に設けることが考えられます。 しかし、これは必ずしも理想的ではありません。
-また、過去のデータが必要な場合もあるでしょう。 最後の取引の時間だけではなく、今まで自分が行った全ての取引の時間が知りたいかもしれません。 このような場合は、*create-eth-app*にある subgraph パッケージを活用できます。[ドキュメンテーション](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph)を参照して、あなたのニーズに合うように調整してください。 人気が高いスマートコントラクトの場合、すでに subgraph が含まれているかもしれません。 [subgraph explorer](https://thegraph.com/explorer/)をチェックしてみてください。
+そして、履歴データにも興味があるかもしれません。 最後の取引時間だけでなく、これまでに自分が行ったすべての取引の時間も知りたくなるでしょう。 _create-eth-app_のサブグラフパッケージを使用し、[ドキュメント](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph)を読んで、それを自分のコントラクトに適合させてください。 人気のあるスマートコントラクトを探している場合、すでにサブグラフが存在するかもしれません。 [サブグラフエクスプローラー](https://thegraph.com/explorer/)をチェックしてください。
-subgraph があれば、Dapp にシンプルなクエリをひとつ追加するだけで、過去のデータも含めた全てのブロックチェーンのデータを 1 回のフェッチ処理で取得することができます。
+サブグラフがあれば、dappで簡単なクエリを1つ書くだけで、必要な履歴データを含むすべての重要なブロックチェーンデータを取得でき、必要なフェッチは1回だけです。
### Apollo {#apollo}
-[Apollo Boost](https://www.apollographql.com/docs/react/get-started/)との統合により、React で作成した Dapp に The Graph を簡単に搭載できるようになりました。 特に[React hooks と Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks)を使えば、コンポーネントに GraphQL のクエリをひとつ追加するだけで、簡単にデータ取得が可能になります:
+[Apollo Boost](https://www.apollographql.com/docs/react/get-started/)の統合のおかげで、React dappにグラフを簡単に統合できます。 特に[ReactフックとApollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks)を使用する場合、データのフェッチはコンポーネントに単一のGraphQlクエリを記述するのと同じくらい簡単です:
```js
const { loading, error, data } = useQuery(myGraphQlQuery)
@@ -82,32 +80,32 @@ React.useEffect(() => {
## テンプレート {#templates}
-さらに、Dapp 用にさまざまなテンプレートが用意されています。 今のところ、Aave、Compound、UniSwap、および Sablier 用のテンプレートがあります。 これらのテンプレートはすべて、すでに subgraph と統合されており、スマートコントラクトのアドレスに対して重要なサービスを追加します。 `yarn create eth-app my-eth-app --with-template aave`などの作成コマンドを、テンプレートに追加するだけでよいです。
+さらに、いくつかの異なるテンプレートから選択できます。 これまでのところ、Aave、Compound、UniSwap、またはsablierの統合を使用できます。 それらはすべて、あらかじめ作成されたサブグラフ統合とともに、重要なサービススマートコントラクトのアドレスを追加します。 `yarn create eth-app my-eth-app --with-template aave`のように、作成コマンドにテンプレートを追加するだけです。
### Aave {#aave}
-[Aave](https://aave.com/)は、分散型の通貨レンディングプラットフォームです。 預金者は、市場に流動性を提供することで金利収入を獲得でき、借主は担保を提供して借り入れることができます。 Aave のユニークな特徴のひとつは、1 回のトランザクション内で返済する限り無担保で通貨を借入できる[フラッシュローン](https://docs.aave.com/developers/guides/flash-loans)という仕組みです。 この機能は、裁定取引で余分のキャッシュが必要になる場合などに有効でしょう。
+[Aave](https://aave.com/)は、分散型の金融市場です。 預金者は市場に流動性を提供して受動的収入を得る一方、借手は担保を使って借り入れることができます。 Aaveのユニークな特徴の1つは、[フラッシュローン](https://aave.com/docs/developers/flash-loans)です。これは、1つのトランザクション内でローンを返済する限り、担保なしでお金を借りることを可能にします。 これは、例えば裁定取引で追加の現金を得るのに役立ちます。
-利子が付与される取引中のトークンは、*aToken*と呼ばれます。
+利子を得るために取引されるトークンは、_aTokens_と呼ばれます。
-Aave と*create-eth-app*を統合すると、[Aave 用の subgraph](https://docs.aave.com/developers/getting-started/using-graphql)が使えるようになります。 Aave は The Graph を採用しており、[Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten)および[メインネット](https://thegraph.com/explorer/subgraph/aave/protocol)上では、すぐに導入できる subgraph を[raw](https://thegraph.com/explorer/subgraph/aave/protocol-raw)または[formatted](https://thegraph.com/explorer/subgraph/aave/protocol)形式で提供しています。
+_create-eth-app_とAaveを統合することを選択すると、[サブグラフ統合](https://docs.aave.com/developers/getting-started/using-graphql)が得られます。 AaveはThe Graphを使用しており、[Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten)と[メインネット](https://thegraph.com/explorer/subgraph/aave/protocol)上で、[raw](https://thegraph.com/explorer/subgraph/aave/protocol-raw)または[フォーマット済み](https://thegraph.com/explorer/subgraph/aave/protocol)形式で、すぐに使えるいくつかのサブグラフをすでに提供しています。
-
+
### Compound {#compound}
-[Compound](https://compound.finance/)は、Aave に類似したサービスです。 create-eth-app ではすでに、[Compound v2 の subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195)が利用可能です。 驚くべきことに、Compound では利子が付与されるトークンを*cToken*と呼んでいます。
+[Compound](https://compound.finance/)はAaveに似ています。 この統合には、新しい[Compound v2 Subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195)がすでに含まれています。 ここでの利息獲得トークンは、驚くべきことに_cTokens_と呼ばれています。
### Uniswap {#uniswap}
-[Uniswap](https://uniswap.exchange/)は、分散型取引所 (DEX) です。 流動性を供給するユーザーは、取引の売主/買主の両方に対して、必要なトークンや ether を提供して手数料を獲得することができます。 Uniswap は広く利用されているため、多種多様なトークンに最大規模の流動性を提供する取引所のひとつです。 あなたの Dapp に Uniswap を組み込むことで、ETH を DAI とスワップする機能などが簡単に実現できます。
+[Uniswap](https://uniswap.exchange/)は分散型取引所(DEX)です。 流動性供給者は、取引の両側に必要なトークンやEtherを提供することで手数料を得ることができます。 広く利用されているため、非常に広範囲のトークンに対して最も高い流動性の1つを持っています。 例えば、ユーザーがETHをDAIにスワップできるように、dappに簡単に統合できます。
-残念ながら、この記事の執筆時点で利用可能なのは Uniswap v1 のみとなっており、[最新リリースの v2](https://uniswap.org/blog/uniswap-v2/)は利用できません。
+残念ながら、この記事の執筆時点では、統合はUniswap v1のみで、[リリースされたばかりのv2](https://uniswap.org/blog/uniswap-v2/)には対応していません。
### Sablier {#sablier}
-[ Sablier](https://sablier.com/)は、ストリーミング決済を可能にする分散型アプリです。 Sablier をセットアップすれば、その後の管理を必要とせずに、1 回の支払日の代わりに常にお金を受け取ることができるようになります。 create-eth-app では、[独自の subgraph](https://thegraph.com/explorer/subgraph/sablierhq/sablier)が利用できます。
+[Sablier](https://sablier.com/)は、ユーザーがお金をストリーミングで支払うことを可能にします。 一度の給料日ではなく、初期設定後は追加の管理なしに継続的にお金を受け取ることができます。 この統合には、[独自のサブグラフ](https://thegraph.com/explorer/subgraph/sablierhq/sablier)が含まれています。
## 次のステップ {#whats-next}
-*create-eth-app*について質問がある場合は、[Sablier コミュニティーのサーバー](https://discord.gg/bsS8T47)にアクセスして、 *create-eth-app*の開発者に問い合わせることができます。 次のステップとしては、[Material UI](https://material-ui.com/)のような UI フレームワークの導入、あなたが実際に必要とするデータを取得するための GraphQL クエリの作成、およびデプロイのセットアップなどが考えられます。
+_create-eth-app_について質問がある場合は、[Sablierコミュニティサーバー](https://discord.gg/bsS8T47)にアクセスしてください。そこで_create-eth-app_の作成者と連絡を取ることができます。 最初の次のステップとして、[Material UI](https://mui.com/material-ui/)のようなUIフレームワークを統合し、実際に必要なデータのためにGraphQLクエリを書き、デプロイをセットアップすることをお勧めします。
diff --git a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md
index 0f0ab41e76d..6cade4dfe88 100644
--- a/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md
+++ b/public/content/translations/ja/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md
@@ -1,6 +1,6 @@
---
-title: create-eth-appでDappのフロントエンド開発をはじめましょう
-description: create-eth-appの使い方と機能の概要
+title: "create-eth-appでDappのフロントエンド開発をはじめましょう"
+description: "create-eth-appの使い方と機能の概要"
author: "Markus Waas"
tags:
- "create-eth-app"
diff --git a/public/content/translations/ja/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/ja/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md
index d2d4dc2fd2a..bbb909695df 100644
--- a/public/content/translations/ja/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md
+++ b/public/content/translations/ja/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md
@@ -1,11 +1,8 @@
---
-title: SQLでイーサリアムの基礎的なトピックについて学ぶ
-description: このチュートリアルは、SQL(Structured Query Language)を使用してブロックチェーン上のデータに対するクエリを実行することで、トランザクション、ブロック、ガスといったイーサリアムの基本的な概念についての理解を深めるものです。
+title: "SQLでイーサリアムの基礎的なトピックについて学ぶ"
+description: "このチュートリアルは、SQL(Structured Query Language)を使用してオンチェーンデータにクエリを実行することで、トランザクション、ブロック、ガスといったイーサリアムの基本的な概念についての理解を深めるものです。"
author: "Paul Apivat"
-tags:
- - "SQL"
- - "クエリ"
- - "トランザクション"
+tags: [ "SQL", "クエリ", "トランザクション" ]
skill: beginner
lang: ja
published: 2021-05-11
@@ -13,27 +10,27 @@ source: paulapivat.com
sourceUrl: https://paulapivat.com/post/query_ethereum/
---
-イーサリアムに関するチュートリアルの多くはデベロッパ向けのものですが、データアナリストや、クライアント/ノードを実行することなくオンチェーンのデータを確認したい人々を対象とする学習リソースは多くありません。
+イーサリアムに関するチュートリアルの多くはデベロッパー向けのものですが、データアナリストや、クライアント/ノードを実行することなくオンチェーンのデータを確認したい人々を対象とする学習リソースは多くありません。
-このチュートリアルは、[Dune Analytics](https://dune.xyz/home)が提供するインターフェースを用いて、オンチェーンのデータに対してSQL(Structured Query Language)のクエリを実行することで、トランザクション、ブロック、ガスといったイーサリアムの基本的なコンセプトについての理解を深めるものです。
+このチュートリアルは、[Dune Analytics](https://dune.com/)が提供するインターフェースを用いて、オンチェーンのデータに対して構造化問い合わせ言語(SQL)のクエリを実行することで、トランザクション、ブロック、ガスといったイーサリアムの基本的なコンセプトについての理解を深めるものです。
オンチェーンのデータは、イーサリアムやイーサリアム・ネットワークに関する理解を深めるのに役立つだけでなく、コンピュータ処理能力の経済学といった現在のイーサリアムが直面している課題(例:ガス代の上昇)や、より重要性が高いスケーリング・ソリューションに関する議論について、基本的な事項を理解する土台となるものです。
### トランザクション {#transactions}
-イーサリアムの新規ユーザーはまず、ETH残高を持つエンティティであるユーザー管理アカウントを初期化する必要があります。 イーサリアムのアカウントには、ユーザー管理アカウントとスマートコントラクトの2種類があります([ethereum.org](/developers/docs/accounts/)を参照)してください)。
+イーサリアムのユーザーの体験は、ユーザーが管理するアカウント、またはETH残高を持つエンティティを初期化することから始まります。 アカウントには、ユーザー管理アカウントとスマートコントラクトの2種類があります([ethereum.org](/developers/docs/accounts/)を参照)。
-すべてのアカウントは、[Etherscan](https://etherscan.io/)のようなブロックエクスプローラーで表示できます。 ブロックエクスプローラーは、イーサリアム上のデータポータルです。 このポータルから、ブロックのデータ、トランザクション、マイナー、アカウント、および他のオンチェーンのアクティビティをリアルタイムで確認できます([こちら](/developers/docs/data-and-analytics/block-explorers/)をご覧ください)。
+どのアカウントも、[Etherscan](https://etherscan.io/)や[Blockscout](https://eth.blockscout.com/)のようなブロックエクスプローラーで表示できます。 ブロックエクスプローラーは、イーサリアム上のデータポータルです。 このポータルから、ブロックのデータ、トランザクション、マイナー、アカウント、および他のオンチェーンのアクティビティをリアルタイムで確認できます([こちら](/developers/docs/data-and-analytics/block-explorers/)をご覧ください)。
-しかし、外部のブロックエスプローラーが提供する情報と直接照合したい場合は、オンチェーンのデータに対するクエリを実行したいと思うかもしれません。 [Dune Analytics](https://duneanalytics.com/)は、SQLに関する一定の知識を前提として、あらゆるユーザーにこのクエリ機能を提供します。
+しかし、外部のブロックエクスプローラーが提供する情報と直接照合したい場合は、オンチェーンのデータに対するクエリを実行したいと思うかもしれません。 [Dune Analytics](https://dune.com/)は、SQLに関する一定の知識を持つ人なら誰でもこの機能を利用できるようにします。
-参考までに、イーサリアム・ファウンデーション (EF) のスマートコントラクトアカウントは[Etherscan](https://etherscan.io/address/0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae)で表示することができます。
+参考までに、イーサリアム財団(EF)のスマートコントラクトアカウントは[Blockscout](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe)で閲覧できます。
-EFのアカウントを含むすべてのアカウントは、トランザクションの送受信に使用できる公開アドレスを持つ点に留意してください。
+注意すべき点として、EFのアカウントを含むすべてのアカウントは、トランザクションの送受信に使用できる公開アドレスを持つということが挙げられます。
-Etherscanのアカウント残高は、通常のトランザクションと内部トランザクションで構成されています。 内部トランザクションは誤解を招きやすい名前ですが、チェーンの状態を変更する _実際の_トランザクションではありません。 内部トランザクションとは、コントラクト([ソース](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions))を実行することで開始される「値の移転」を意味します。 内部トランザクションは署名を持たないためブロックチェーンには **含まれず**、Dune Analyticsでクエリを実行することができません。
+Etherscanのアカウント残高は、通常のトランザクションと内部トランザクションで構成されています。 内部トランザクションは、その名前とは裏腹に、チェーンの状態を変更する_実際の_トランザクションではありません。 これらは、コントラクトの実行によって開始される値の転送です([ソース](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions))。 内部トランザクションは署名を持たないためブロックチェーンには**含まれず**、Dune Analyticsでクエリを実行することができません。
-従って、このチュートリアルでは通常のトランザクションのみを取り上げます。 通常のトランザクションに対しては、以下のようにクエリを実行します:
+したがって、このチュートリアルでは通常のトランザクションのみを取り上げます。 通常のトランザクションに対しては、以下のようにクエリを実行します。
```sql
WITH temp_table AS (
@@ -61,33 +58,33 @@ SELECT
FROM temp_table
```
-これにより、Etherscanのトランザクションページで提供されるのと同一の情報が返されます。 これら2つのソースを比較してみましょう:
+これにより、Etherscanのトランザクションページで提供されるのと同一の情報が返されます。 比較のために、2つのソースを以下に示します。
#### Etherscan {#etherscan}

-[Etherscan上のEFのコントラクトのページ](https://etherscan.io/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe)
+[Blockscout上のEFのコントラクトページ。](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe)
#### Dune Analytics {#dune-analytics}

-ダッシュボードは、[こちら](https://duneanalytics.com/paulapivat/Learn-Ethereum)からアクセスしてください。 テーブルをクリックすると、クエリを確認できます(上記も参照してください)。
+ダッシュボードは[こちら](https://dune.com/paulapivat/Learn-Ethereum)にあります。 テーブルをクリックすると、クエリを確認できます(上記も参照してください)。
-### トランザクションの内容を見る {#breaking_down_transactions}
+### トランザクションの内訳 {#breaking_down_transactions}
-送信されたトランザクションには、([ソース](/developers/docs/transactions/))を含むいくつかの情報が含まれています。
+送信されたトランザクションには、以下のようないくつかの情報が含まれています([ソース](/developers/docs/transactions/)):
-- **Recipient**:受信者のアドレス(「to」のクエリに該当したアドレス)。
-- **Signature**:トランザクションに署名するのは送信者の秘密鍵ですが、SQLでクエリできるのは送信者の公開アドレス(「from」)です。
-- **Value**:送信されたETHの量 (`ether`列を参照してください)。
-- **Data**:ハッシュ化した任意のデータ(`data`列を参照してください)。
-- **gasLimit**:トランザクションで消費できるガスユニットの上限。 ガスユニットは、計算ステップを示します。
-- **maxPriorityFeePerGas**:マイナーへのチップとして提供できるガス量の上限。
-- **maxFeePerGas**:トランザクションに対して支払い可能であるガス代の上限(baseFeePerGasとmaxPriorityFeePerGasを含む) 。
+- **受信者**: 受信アドレス(クエリでは「to」)
+- **署名**: 送信者の秘密鍵がトランザクションに署名しますが、SQLでクエリできるのは送信者の公開アドレス(「from」)です。
+- **値**: これは転送されたETHの量です(`ether`の列を参照)。
+- **データ**: ハッシュ化された任意のデータです(`data`列を参照)
+- **ガスリミット** – トランザクションで消費できるガスユニットの最大量。 ガスユニットは、計算ステップを示します
+- **maxPriorityFeePerGas** - マイナーへのチップとして含めることができるガスの最大量
+- **maxFeePerGas** - トランザクションに支払う意思のあるガスの最大額(baseFeePerGasとmaxPriorityFeePerGasを含む)
-イーサリアムファウンデーションのパブリックアドレスへのトランザクションにつき、これらの具体的な情報をクエリしたい場合は以下を実行します:
+イーサリアム財団の公開アドレスへのトランザクションについて、これらの具体的な情報を次のようにクエリできます:
```sql
SELECT
@@ -106,15 +103,15 @@ ORDER BY block_time DESC
### ブロック {#blocks}
-各トランザクションは、イーサリアム仮想マシン([EVM](/developers/docs/evm/))の状態を変更します([ソース](/developers/docs/transactions/))。 トランザクションは、ネットワークにブロードキャストされ、検証を経てブロックに追加されます。 トランザクションごとに、ブロック番号が割り振られます。 データを見るには、特定のブロック番号でクエリすることができます。ブロック番号: 12396854は、執筆時点である2021年11月5日のイーサリアム・ファウンデーション内のトランザクションで最も最新のブロックです。
+各トランザクションは、イーサリアム仮想マシン([EVM](/developers/docs/evm/))の状態を変更します([ソース](/developers/docs/transactions/))。 トランザクションは、ネットワークにブロードキャストされ、検証を経てブロックに追加されます。 各トランザクションには、ブロック番号が関連付けられています。 データを見るには、特定のブロック番号でクエリすることができます。ブロック番号: 12396854は、執筆時点(2021/11/5)でイーサリアム財団のトランザクションの中で最も新しいブロックです。
さらに、次の2つのブロックに対してクエリを実行すると、各ブロックが1つ前のブロックのハッシュ(親ハッシュ)を含んでいることが確認でき、ブロックチェーンがどのように形成されるかを理解できます。
-各ブロックには、親ブロックに対する参照情報が含まれています。 これは、`hash`列と`parent_hash`列の間に表示されます([ソース](/developers/docs/blocks/))。
+各ブロックには、親ブロックへの参照が含まれています。 これは、以下の`hash`列と`parent_hash`列の間に示されます([ソース](/developers/docs/blocks/)):

-Dune Analyticsでは、[クエリ](https://duneanalytics.com/queries/44856/88292)は以下のように表示されます:
+Dune Analyticsでの[クエリ](https://dune.com/queries/44856/88292)はこちらです:
```sql
SELECT
@@ -128,18 +125,18 @@ WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856
LIMIT 10
```
-ブロックを調べるには、時間、ブロック番号、難易度、ハッシュ、親ハッシュ、およびノンスに対してクエリを実行します。
+時間、ブロック番号、難易度、ハッシュ、親ハッシュ、およびノンスをクエリすることでブロックを調べることができます。
-このクエリでは、_トランザクションのリスト_だけは調べることができません。このためトランザクションのリストについては、_state root_を使って後述する別のクエリを実行します。 フルノードまたはアーカイブノードは、すべてのトランザクションと状態遷移を保存しますので、クライアントはいつでもチェーンの状態をクエリすることができます。 これには大容量のストレージが必要になりますので、チェーンデータと状態データを分離することができます:
+このクエリがカバーしていないのは、_トランザクションのリスト_と_ステート・ルート_のみで、これらには以下の別のクエリが必要です。 フルノードまたはアーカイブノードは、すべてのトランザクションと状態遷移を保存しますので、クライアントはいつでもチェーンの状態をクエリすることができます。 これには大容量のストレージが必要になりますので、チェーンデータと状態データを分離することができます:
- チェーンデータ(ブロックおよびトランザクションのリスト)
- 状態データ(各トランザクションによる状態遷移の結果)
-状態ルートは後者(状態データ)であり、_暗黙的な_データである(オンチェーンで保存されない)のに対し、チェーンデータは明示的なデータであり、チェーン自体に保存されます([ソース](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored))。
+ステート・ルートは後者に分類され_暗黙的_なデータ(オンチェーンで保存されない)ですが、チェーンデータは明示的であり、チェーン自体に保存されます([ソース](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored))。
-このチュートリアルでは、Dune Analyticsを使ってSQLで_クエリ可能_であるオンチェーンのデータを取り上げます。
+このチュートリアルでは、Dune Analyticsを使ってSQLでクエリ_できる_オンチェーンのデータに焦点を当てます。
-すでに述べたように、各ブロックにはトランザクションのリストが含まれているので、特定のブロックに絞り込んでクエリを実行できます。 さっそく、最新ブロック「12396854」を試してみましょう。
+すでに述べたように、各ブロックにはトランザクションのリストが含まれているので、特定のブロックに絞り込んでクエリを実行できます。 最新ブロック「12396854」を試してみましょう:
```sql
SELECT * FROM ethereum."transactions"
@@ -147,13 +144,13 @@ WHERE block_number = 12396854
ORDER BY block_time DESC`
```
-Duneでは、このようなSQL出力が得られます:
+DuneでのSQL出力はこちらです:

-ブロックチェーンにこの1つのブロックが追加されると、イーサリアム仮想マシン ([EVM](/developers/docs/evm/))の状態が変化します。 ブロックチェーンでは、一度に数十、時には数百ものトランザクションが検証されます。 このブロックの場合、222件のトランザクションが含まれていました。
+この1つのブロックがチェーンに追加されると、イーサリアム仮想マシン([EVM](/developers/docs/evm/))の状態が変化します。 一度に数十、時には数百ものトランザクションが検証されます。 このブロックの場合、222件のトランザクションが含まれていました。
-実際にトランザクションが成功した件数を調べるには、成功したトランザクションのみを絞り込むフィルターを追加します:
+実際に成功した件数を調べるには、成功したトランザクションをカウントするフィルターを追加します。
```sql
WITH temp_table AS (
@@ -166,26 +163,26 @@ SELECT
FROM temp_table
```
-ブロック12396854では、計222件のトランザクションのうち、204件が正常に検証されました:
+ブロック12396854では、計222件のトランザクションのうち、204件が正常に検証されました:

-トランザクションリクエストは、毎秒あたり数十回発生しますが、ブロックがコミットされるのはおよそ15秒に1回です([ソース](/developers/docs/blocks/))。
+トランザクションリクエストは毎秒数十回発生しますが、ブロックがコミットされるのはおよそ15秒に1回です([ソース](/developers/docs/blocks/))。
-約15秒ごとに1つのブロックが生成されることを確認するには、1日に含まれる合計の秒数(86,400秒)を15で割ることで、1日に生成される平均ブロック数(およそ5,760)が分かります。
+約15秒ごとに1つのブロックが生成されることを確認するには、1日に含まれる合計の秒数(86400秒)を15で割ることで、1日に生成される平均ブロック数(およそ5760)が分かります。
-2016年から現在までに、イーサリアムで生成された1日あたりのブロック数については、この表を参照してください:
+イーサリアムで1日あたりに生成されたブロック数(2016年〜現在)のグラフはこちらです:

-この期間に毎日生成されたブロックの平均数は、約5,874 です。
+この期間に毎日生成されたブロックの平均数は約5,874です:

-クエリは、次のように行います:
+クエリは、次のように行います。
```sql
-# query to visualize number of blocks produced daily since 2016
+# 2016年以降に毎日生成されたブロック数を可視化するクエリ
SELECT
DATE_TRUNC('day', time) AS dt,
@@ -194,7 +191,7 @@ FROM ethereum."blocks"
GROUP BY dt
OFFSET 1
-# average number of blocks produced per day
+# 1日あたりの平均ブロック生成数
WITH temp_table AS (
SELECT
@@ -209,13 +206,13 @@ SELECT
FROM temp_table
```
-2016年から現在までに1日に生成されたブロック数の平均は、5,874をわずかに上回っています。 反対に、86,400秒を平均ブロック数である5,874で割ると14.7となるため、およそ15秒に1回の頻度でブロックが生成されたことが分かります。
+2016年から現在までに1日に生成されたブロック数の平均は、この数字をわずかに上回る5,874です。 あるいは、86,400秒を平均ブロック数5,874で割ると14.7秒となり、およそ15秒に1つのブロックが生成されていることになります。
### ガス {#gas}
-ブロックのサイズは、制限されています。 ブロックの最大サイズは、ネットワーク需要に応じて12,500,000ユニットから25,000,000ユニットの間で動的に変化します。 ブロックのサイズを制限する理由は、フルノードに対してディスク容量や処理速度の要件([ソース](/developers/docs/blocks/))が過剰な負担となるのを防ぐために、無駄に大きなサイズのブロックが発生することを防ぐためです。
+ブロックのサイズは制限されています。 ブロックの最大サイズは動的で、ネットワーク需要に応じて12,500,000から25,000,000ユニットの間で変動します。 ブロックサイズが任意に大きくなることで、フルノードのディスクスペースや処理速度に負荷がかかることを防ぐため、制限が必要となります([ソース](/developers/docs/blocks/))。
-ブロックに対するガス上限という概念を理解するには、トランザクションをバッチ処理するために利用できるブロックのスペースをどれだけ**供給**できるか、と考えるとよいでしょう。 ブロックのガス上限に対してもクエリを実行できるので、2016年から現在までのグラフは以下のようになります:
+ブロックのガスリミットを理解する一つの方法として、トランザクションをバッチ処理するために利用できるブロックスペースの**供給**量と考えることができます。 ブロックのガスリミットは、クエリを実行して2016年から現在までを可視化できます:

@@ -228,7 +225,7 @@ GROUP BY dt
OFFSET 1
```
-さらに、イーサリアム・ブロックチェーン上で実行された処理(トランザクションの送信、スマートコントラクトの呼び出し、NFTのミント)のために実際に支払われた1日あたりのガスを調べることもできます。 これは、利用可能なイーサリアムのブロックスペースに対する**需要**を示します:
+そして、イーサリアムチェーン上での計算(トランザクションの送信、スマートコントラクトの呼び出し、NFTのミントなど)の支払いに毎日使用される実際のガスがあります。 これは、利用可能なイーサリアムのブロックスペースに対する**需要**です:

@@ -241,17 +238,17 @@ GROUP BY dt
OFFSET 1
```
-これら2つのグラフを比較することで、 **需要と供給**の関係を確認することができます:
+また、これら2つのグラフを並べて比較することで、**需要と供給**がどのように一致するかを確認できます。

-ここから、ブロックスペースが十分に供給されている場合、ガス価格はブロックスペースへの需要に応じて上下することが分かります。
+したがって、利用可能な供給量を前提として、ガス価格はイーサリアムのブロックスペースへの需要の関数として理解できます。
-最後に、イーサリアムチェーンにおける1日のガス価格の平均値を調べたい場合、クエリ時間が非常に長くなるため、イーサリアム・ファウンデーションがトランザクション1件あたりに支払ったガス代の平均値を調べるようにクエリを絞り込みます。
+最後に、イーサリアムチェーンの1日あたりの平均ガス価格をクエリすることもできますが、クエリ時間が非常に長くなるため、イーサリアム財団によってトランザクションごとに支払われた平均ガス量にクエリを絞り込みます。

-2016年から現在までに、イーサリアム・ファウンデーションのアドレスに対して実行されたすべてのトランザクションにおいて支払われたガス価格を確認することができます。 クエリは、以下のように実行します:
+長年にわたるイーサリアム財団のアドレスへのすべてのトランザクションで支払われたガス価格を見ることができます。 クエリは、次のとおりです。
```sql
SELECT
@@ -265,8 +262,8 @@ ORDER BY block_time DESC
### まとめ {#summary}
-このチュートリアルでは、クエリを実行し、オンチェーンのデータを確認することで、イーサリアムの基本的な概念やイーサリアム・ブロックチェーンの仕組みについて学びました。
+このチュートリアルでは、オンチェーンのデータをクエリして理解することで、イーサリアムの基本的な概念とイーサリアムブロックチェーンの仕組みを理解します。
-このチュートリアルで使用したすべてのコードをまとめたダッシュボードは、[こちら](https://duneanalytics.com/paulapivat/Learn-Ethereum)からアクセスしてください。
+このチュートリアルで使用されたすべてのコードを含むダッシュボードは[こちら](https://dune.com/paulapivat/Learn-Ethereum)にあります。
-データを通じてWeb3の知識をさらに深めたい方は、[私をTwitterでフォローしてください](https://twitter.com/paulapivat)。
+データを使ってWeb3をさらに探求したい方は、[Twitterで私を見つけてください](https://twitter.com/paulapivat)。
diff --git a/public/content/translations/ja/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/ja/developers/tutorials/logging-events-smart-contracts/index.md
index adb43255f91..1cbe7a7cec9 100644
--- a/public/content/translations/ja/developers/tutorials/logging-events-smart-contracts/index.md
+++ b/public/content/translations/ja/developers/tutorials/logging-events-smart-contracts/index.md
@@ -1,12 +1,8 @@
---
-title: イベントを使用して、スマートコントラクトのデータをログに記録する
-description: スマートコントラクトにおけるイベントを紹介し、データのログを取るためにイベントを使用する方法を学ぶ
+title: "イベントを使用して、スマートコントラクトのデータをログに記録する"
+description: "スマートコントラクトにおけるイベントを紹介し、データのログを取るためにイベントを使用する方法を学ぶ"
author: "jdourlens"
-tags:
- - "スマートコントラクト"
- - "Remix"
- - "Solidity"
- - "イベント"
+tags: [ "スマートコントラクト", "Remix", "Solidity", "イベント" ]
skill: intermediate
lang: ja
published: 2020-04-03
@@ -15,7 +11,7 @@ sourceUrl: https://ethereumdev.io/logging-data-with-events/
address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
---
-Solidityでは、スマートコントラクトがトリガーすることで送信される信号を[イベント](/developers/docs/smart-contracts/anatomy/#events-and-logs)と呼びます。 Dappだけでなく、イーサリアムのJSON-RPC APIに接続されたすべてのプログラムは、これらのイベントをリッスンし、それに応じて動作します。 イベントをインデックス化すれば、後でイベント履歴を参照することができます。
+Solidityでは、[イベント](/developers/docs/smart-contracts/anatomy/#events-and-logs)はスマートコントラクトが発行できるディスパッチされたシグナルです。 Dapps、またはイーサリアムのJSON-RPC APIに接続されたあらゆるものは、これらのイベントをリッスンして、それに応じて動作することができます。 イベントにインデックスを付けることで、後でイベント履歴を検索できるようになります。
## イベント {#events}
@@ -25,9 +21,9 @@ Solidityでは、スマートコントラクトがトリガーすることで送
event Transfer(address indexed from, address indexed to, uint256 value);
```
-イベントの署名はコントラクトのコード内で宣言され、emitキーワードと共に発行されます。 例えば、送信イベントでは、この送信における送信元(_from_)、送信先(_to_)、および送信したトークン量(_value_)のログが記録されます。
+イベントの署名はコントラクトのコード内で宣言され、emitキーワードと共に発行されます。 例えば、転送イベントでは、この転送における送信元(_from_)、送信先(_to_)、および送信したトークン量(_value_)のログが記録されます。
-Counterのスマートコントラクトに戻り、値が変更されるたびにログを取ることにしたと仮定しましょう。 このコントラクトは、デプロイを目的とせず、別のコントラクトを拡張する土台の役割を担うため、抽象コントラクトと呼びます。 カウンターのスマートコントラクトでは、以下のようになります:
+Counterスマートコントラクトに戻り、値が変更されるたびにログを記録することにしたと仮定しましょう。 このコントラクトは、デプロイを目的とせず、別のコントラクトを拡張する土台の役割を担うため、抽象コントラクトと呼びます。 カウンターの例では、このようになります:
```solidity
pragma solidity 0.5.17;
@@ -36,16 +32,16 @@ contract Counter {
event ValueChanged(uint oldValue, uint256 newValue);
- // Private variable of type unsigned int to keep the number of counts
+ // カウント数を保持するための符号なし整数のプライベート変数
uint256 private count = 0;
- // Function that increments our counter
+ // カウンターをインクリメントする関数
function increment() public {
count += 1;
emit ValueChanged(count - 1, count);
}
- // Getter to get the count value
+ // カウント値を取得するためのゲッター
function getCount() public view returns (uint256) {
return count;
}
@@ -53,11 +49,11 @@ contract Counter {
}
```
-注意:
+注意:
-- **5行目**:イベントを宣言し、イベントに含まれる古い値と新しい値を宣言します。
+- **5行目**: イベントと、それに含まれる古い値および新しい値を宣言します。
-- **13行目**:カウントの変数が1増えるごとに、イベントが発行されます。
+- **13行目**: count変数をインクリメントするときに、イベントを発行します。
このコントラクトをデプロイしてインクリメント関数を呼び出し、ログという名前の配列にある新しいトランザクションをクリックすると、Remixが自動的にこのイベントを表示します。
diff --git a/public/content/translations/ja/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/ja/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md
index cfb8d93b96c..b68f2080b81 100644
--- a/public/content/translations/ja/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md
+++ b/public/content/translations/ja/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md
@@ -1,9 +1,8 @@
---
-title: オフラインデータの完全性のためのマークルプルーフ
-description: オフチェーンに大部分が保存されているデータに対し、オンチェーンでのデータの完全性の確保
+title: "オフラインデータの完全性のためのマークルプルーフ"
+description: "オフチェーンに大部分が保存されているデータに対し、オンチェーンでのデータの完全性の確保"
author: Ori Pomerantz
-tags:
- - "ストレージ"
+tags: [ "ストレージ" ]
skill: advanced
lang: ja
published: 2021-12-30
@@ -13,29 +12,31 @@ published: 2021-12-30
すべてのデータは、イーサリアムストレージに保存することが理想的です。このストレージは、数千ものコンピューターに保存され、非常に高い可用性(データは検閲されない)と完全性(データは不正に変更されない)を備えていますが、32バイトワードを保存するのに通常2万ガスがかかります。 執筆時点で、そのコストは$6.60に相当します。 1バイトごとに21セントかかるため、多くの用途には高すぎます。
-この問題を解決するために、イーサリアムのエコシステムでは[データを保存する多くの分散型の方法](/developers/docs/storage/)が開発されました。 通常、これらは可用性と価格のトレードオフを伴います。 しかしながら、一般に完全性は保証されます。
+この問題を解決するために、イーサリアムのエコシステムはデータを分散型の
+方法で保存するための多くの代替手段を開発しました。 通常、これらは可用性と価格のトレードオフを伴います。 しかしながら、一般に完全性は保証されます。
-この記事では、ブロックチェーンにデータを保存することなくデータ完全性を確保する**方法**として[マークルプルーフ](https://computersciencewiki.org/index.php/Merkle_proof)を使用する方法を学びます。
+この記事では、[マークルプルーフ](https://computersciencewiki.org/index.php/Merkle_proof)を使用して、
+ブロックチェーンにデータを保存せずにデータの完全性を確保する**方法**を学びます。
## 仕組み {#how-does-it-work}
-理論上、チェーン上にデータのハッシュだけを保存し、トランザクション内で必要なすべてのデータを送信することができます。 しかし、これでもまだ高すぎます。 1バイトのデータのトランザクションのコストは約16ガスで、現時点では0.5セントです。つまり、1キロバイトあたり約 $5になります。 1メガバイトでは $5000になり、データをハッシュ化するコストを差し引いても、多くの用途にはまだ高すぎます。
+理論上は、データのハッシュのみをオンチェーンに保存し、それを必要とするトランザクションですべてのデータを送信できます。 しかし、これでもまだ高すぎます。 1バイトのデータのトランザクションのコストは約16ガスで、現時点では0.5セントです。つまり、1キロバイトあたり約 $5になります。 1メガバイトでは $5000になり、データをハッシュ化するコストを差し引いても、多くの用途にはまだ高すぎます。
これを解決するには、異なるデータのサブセットを繰り返しハッシュ化します。そうすることで、データを送信する必要が無い場合は、ハッシュを送信するだけで済むようになります。 これを行うには、次のようなマークルツリーを使用します。このツリーは、それぞれのノードがその下のノードのハッシュとなるデータ構造を持ちます。

-チェーン上に保存する必要があるのは、ルートハッシュのみとなります。 特定の値を証明するには、ルートのハッシュを得るために、その値と結合させる必要があるハッシュをすべて提供します。 例えば、`C`を証明するには、`D`、`H(A-B)`、`H(E-H)`を提供します。
+オンチェーンに保存する必要があるのはルートハッシュのみです。 特定の値を証明するには、ルートのハッシュを得るために、その値と結合させる必要があるハッシュをすべて提供します。 例えば、`C`を証明するには、`D`、`H(A-B)`、`H(E-H)`を提供します。

## 実装 {#implementation}
-[サンプルコードはこちらで入手できます](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity)。
+[サンプルコードはこちらで提供されています](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity)。
-### オフチェーンコード {#off-chain-code}
+### オフチェーンコード {#offchain-code}
-この記事では、オフチェーン計算にJavaScriptを使用します。 ほとんどの分散型アプリケーションには、JavaScriptのオフチェーンコンポーネントがあります。
+この記事では、オフチェーンの計算にJavaScriptを使用します。 ほとんどの分散型アプリケーションには、JavaScriptのオフチェーンコンポーネントがあります。
#### マークルルートの作成 {#creating-the-merkle-root}
@@ -48,58 +49,60 @@ const ethers = require("ethers")
[ethersパッケージのハッシュ関数を使用します](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256)。
```javascript
-// The raw data whose integrity we have to verify. The first two bytes a
-// are a user identifier, and the last two bytes the amount of tokens the
-// user owns at present.
+// 完全性を検証する必要がある生データです。最初の2バイトは
+// ユーザー識別子、最後の2バイトはユーザーが
+// 現在所有しているトークンの量です。
const dataArray = [
0x0bad0010, 0x60a70020, 0xbeef0030, 0xdead0040, 0xca110050, 0x0e660060,
0xface0070, 0xbad00080, 0x060d0091,
]
```
-各エントリを単一の256ビット整数にエンコードすると、JSONを使用した場合などよりも読みにくいコードになります。 しかし、これによりコントラクト内のデータを取得するための処理量が大幅に削減され、ガス代も大幅に削減されます。 [チェーン上でJSONを読み取ることができますが](https://github.com/chrisdotn/jsmnSol)、回避できるのであれば避けるべきです。
+各エントリを単一の256ビット整数にエンコードすると、JSONを使用した場合などよりも読みにくいコードになります。 しかし、これによりコントラクト内のデータを取得するための処理量が大幅に削減され、ガス代も大幅に削減されます。 [オンチェーンでJSONを読み込むことはできますが](https://github.com/chrisdotn/jsmnSol)、回避できるのであれば良いアイデアではありません。
```javascript
-// The array of hash values, as BigInts
+// BigIntとしてのハッシュ値の配列
const hashArray = dataArray
```
ここでは、256ビット値のデータで始めるので、処理は必要ありません。 文字列型のようなより複雑なデータ構造を使用する場合は、まずデータをハッシュ化してハッシュ配列を取得する必要があります。 これは、ユーザーが他のユーザーの情報を知っていても知らなくても構わないことを前提にしているためでもあります。 さもなければ、ユーザー1がユーザー0の値がわからないように、ユーザー2がユーザー3の値がわからないように、というようなハッシュ化をしなければならなくなります。
```javascript
-// Convert between the string the hash function expects and the
-// BigInt we use everywhere else.
+// ハッシュ関数が期待する文字列と
+// 他の場所で使用するBigIntを相互に変換します。
const hash = (x) =>
BigInt(ethers.utils.keccak256("0x" + x.toString(16).padStart(64, 0)))
```
-ethersのハッシュ関数は、`0x60A7`などの16進数のJavaScript文字列を受け取ることを想定しており、同じ構造の別の文字列で応答します。 ただし、コードの他の部分では、`BigInt`を使う方が簡単なため、16進数文字列に変換してから、もう一度`BigInt`に戻します。
+ethersのハッシュ関数は、`0x60A7`などの16進数のJavaScript文字列を受け取ることを想定しており、同じ構造の別の文字列で応答します。 ただし、コードの残りの部分では`BigInt`を使用する方が簡単なので、16進数の文字列に変換して、また元に戻します。
```javascript
-// ペアの対称ハッシュのため、順序が逆でも構いません。
+// 順序が逆でも気にしなくていいように、ペアを対称的にハッシュ化します。
const pairHash = (a, b) => hash(hash(a) ^ hash(b))
```
-この関数は対称(a [xor](https://en.wikipedia.org/wiki/Exclusive_or) bのハッシュ)です。 そのため、マークルプルーフを確認するときに、計算された値の前と後のどちらにプルーフの値を配置すべきかについて考慮する必要はありません。 マークルプルーフの確認はオンチェーンで行われるので、必要な処理が少ないほど良いとされます。
+この関数は対称的です(a [xor](https://en.wikipedia.org/wiki/Exclusive_or) b のハッシュ)。 そのため、マークルプルーフを確認するときに、計算された値の前と後のどちらにプルーフの値を配置すべきかについて考慮する必要はありません。 マークルプルーフの確認はオンチェーンで行われるので、必要な処理が少ないほど良いとされます。
-警告: 暗号技術は見た目以上に難解です。 この記事の最初のバージョンでは、ハッシュ関数`hash(a^b)`を使用していました。 これは、**好ましくない**手法でした。`a`と`b`の正しい値を知っていれば、`b' = a^b^a'`を使用して目的の`a'`の値を証明できるからです。 この関数では、`hash(a') ^ hash(b')`が既知の値(ルートに向かう経路上の隣のブランチ)と等しくなるように`b'`を計算する必要があり、これは非常に困難です。
+警告: 暗号技術は見た目以上に難解です。
+この記事の初版では、ハッシュ関数`hash(a^b)`を使用していました。
+これは**悪い**アイデアでした。なぜなら、`a`と`b`の正当な値を知っていれば、`b' = a^b^a'`を使って任意の`a'`の値を証明できてしまうからです。
+この関数では、`hash(a') ^ hash(b')`が既知の値(ルートに向かう途中の次のブランチ)と等しくなるように`b'`を計算する必要があり、これははるかに困難です。
```javascript
-// The value to denote that a certain branch is empty, doesn't
-// have a value
+// あるブランチが空で、値を
+// 持たないことを示すための値です。
const empty = 0n
```
値の数が2の整数乗ではない時は、空のブランチを処理する必要があります。 このプログラムでは、ゼロをプレースホルダーとして配置する方法を使っています。
-
+
```javascript
-// Calculate one level up the tree of a hash array by taking the hash of
-// each pair in sequence
+// 各ペアを順番にハッシュ化することで、ハッシュ配列のツリーを1レベル上に計算します。
const oneLevelUp = (inputArray) => {
var result = []
- var inp = [...inputArray] // To avoid over writing the input // Add an empty value if necessary (we need all the leaves to be // paired)
+ var inp = [...inputArray] // 入力の上書きを避けるため // 必要であれば空の値を追加します (すべてのリーフが // ペアになるようにする必要があります)
if (inp.length % 2 === 1) inp.push(empty)
@@ -110,13 +113,13 @@ const oneLevelUp = (inputArray) => {
} // oneLevelUp
```
-この関数は、現在のレイヤーで値のペアをハッシュ化すると、マークルツリーを1レベル「登り」ます。 これは効率性を追求した実装ではないことに留意してください。入力のコピーを避け、ループ内で適切なタイミングで単に`hashEmpty`を加えることもできますが、このコードは読みやすさを重視して最適化されています。
+この関数は、現在のレイヤーで値のペアをハッシュ化すると、マークルツリーを1レベル「登り」ます。 これは最も効率的な実装ではないことに注意してください。入力のコピーを避け、ループ内で適切なときに`hashEmpty`を追加することもできましたが、このコードは読みやすさを重視して最適化されています。
```javascript
const getMerkleRoot = (inputArray) => {
var result
- result = [...inputArray] // Climb up the tree until there is only one value, that is the // root. // // If a layer has an odd number of entries the // code in oneLevelUp adds an empty value, so if we have, for example, // 10 leaves we'll have 5 branches in the second layer, 3 // branches in the third, 2 in the fourth and the root is the fifth
+ result = [...inputArray] // 値が1つだけになるまでツリーを登ります。それが // ルートです。 // // レイヤーのエントリ数が奇数の場合、 // oneLevelUpのコードが空の値を追加するため、例えば、 // 10個のリーフがあれば、第2レイヤーには5個のブランチ、 // 第3レイヤーには3個のブランチ、第4レイヤーには2個、そしてルートが5番目になります。
while (result.length > 1) result = oneLevelUp(result)
@@ -131,30 +134,30 @@ const getMerkleRoot = (inputArray) => {
マークルプルーフは、マークルルートを得るために、証明される値と一緒にハッシュ化する値です。 証明する値は、他のデータから入手することが多いため、コードの一部としてではなく、別に提供することをお勧めします。
```javascript
-// A merkle proof consists of the value of the list of entries to
-// hash with. Because we use a symmetrical hash function, we don't
-// need the item's location to verify the proof, only to create it
+// マークルプルーフは、一緒にハッシュ化するエントリのリストの値で
+// 構成されます。対称的なハッシュ関数を使用しているため、プルーフの検証に
+// アイテムの位置は不要で、作成時にのみ必要です。
const getMerkleProof = (inputArray, n) => {
var result = [], currentLayer = [...inputArray], currentN = n
- // Until we reach the top
+ // トップに到達するまで
while (currentLayer.length > 1) {
- // No odd length layers
+ // レイヤーの長さが奇数にならないようにする
if (currentLayer.length % 2)
currentLayer.push(empty)
result.push(currentN % 2
- // If currentN is odd, add with the value before it to the proof
+ // currentNが奇数の場合、その前の値をプルーフに追加します
? currentLayer[currentN-1]
- // If it is even, add the value after it
+ // 偶数の場合、その後の値を追加します
: currentLayer[currentN+1])
```
-ハッシュ化は、`(v[0],v[1])`、`(v[2],v[3])`のように行っていきます。 したがって、偶数の値の場合はその次の値、基数の値の場合は1つ前の値が必要です。
+`(v[0],v[1])`、`(v[2],v[3])`などをハッシュ化します。 したがって、偶数の値の場合はその次の値、基数の値の場合は1つ前の値が必要です。
```javascript
- // Move to the next layer up
+ // 上のレイヤーに移動します
currentN = Math.floor(currentN/2)
currentLayer = oneLevelUp(currentLayer)
} // while currentLayer.length > 1
@@ -163,9 +166,9 @@ const getMerkleProof = (inputArray, n) => {
} // getMerkleProof
```
-### オンチェーンコード {#on-chain-code}
+### オンチェーンコード {#onchain-code}
-最後は、証明を確認するコードです。 オンチェーンコードは、[Solidity](https://docs.soliditylang.org/en/v0.8.11/)で書かれています。 ガス代が比較的高価なため、ここでは最適化がかなり重要になります。
+最後は、証明を確認するコードです。 オンチェーンコードは[Solidity](https://docs.soliditylang.org/en/v0.8.11/)で記述されています。 ガス代が比較的高価なため、ここでは最適化がかなり重要になります。
```solidity
//SPDX-License-Identifier: Public Domain
@@ -174,7 +177,7 @@ pragma solidity ^0.8.0;
import "hardhat/console.sol";
```
-コードの作成には、[Hardhat開発環境](https://hardhat.org/)を使用しました。この環境では、開発している間も[Solidityからコンソール出力](https://hardhat.org/docs/cookbook/debug-logs)を得ることができます。
+これは[Hardhat開発環境](https://hardhat.org/)を使用して作成しました。これにより、開発中に[Solidityからのコンソール出力](https://hardhat.org/docs/cookbook/debug-logs)が可能になります。
```solidity
@@ -185,15 +188,15 @@ contract MerkleProof {
return merkleRoot;
}
- // Extremely insecure, in production code access to
- // this function MUST BE strictly limited, probably to an
- // owner
+ // 非常に安全性が低い。本番コードでは、この関数への
+ // アクセスを、おそらくオーナーに
+ // 限定するなど、厳しく制限する必要があります。
function setRoot(uint _merkleRoot) external {
merkleRoot = _merkleRoot;
} // setRoot
```
-マークルルート用のset関数とget関数が書かれています。 プロダクションシステムにおいて、誰でもマークルルートを更新できるようにすることは、_非常に好ましくない手法_です。 ここでは、サンプルコードをシンプルにするために、あえて行っています。 **データの完全性が重要なシステムでは、行わないでください**。
+マークルルート用のset関数とget関数が書かれています。 本番システムで誰でもマークルルートを更新できるようにすることは、_極めて悪いアイデア_です。 ここでは、サンプルコードをシンプルにするために、あえて行っています。 **データの完全性が実際に重要となるシステムでは、これを行わないでください**。
```solidity
function hash(uint _a) internal pure returns(uint) {
@@ -205,12 +208,12 @@ contract MerkleProof {
}
```
-この関数は、ペアのハッシュを生成します。 JavaScripコードの`hash`と`pairHash`をSolidityコードに変換したものです。
+この関数は、ペアのハッシュを生成します。 これは、`hash`と`pairHash`のJavaScriptコードをSolidityに変換したものです。
-**注:** これも読みやすさを重視して最適化されています。 [関数定義](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm)によると、データを[`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays)の値として保存することで、変換を回避できる場合があります。
+**注:**これも読みやすさを優先して最適化された例です。 [関数の定義](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm)に基づけば、データを[`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays)値として保存し、変換を回避できる可能性があります。
```solidity
- // Verify a Merkle proof
+ // マークルプルーフを検証します
function verifyProof(uint _value, uint[] calldata _proof)
public view returns (bool) {
uint temp = _value;
@@ -226,16 +229,18 @@ contract MerkleProof {
} // MarkleProof
```
-数学的表記では、マークルプルーフの検証は次のようになります。 `H(proof_n, H(proof_n-1, H(proof_n-2, .. H(proof_1, H(proof_0, value))...)))`. これをこのコードで実装しています。
+数学的記法では、マークルプルーフの検証は次のようになります: `H(proof_n, H(proof_n-1, H(proof_n-2, ...` `H(proof_1, H(proof_0, value))...)))`。 これをこのコードで実装しています。
-## マークルプルーフとロールアップを混在させない {#merkle-proofs-and-rollups}
+## マークルプルーフとロールアップの相性 {#merkle-proofs-and-rollups}
-マークルプルーフは、[ロールアップ](/developers/docs/scaling/#rollups)では、うまく機能しません。 ロールアップでは、すべてのトランザクションデータはL1(レイヤー1)に書き込まれ、処理はL2(レイヤー2)で行われるためです。 マークルプルーフをトランザクションで送信するのにかかるコストは、1レイヤーあたり平均638ガスです(現在のコールデータ1バイトは、ゼロでなければ16ガス、ゼロであれば4ガスかかります)。 1024ワードのデータがある場合、マークルプルーフには10レイヤー、つまり合計で6380ガスが必要になります。
+マークルプルーフは[ロールアップ](/developers/docs/scaling/#rollups)とうまく機能しません。 ロールアップでは、すべてのトランザクションデータはL1(レイヤー1)に書き込まれ、処理はL2(レイヤー2)で行われるためです。 マークルプルーフをトランザクションで送信するのにかかるコストは、1レイヤーあたり平均638ガスです(現在のコールデータ1バイトは、ゼロでなければ16ガス、ゼロであれば4ガスかかります)。 1024ワードのデータがある場合、マークルプルーフには10レイヤー、つまり合計で6380ガスが必要になります。
-[Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m)の例を見ると、L1への書き込みには約100gweiのガス代がかかり、L2では0.001gweiのガス代がかかります(これは通常の価格であり、混雑とともに上昇する可能性があります) 。 したがって、L1の1回分のガス代で、L2では10万ガスを処理に使えることになります。 ストレージを上書きしないと仮定すると、L1の1回のガス代でL2のストレージに約5ワード書き込めるということになります。 単一のマークルプルーフの場合、1024ワードすべてをストレージに書き込むことができ(トランザクションで提供されるのではなく、最初からチェーン上で計算できると仮定した場合)、依然としてほとんどのガスが残ります。
+例えば[Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m)を見ると、L1への書き込みのガス代は約100 gwei、L2のガス代は0.001 gweiです(これは通常の価格で、混雑状況によって上昇する可能性があります)。 したがって、L1の1回分のガス代で、L2では10万ガスを処理に使えることになります。 ストレージを上書きしないと仮定すると、L1の1回のガス代でL2のストレージに約5ワード書き込めるということになります。 単一のマークルプルーフの場合、(トランザクションで提供されるのではなく、最初からオンチェーンで計算できると仮定して)1024ワードすべてをストレージに書き込んでも、まだガスのほとんどが残ります。
-## まとめ {#conclusion}
+## 結論 {#conclusion}
実際に、マークルツリーを自身で実装することはないかもしれません。 よく知られている監査済みのライブラリを使用できるため、基本的には独自の暗号論的プリミティブを実装しないことをお勧めします。 しかし、マークルプルーフをよく理解し、使いどころを判断できるようになっていただければと思います。
-マークルプルーフは、_完全性_を保持しますが、_可用性_は保持しないことに注意してください。 データストレージにアクセスを拒否され、データストレージにアクセスするためのマークルツリーを構築することもできない場合でも、誰も自分の資産を奪うことはできないということを知っていると、ささやかな慰めとなります。 この特性により、マークルツリーは、IPFSなどの分散型ストレージで最もよく使用されています。
+マークルプルーフは_完全性_を維持しますが、_可用性_は維持しないことに注意してください。 データストレージにアクセスを拒否され、データストレージにアクセスするためのマークルツリーを構築することもできない場合でも、誰も自分の資産を奪うことはできないということを知っていると、ささやかな慰めとなります。 この特性により、マークルツリーは、IPFSなどの分散型ストレージで最もよく使用されています。
+
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
diff --git a/public/content/translations/ja/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md b/public/content/translations/ja/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md
index b279859cd9e..3e1a62a595b 100644
--- a/public/content/translations/ja/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md
+++ b/public/content/translations/ja/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md
@@ -1,41 +1,40 @@
---
-title: InfluxDBとGrafanaを使って、Gethを監視する
-description:
+title: "InfluxDBとGrafanaを使ったGethの監視"
+description: "InfluxDBとGrafanaを使用してGethノードの監視を設定し、パフォーマンスを追跡して問題を特定します。"
author: "Mario Havel"
-tags:
- - "クライアント"
- - "ノード"
+tags: [ "クライアント", "ノード" ]
skill: intermediate
lang: ja
published: 2021-01-13
---
-このチュートリアルでは、Gethノードのモニタリングを設定する方法について説明します。これにより、モニタリングのパフォーマンスについて理解を深め、どのような問題が発生しうるかを理解することができます。
+このチュートリアルでは、Gethノードの監視を設定することで、パフォーマンスをよりよく理解し、潜在的な問題を特定する方法を説明します。
-## 事前に必要な環境 {#prerequisites}
+## 前提条件 {#prerequisites}
-- Gethのインスタンスを実行していること。
-- 大部分の作業ステップ/具体例はLinuxを用いていますので、基本的なターミナルの知識が必要でしょう。
-- Gethにおける一連のモニタリング指標については、以下の動画を参考にしてください:[イーサリアムのインフラをモニタリングする(Péter Szilágyi)](https://www.youtube.com/watch?v=cOBab8IJMYI)。
+- Gethのインスタンスがすでに実行されている必要があります。
+- 手順と例のほとんどはLinux環境向けであり、ターミナルの基本的な知識があると役立ちます。
+- Gethの一連のメトリクスの概要については、こちらの動画をご覧ください: [Péter Szilágyi氏によるイーサリアムインフラストラクチャの監視](https://www.youtube.com/watch?v=cOBab8IJMYI)。
-## モニタリング用のスタック {#monitoring-stack}
+## 監視スタック {#monitoring-stack}
-イーサリアムのクライアントは、時系列データベースの形式で読み取り可能な多くのデータを収集します。 このデータをデータ可視化ソフトウェアにフィードすることで、モニタリング作業を容易にすることができます。 利用できるデータ可視化ソフトウェアには、以下があります:
+イーサリアムクライアントは、時系列データベースの形式で読み取り可能な多くのデータを収集します。 監視を容易にするため、このデータをデータ可視化ソフトウェアに入力することができます。 利用可能なオプションは複数あります:
-- [Prometheus](https://prometheus.io/) (プル型)
-- [InfluxDB](https://www.influxdata.com/get-influxdb/)(プッシュ型)
+- [Prometheus](https://prometheus.io/) (プルモデル)
+- [InfluxDB](https://www.influxdata.com/get-influxdb/) (プッシュモデル)
- [Telegraf](https://www.influxdata.com/get-influxdb/)
- [Grafana](https://www.grafana.com/)
- [Datadog](https://www.datadoghq.com/)
- [Chronograf](https://www.influxdata.com/time-series-platform/chronograf/)
-さらに、[Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter)がありますが、これはInfluxDBおよびGrafana上ですでに設定済みのオプションです。
+また、InfluxDBとGrafanaで事前設定されたオプションである[Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter)もあります。
-このチュートリアルでは、InfluxDBにデータをプッシュするように Gethクライアントを設定し、さらに、Grafanaがこのデータをグラフ化するように設定します。 この設定を手動で行うことで、設定プロセスについての理解を深めることができ、設定を変更したり、異なる環境でデプロイする方法を学ぶことができます。
+このチュートリアルでは、GethクライアントがInfluxDBにデータをプッシュしてデータベースを作成し、Grafanaがそのデータをグラフで可視化するように設定します。 手動で行うことで、プロセスをよりよく理解し、変更を加え、さまざまな環境にデプロイできるようになります。
-## InfluxDBを設定する {#setting-up-influxdb}
+## InfluxDBの設定 {#setting-up-influxdb}
-まず、InfluxDBをダウンロードしてインストールします。 [Influxdataのリリースページ](https://portal.influxdata.com/downloads/)では、さまざまなダウンロードのオプションが提供されています。 あなたの環境に合わせて選択してください。 また、[リポジトリ](https://repos.influxdata.com/)からインストールすることもできます。 例えば、Debianベースのディストリビューションの場合、以下のように実行します:
+まず、InfluxDBをダウンロードしてインストールします。 さまざまなダウンロードオプションは[Influxdataのリリースぺージ](https://portal.influxdata.com/downloads/)で確認できます。 あなたの環境に合わせて選択してください。
+[リポジトリ](https://repos.influxdata.com/)からインストールすることもできます。 例えば、Debianベースのディストリビューションの場合は、以下のようになります:
```
curl -tlsv1.3 --proto =https -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add
@@ -48,26 +47,27 @@ sudo systemctl start influxdb
sudo apt install influxdb-client
```
-InfluxDB を正常にインストールしたら、バックグラウンドで実行されていることを確認してください。 デフォルトでは、`localhost:8086`からアクセス可能です。 `influx`クライアントを使用する前に、管理者権限を持つ新規ユーザーを作成する必要があります。 管理者ユーザーは、データベースおよびユーザーを作成し、高レベルの管理を行うユーザーです。
+InfluxDB を正常にインストールしたら、バックグラウンドで実行されていることを確認してください。 デフォルトでは、`localhost:8086`でアクセスできます。
+`influx`クライアントを使用する前に、管理者権限を持つ新しいユーザーを作成する必要があります。 このユーザーは、高度な管理、データベースの作成、ユーザーの作成に使用します。
```
curl -XPOST "http://localhost:8086/query" --data-urlencode "q=CREATE USER username WITH PASSWORD 'password' WITH ALL PRIVILEGES"
```
-管理者ユーザーを作成すると、Influxクライアントから、[InfluxDBシェル](https://docs.influxdata.com/influxdb/v1.8/tools/shell/)にアクセスできるようになります。
+これで、このユーザーで`influx`クライアントを使用して[InfluxDBシェル](https://docs.influxdata.com/influxdb/v1.8/tools/shell/)に入ることができます。
```
influx -username 'username' -password 'password'
```
-このシェルから InfluxDBと直接やりとりを行うことで、データベースとユーザーを作成し、Gethのモニタリング指標を取得することができます。
+シェル内でInfluxDBと直接通信することで、gethメトリクス用のデータベースとユーザーを作成できます。
```
create database geth
create user geth with password choosepassword
```
-作成したデータベース/ユーザーを、以下で確認します:
+作成したエントリを以下で確認します:
```
show databases
@@ -80,28 +80,30 @@ InfluxDBシェルを終了します。
exit
```
-InfluxDBはバックグラウンドで実行しており、Gethから送信される数値を保存するように設定されています。
+InfluxDBは実行中で、Gethからのメトリクスを保存するように設定されています。
-## Geth側の設定 {#preparing-geth}
+## Gethの準備 {#preparing-geth}
-データベースを設定したら、Geth上でのデータ収集を有効化する必要があります。 geth-helpの`geth --help`の`METRICS AND STATS OPTIONS`を確認してください。 複数のオプションが提供されていますが、ここでは、Gethが InfluxDBにデータをプッシュするように設定する必要があります。 基本的な設定では、InfluxDBがリーチ可能なエンドポイントと、当該データベースに対する認証について設定します。
+データベースを設定したら、Gethでのメトリクス収集を有効にする必要があります。 `geth --help`の`METRICS AND STATS OPTIONS`に注意してください。 そこには複数のオプションがありますが、このケースではGethがInfluxDBにデータをプッシュするようにします。
+基本設定では、InfluxDBがアクセスできるエンドポイントと、データベースの認証を指定します。
```
geth --metrics --metrics.influxdb --metrics.influxdb.endpoint "http://0.0.0.0:8086" --metrics.influxdb.username "geth" --metrics.influxdb.password "chosenpassword"
```
-このフラグは、クライアントを起動するコマンドに追加するか、設定ファイル上で保存することが可能です。
+これらのフラグは、クライアントを起動するコマンドに追加するか、設定ファイルに保存できます。
-データベースに含まれる数値をリストアップするなどの方法で、Gethが実際にデータをプッシュしているかどうかを確認できます。 InfluxDBのシェルで、以下を入力してください:
+例えば、データベース内のメトリクスを一覧表示することで、Gethが正常にデータをプッシュしていることを確認できます。 InfluxDBのシェルで、以下を入力してください:
```
use geth
show measurements
```
-## Grafanaを設定する {#setting-up-grafana}
+## Grafanaの設定 {#setting-up-grafana}
-次に、データをグラフィック表示するためにGrafanaをインストールします。 Grafanaのドキュメンテーションを参照して、お使いの環境におけるインストール作業を実行してください。 特別な理由がない限り、OSSバージョンをインストールしてください。 レポジトリを利用してDebianのディストリビューションをインストールするステップは、以下の通りです:
+次に、データをグラフィック表示するためにGrafanaをインストールします。 Grafanaのドキュメントで、お使いの環境に合わせたインストールプロセスに従ってください。 特別な理由がない限り、OSSバージョンをインストールしてください。
+リポジトリを使用したDebianディストリビューションへのインストール手順の例:
```
curl -tlsv1.3 --proto =https -sL https://packages.grafana.com/gpg.key | sudo apt-key add -
@@ -112,36 +114,38 @@ sudo systemctl enable grafana-server
sudo systemctl start grafana-server
```
-Grafanaが実行されている場合、`localhost:3000`でアクセスできるはずです。 お好みのブラウザからこのパスにアクセスして、デフォルトの認証情報(ユーザー:`admin`、パスワード:`admin`)でログインします。 プロンプトが表示されたら、デフォルトのパスワードを変更して保存してください。
+Grafanaが実行されたら、`localhost:3000`でアクセスできるはずです。
+お好みのブラウザでこのパスにアクセスし、デフォルトの認証情報(ユーザー: `admin`、パスワード: `admin`)でログインしてください。 プロンプトが表示されたら、デフォルトのパスワードを変更して保存してください。

-Grafanaのホームページに転送されます。 まず、ソースデータを設定します。 左のバーにあるConfigurationアイコンをクリックし、「Data sources」を選択します。
+Grafanaのホームページに転送されます。 まず、ソースデータを設定します。 左のバーにある設定アイコンをクリックし、「Data sources」を選択します。

-データソースを作成していないので、「Add data source」をクリックしてデータソースを定義します。
+まだデータソースは作成されていません。「Add data source」をクリックして定義します。

-今回の設定では、「InfluxDB」を選択して、次に進みます。
+この設定では、「InfluxDB」を選択して続行します。

-同一のマシンでツールを実行している場合、データソースの設定は非常に簡単です。 データベースにアクセスするには、InfluxDBのアドレスと詳細を設定する必要があります。 以下の画像を参照してください。
+同じマシンでツールを実行している場合、データソースの設定は非常に簡単です。 データベースにアクセスするには、InfluxDBのアドレスと詳細を設定する必要があります。 以下の画像を参照してください。

-設定が完了し、InfluxDBがアクセス可能になったら、「Save and test」をクリックして、確認のポップアップ画面が表示されるまで待ってください。
+すべてが完了し、InfluxDBにアクセスできるようになったら、「Save and test」をクリックし、確認のポップアップが表示されるのを待ちます。

-Grafanaの設定が完了し、InfluxDBのデータを読み込めるようになりました。 次に、データを分析して表示するダッシュボードを作成します。 ダッシュボードの属性はJSONファイルでエンコードされますので、誰でも簡単に作成し、インポートすることが可能です。 左のバーで、「Create and Import」をクリックしてください。
+GrafanaがInfluxDBからデータを読み取るように設定されました。 次に、データを解釈して表示するダッシュボードを作成する必要があります。 ダッシュボードのプロパティはJSONファイルにエンコードされており、誰でも簡単に作成してインポートできます。 左のバーで、「Create and Import」をクリックしてください。

-Gethのモニタリング用ダッシュボードの場合、[このダッシュボード](https://grafana.com/grafana/dashboards/13877/)のIDをコピーして、Grafanaの「Import page」にペーストしてください。 ダッシュボードを保存すると、以下のような状態になっているはずです:
+Gethのモニタリングダッシュボードには、[このダッシュボード](https://grafana.com/grafana/dashboards/13877/)のIDをコピーして、Grafanaの「Import page」に貼り付けてください。 ダッシュボードを保存すると、次のようになります:

-ダッシュボードの表示は変更可能です。 各パネルは、編集、移動、削除、追加が可能です。 各自の好みに合わせて、ダッシュボードの設定を変更してください。 あなた次第です! ダッシュボードの詳細な仕組みについては、 [Grafanaのドキュメンテーション](https://grafana.com/docs/grafana/latest/dashboards/)を参照してください。 また、[アラート機能](https://grafana.com/docs/grafana/latest/alerting/)も参照するとよいでしょう。 これは、各指標において一定の値に達した場合、アラート通知を受け取るように設定するものです。 アラート通知は、様々な通信チャネルに対応しています。
+ダッシュボードは変更できます。 各パネルは、編集、移動、削除、追加が可能です。 設定は変更できます。 あなた次第です! ダッシュボードの仕組みについて詳しくは、[Grafanaのドキュメント](https://grafana.com/docs/grafana/latest/dashboards/)を参照してください。
+[アラート](https://grafana.com/docs/grafana/latest/alerting/)にも興味があるかもしれません。 これにより、メトリクスが特定の値に達したときにアラート通知を設定できます。 さまざまな通信チャネルがサポートされています。
diff --git a/public/content/translations/ja/developers/tutorials/nft-minter/index.md b/public/content/translations/ja/developers/tutorials/nft-minter/index.md
index b54dc60b215..1025b5da7f3 100644
--- a/public/content/translations/ja/developers/tutorials/nft-minter/index.md
+++ b/public/content/translations/ja/developers/tutorials/nft-minter/index.md
@@ -1,14 +1,16 @@
---
-title: 非代替性トークン(NFT)ミンターチュートリアル
-description: このチュートリアルでは、非代替性トークン(NFT)ミンターを構築します。さらに、スマートコントラクトをMetaMaskやWeb3ツールを使用して、Reactフロントエンドへ接続することでフルスタック分散型アプリケーション(Dapp)を作成する方法を学びます。
+title: "非代替性トークン(NFT)ミンターチュートリアル"
+description: "このチュートリアルでは、非代替性トークン(NFT)ミンターを構築します。さらに、スマートコントラクトをMetaMaskやWeb3ツールを使用して、Reactフロントエンドへ接続することでフルスタック分散型アプリケーション(Dapp)を作成する方法を学びます。"
author: "smudgil"
tags:
- - "Solidity"
- - "NFT"
- - "alchemy"
- - "スマートコントラクト"
- - "フロントエンド"
- - "Pinata"
+ [
+ "Solidity",
+ "NFT",
+ "Alchemy",
+ "スマートコントラクト",
+ "フロントエンド",
+ "Pinata"
+ ]
skill: intermediate
lang: ja
published: 2021-10-06
@@ -22,63 +24,63 @@ Web2のバックグラウンドを持つデベロッパーの最大の課題の1
- フロントエンドからスマートコントラクトメソッドを呼び出す
- MetaMaskを使用してトランザクションに署名する
-このチュートリアルでは、[React](https://reactjs.org/)をフロントエンドフレームワークとして使用します。 このチュートリアルはWeb3開発に焦点を当てているので、Reactの基礎についての説明に多くの時間を費やせません。 代わりに、プロジェクトの機能性を高めることに注力します。
+このチュートリアルでは、[React](https://react.dev/)をフロントエンドフレームワークとして使用します。 このチュートリアルはWeb3開発に焦点を当てているので、Reactの基礎についての説明に多くの時間を費やせません。 代わりに、プロジェクトの機能性を高めることに注力します。
-前提条件として、Reactに関する初級レベルの知識を有している必要があります。つまり、コンポーネント、プロパティ(props)、useStateおよびuseEffect、基本関数の呼び出しなどの仕組みを理解している必要があります。 これらの中に初めて耳にする用語がある場合は、[Reactの入門チュートリアル](https://reactjs.org/tutorial/tutorial.html)をご覧ください。 より視覚的な学習を好む方には、Net Ninjaによる素晴らしい[フルモダンReactチュートリアル](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d)のビデオシリーズをお勧めします。
+前提条件として、Reactに関する初級レベルの知識を有している必要があります。つまり、コンポーネント、プロパティ(props)、useStateおよびuseEffect、基本関数の呼び出しなどの仕組みを理解している必要があります。 これらの用語をこれまで聞いたことがない場合は、こちらの[React入門チュートリアル](https://react.dev/learn/tutorial-tic-tac-toe)をご覧ください。 視覚的な学習を好む方には、Net Ninjaによるこの素晴らしい[フルモダンReactチュートリアル](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d)のビデオシリーズを強くお勧めします。
-まだAlchemyアカウントをお持ちでない場合、このチュートリアルを完了したり、ブロックチェーンで何かを構築したりするために必ず必要になりますので、 [こちらから](https://alchemy.com/)無料アカウントに登録してください。
+まだAlchemyアカウントをお持ちでない場合、このチュートリアルを完了したり、ブロックチェーンで何かを構築したりするために必ず必要になりますので、 [こちら](https://alchemy.com/)から無料アカウントにサインアップしてください。
それでは、さっそく始めましょう!
-## 非代替性トークン(NFT)作成入門 {#making-nfts-101}
+## NFT作成の基礎 {#making-nfts-101}
コードを見始める前に、非代替性トークン(NFT)作成の仕組みを理解することが重要です。 それには、次の2つのステップがあります。
-### イーサリアムブロックチェーン上で非代替性トークン(NFT)スマートコントラクトを公開 {#publish-nft}
+### Ethereumブロックチェーン上にNFTスマートコントラクトを公開する {#publish-nft}
ERC-1155とERC-721の2つのスマートコントラクト規格の最大の違いは、ERC-1155はマルチトークン規格でありバッチ機能を備えているのに対し、ERC-721はシングルトークン規格であり一度に1つのトークンの送信しかサポートしていないことです。
-### ミント関数の呼び出し {#minting-function}
+### ミント関数を呼び出す {#minting-function}
-通常、このミント関数は、パラメータとして2つの変数を渡す必要があります。1つ目は、新しくミントされた非代替性トークン(NFT)を受け取るアドレスを指定する`recipient`です。2つ目は、非代替性トークン(NFT)のメタデータを記述するJSONドキュメントに解決される文字列である非代替性トークン(NFT)の`tokenURI`です。
+通常、このミント関数では、パラメータとして2つの変数を渡す必要があります。1つ目は、新しくミントされたNFTを受け取るアドレスを指定する`recipient`で、2つ目は、NFTのメタデータを記述するJSONドキュメントに解決される文字列であるNFTの`tokenURI`です。
-非代替性トークン(NFT)のメタデータは、非代替性トークン(NFT)に名前、説明、画像(または別のデジタル資産)、その他の属性などのプロパティを持たせ、非代替性トークン(NFT)を利用できるようにします。 非代替性トークン(NFT)のメタデータが含まれている[tokenURIの例](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2)をご覧ください。
+非代替性トークン(NFT)のメタデータは、非代替性トークン(NFT)に名前、説明、画像(または別のデジタル資産)、その他の属性などのプロパティを持たせ、非代替性トークン(NFT)を利用できるようにします。 NFTのメタデータを含む[tokenURIの例](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2)はこちらです。
このチュートリアルでは、React UIを使用して既存の非代替性トークン(NFT)のスマートコントラクトのミント関数を呼び出すパート2(後半)の方に焦点を当てています。
-このチュートリアルで呼び出すERC-721非代替性トークン(NFT)スマートコントラクトへのリンクは、[こちら](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE)です。 この作成方法について知りたい場合は、[非代替性トークン(NFT)の作り方](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft)という別のチュートリアルを確認することを強くお勧めします。
+このチュートリアルで呼び出すERC-721 NFTスマートコントラクトへの[リンクはこちら](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE)です。 その作成方法を学びたい場合は、もう一つのチュートリアル["NFTの作成方法"](https://www.alchemy.com/docs/how-to-create-an-nft)をご覧になることを強くお勧めします。
非代替性トークン(NFT)作成の仕組みを理解したところで、スターターファイルをクローンしましょう。
-## スターターファイルのクローン {#clone-the-starter-files}
+## スターターファイルをクローンする {#clone-the-starter-files}
-最初に、[非代替性トークン(NFT)ミンターチュートリアル(nft-minter-tutorial)のGitHubリポジトリ](https://github.com/alchemyplatform/nft-minter-tutorial)にアクセスし、このプロジェクトのスターターファイルを取得します。 リポジトリをローカル環境にクローンします。
+まず、[nft-minter-tutorialのGitHubリポジトリ](https://github.com/alchemyplatform/nft-minter-tutorial)にアクセスして、このプロジェクトのスターターファイルを入手します。 このリポジトリをローカル環境にクローンします。
-クローンされた`nft-minter-tutorial`リポジトリを開くと、`minter-starter-files`と`nft-minter`という2つのフォルダが含まれています。
+このクローンされた`nft-minter-tutorial`リポジトリを開くと、`minter-starter-files`と`nft-minter`という2つのフォルダが含まれていることがわかります。
-- `minter-starter-files`には、このプロジェクトのスターターファイル(基本的にはReact UI)が含まれています。 このチュートリアルでは、イーサリアムウォレットと非代替性トークン(NFT)スマートコントラクトに接続することで、このUIを利用できるようにする方法を学ぶ際に、**こちらのディレクトリで作業します**。
-- `nft-minter`には、完成したチュートリアル全体が含まれており、**困ったときに****リファレンス**として利用できます。
+- `minter-starter-files`には、このプロジェクトのスターターファイル(本質的にはReactのUI)が含まれています。 このチュートリアルでは、EthereumウォレットとNFTスマートコントラクトに接続してこのUIを有効にする方法を学ぶため、**このディレクトリで作業します**。
+- `nft-minter`には完成したチュートリアル全体が含まれており、行き詰まった場合に**参照**として利用できます。
次に、コードエディタで`minter-starter-files`のコピーを開き、`src`フォルダに移動します。
-これから作成するすべてのコードは、`src`フォルダに保存されます。 後ほど`Minter.js`コンポーネントを編集し、追加のjavascriptファイルを書くことで、このプロジェクトにWeb3機能を追加します。
+私たちが書くコードはすべて`src`フォルダの下に置かれます。 `Minter.js`コンポーネントを編集し、追加のjavascriptファイルを記述して、プロジェクトにWeb3機能を与えます。
-## ステップ2: スターターファイルの確認 {#step-2-check-out-our-starter-files}
+## ステップ2: スターターファイルを確認する {#step-2-check-out-our-starter-files}
コーディングを始める前に、スターターファイルで既に提供されるものを確認することが重要です。
-### Reactプロジェクトの実行 {#get-your-react-project-running}
+### Reactプロジェクトを実行する {#get-your-react-project-running}
まずは、ブラウザでReactプロジェクトを実行しましょう。 Reactの素晴らしいところは、一度ブラウザでプロジェクトを実行すると、保存した変更がブラウザでも同時に更新されることです。
-プロジェクトを実行するには、次のようにターミナルで`minter-starter-files`フォルダのルートディレクトリに移動し、`npm install`を実行してプロジェクトの依存関係をインストールします。
+プロジェクトを実行するには、`minter-starter-files`フォルダのルートディレクトリに移動し、ターミナルで`npm install`を実行してプロジェクトの依存関係をインストールします:
```bash
cd minter-starter-files
npm install
```
-インストールが完了したら、ターミナルで`npm start`を実行します。
+インストールが完了したら、ターミナルで`npm start`を実行します:
```bash
npm start
@@ -86,18 +88,18 @@ npm start
これにより、ブラウザでhttp://localhost:3000/が開き、プロジェクトのフロントエンドが表示されます。 フロントエンドは3つのフィールドで構成されており、それぞれ、非代替性トークン(NFT)資産へのリンク、非代替性トークン(NFT)の名前、非代替性トークン(NFT)の説明を入力する場所になっています。
-「Connect Wallet」や「Mint NFT」ボタンをクリックしても、動作しません。これらの機能は、これからプログラムする必要があります。 :\)
+「Connect Wallet」や「Mint NFT」ボタンをクリックしても、動作しません。これらの機能は、これからプログラムする必要があります。 :)
### Minter.jsコンポーネント {#minter-js}
-**注:** `minter-starter-files`フォルダにいることを確認してください。`nft-minter`フォルダではないことを確認します。
+**注:** `nft-minter`フォルダではなく、`minter-starter-files`フォルダにいることを確認してください。
-エディタの`src`フォルダに戻り、`Minter.js`ファイルを開きましょう。 このファイルには、これから作業を進めていく主要なReactコンポーネントが含まれています。すべての内容を理解することが非常に重要です。
+エディタで`src`フォルダに戻り、`Minter.js`ファイルを開きましょう。 このファイルには、これから作業を進めていく主要なReactコンポーネントが含まれています。すべての内容を理解することが非常に重要です。
このファイルの上部には、特定のイベントの後に更新される状態変数(State Variable)があります。
```javascript
-//State variables
+//状態変数
const [walletAddress, setWallet] = useState("")
const [status, setStatus] = useState("")
const [name, setName] = useState("")
@@ -105,135 +107,135 @@ const [description, setDescription] = useState("")
const [url, setURL] = useState("")
```
-Reactの状態変数や状態フック(State Hook)を聞いたことがない場合は、 [こちらの](https://reactjs.org/docs/hooks-state.html)ドキュメントをご覧ください。
+Reactの状態変数や状態フック(State Hook)を聞いたことがない場合は、 [こちらの](https://legacy.reactjs.org/docs/hooks-state.html)ドキュメントをご覧ください。
それぞれの変数は以下を示します。
- `walletAddress` - ユーザーのウォレットアドレスを格納する文字列
- `status` - UIの下部に表示するメッセージを含む文字列
-- `name` - 非代替性トークン(NFT)の名前を格納する文字列
-- `description` - 非代替性トークン(NFT)の説明を格納する文字列
-- `url` - 非代替性トークン(NFT)のデジタル資産へのリンクを含んだ文字列
+- `name` - NFTの名前を格納する文字列
+- `description` - NFTの説明を格納する文字列
+- `url` - NFTのデジタル資産へのリンクである文字列
-状態変数(State Variable)の後に、`useEffect`、`connectWalletPressed`、`onMintPressed`という3つの未実装の関数があります。 これらの関数は、すべて`async`になっています。これは、それぞれの関数で非同期API呼び出しを行うためです。 それぞれの関数の名前は、その機能を示しています。
+状態変数の後には、`useEffect`、`connectWalletPressed`、`onMintPressed`という3つの未実装の関数があります。 これらの関数はすべて`async`であることにお気づきでしょう。これは、これらの関数内で非同期API呼び出しを行うためです。 それぞれの関数の名前は、その機能を示しています。
```javascript
useEffect(async () => {
- //TODO: implement
+ //TODO: 実装
}, [])
const connectWalletPressed = async () => {
- //TODO: implement
+ //TODO: 実装
}
const onMintPressed = async () => {
- //TODO: implement
+ //TODO: 実装
}
```
-- [`useEffect`](https://reactjs.org/docs/hooks-effect.html) - コンポーネントがレンダリングされた後に呼び出されるReactフックです。 空の配列`[]`のpropが渡される(3行目を参照)ため、コンポーネントの_最初_のレンダリングでのみ呼び出されます。 ここでは、ウォレットリスナーと別のウォレット関数を呼び出し、ウォレットが接続されているかどうかに応じたUIの更新をします。
-- `connectWalletPressed` - この関数は、ユーザーのMataMaskウォレットを分散型アプリケーション(Dapp)に接続するために呼び出されます。
-- `onMintPressed` - この関数は、ユーザーの非代替性トークン(NFT)をミントするために呼び出されます。
+- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) - コンポーネントがレンダリングされた後に呼び出されるReactフックです。 空の配列`[]`のpropが渡されるため(3行目を参照)、コンポーネントの_最初の_レンダリングでのみ呼び出されます。 ここでは、ウォレットリスナーと別のウォレット関数を呼び出し、ウォレットが接続されているかどうかに応じたUIの更新をします。
+- `connectWalletPressed` - この関数は、ユーザーのMetaMaskウォレットをdappに接続するために呼び出されます。
+- `onMintPressed` - この関数は、ユーザーのNFTをミントするために呼び出されます。
-このファイルの終盤には、コンポーネントのUIがあります。 このコードを注意深く読んでいくと、状態変数の`url`、`name`、`description`に対応するテキストフィールドの入力が変更された場合、これらの変数を更新していることが分かります。
+このファイルの終盤には、コンポーネントのUIがあります。 このコードを注意深く見ると、対応するテキストフィールドの入力が変更されたときに、`url`、`name`、`description`の状態変数が更新されることがわかります。
-さらに、`walletButton`または`mintButton`というIDを持つボタンがクリックされると、それぞれ`connectWalletPressed`または`onMintPressed`が呼び出されることも分かります。
+また、`mintButton`と`walletButton`のIDを持つボタンがクリックされると、それぞれ`connectWalletPressed`と`onMintPressed`が呼び出されることもわかります。
```javascript
-//the UI of our component
+//コンポーネントのUI
return (
- 🧙♂️ Alchemy NFT Minter
+ 🧙♂️ Alchemy NFTミンター
- Simply add your asset's link, name, and description, then press "Mint."
+ アセットのリンク、名前、説明を追加し、「ミント」を押すだけです。
{status}
-
+
)
```
最後に、このミンター(Minter)コンポーネントがどこに加えられるかについて説明します。
-他のすべてのコンポーネントのコンテナとして機能する、Reactのメインコンポーネントである`App.js`ファイルを表示すると、ミンター(Minter)コンポーネントが7行目に挿入されていることが分かります。
+Reactのメインコンポーネントであり、他のすべてのコンポーネントのコンテナとして機能する`App.js`ファイルを見ると、7行目にMinterコンポーネントが挿入されていることがわかります。
-**このチュートリアルでは、`Minter.js`ファイルの編集と、`src`フォルダへのファイルの追加のみを行います。**
+**このチュートリアルでは、`Minter.js`ファイルの編集と`src`フォルダへのファイルの追加のみを行います。**
これから取り組む内容を理解したところで、イーサリアムウォレットを設定しましょう。
-## イーサリアムウォレットの設定 {#set-up-your-ethereum-wallet}
+## Ethereumウォレットを設定する {#set-up-your-ethereum-wallet}
ユーザーがスマートコントラクトとやり取りできるようにするには、自分のイーサリアムウォレットを分散型アプリケーション(Dapp)に接続する必要があります。
-### MetaMaskをダウンロード {#download-metamask}
+### MetaMaskをダウンロードする {#download-metamask}
-このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 イーサリアムのトランザクションの仕組みの詳細については、[こちらのページ](/developers/docs/transactions/)をご覧ください。
+このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 Ethereumでのトランザクションの仕組みについて詳しく知りたい場合は、[こちらのページ](/developers/docs/transactions/)をご覧ください。
-Metamaskのアカウントは[こちら](https://metamask.io/download)から無料でダウンロード、作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は、(実際に支払いが発生しないように)右上の「Ropsten Test Network」に切り替えてください。
+MetaMaskアカウントは、[こちら](https://metamask.io/download)から無料でダウンロードして作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は、(実際に支払いが発生しないように)右上の「Ropsten Test Network」に切り替えてください。
-### フォーセットからイーサ(ETH)を追加 {#add-ether-from-faucet}
+### フォーセットからEtherを追加する {#add-ether-from-faucet}
-非代替性トークン(NFT)をミントする(または、イーサリアムのブロックチェーンのトランザクションに署名する)には、偽のETHが必要です。 ETHを取得するには、[Ropstenフォーセット](https://faucet.ropsten.be/)にアクセスして、Ropstenアカウントアドレスを入力し、「Send Ropsten ETH」をクリックします。 MetamaskアカウントにETHが表示されるはずです。
+非代替性トークン(NFT)をミントする(または、イーサリアムのブロックチェーンのトランザクションに署名する)には、偽のETHが必要です。 Ethを取得するには、[Ropstenフォーセット](https://faucet.ropsten.be/)にアクセスしてRopstenのアカウントアドレスを入力し、「Send Ropsten Eth」をクリックします。 MetamaskアカウントにETHが表示されるはずです。
-### 残高の確認 {#check-your-balance}
+### 残高を確認する {#check-your-balance}
-残高を再確認するために、[Alchemyのコンポーザーツール](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D)を使用して[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)をリクエストしてみましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 MetaMaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。
+残高を確認するために、[Alchemyのcomposerツール](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D)を使用して[eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)リクエストを行いましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 MetaMaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。
```text
{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}
```
-**注:** この結果の単位は、ETHではなくweiです。 weiはETHの最小単位として使われています。 weiからETHへ変換すると、1 eth = 10¹⁸ weiになります。 つまり、0xde0b6b3a7640000を10進数に変換すると、1\*10¹⁸となり、1 ETHに相当します。
+**注:** この結果はethではなくwei単位です。 weiはETHの最小単位として使われています。 weiからETHへ変換すると、1 eth = 10¹⁸ weiになります。 つまり、0xde0b6b3a7640000を10進数に変換すると、1\*10¹⁸となり、1 ETHに相当します。
-ふう! これで、偽のお金を手に入れました。
+ご安心ください。 これで、偽のお金を手に入れました。
-## MetaMaskをUIに接続 {#connect-metamask-to-your-UI}
+## MetaMaskをUIに接続する {#connect-metamask-to-your-UI}
MetaMaskウォレットが設定されたので、分散型アプリケーション(Dapp)を接続しましょう。
-[モデルビューコントローラ(MVC)](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)パラダイムを実践したいので、別のファイルを作成し、分散型アプリケーション(Dapp)のロジック、データ、ルールを管理する関数を含めます。次に、それらの関数をフロントエンド(Minter.jsコンポーネント)に渡します。
+[MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)パラダイムに従うため、dappのロジック、データ、ルールを管理する関数を含む別のファイルを作成し、それらの関数をフロントエンド(Minter.jsコンポーネント)に渡します。
### `connectWallet`関数 {#connect-wallet-function}
-これを行うには、`src`ディレクトリに`utils`という新しいフォルダを作成して、そこに`interact.js`というファイルを追加します。このファイルには、ウォレットとスマートコントラクトがやり取りする関数がすべて含まれます。
+そのためには、`src`ディレクトリに`utils`という新しいフォルダを作成し、その中に`interact.js`というファイルを追加します。このファイルには、ウォレットとスマートコントラクトのすべての対話関数が含まれます。
-`interact.js`ファイルに`connectWallet`関数を記述し、この関数を`Minter.js`コンポーネントにインポートして呼び出します。
+`interact.js`ファイルに`connectWallet`関数を記述し、それを`Minter.js`コンポーネントでインポートして呼び出します。
-`interact.js`ファイルに以下を追加します。
+`interact.js`ファイルに以下を追加します
```javascript
export const connectWallet = async () => {
@@ -243,7 +245,7 @@ export const connectWallet = async () => {
method: "eth_requestAccounts",
})
const obj = {
- status: "👆🏽 Write a message in the text-field above.",
+ status: "👆🏽 上のテキストフィールドにメッセージを書いてください。",
address: addressArray[0],
}
return obj
@@ -261,8 +263,7 @@ export const connectWallet = async () => {
@@ -274,26 +275,26 @@ export const connectWallet = async () => {
このコードが何をしているのか見てみましょう。
-まず、ブラウザで`window.ethereum`が有効になっているかどうかを関数がチェックしています。
+まず、この関数はブラウザで`window.ethereum`が有効になっているかどうかをチェックします。
-`window.ethereum`は、MetaMaskおよび他のウォレットプロバイダーによって挿入されるグローバルAPIであり、ウェブサイトがユーザーのイーサリアムアカウントを要求できるようにするものです。 承認されると、ユーザーが接続しているブロックチェーンからデータを読み取ったり、メッセージやトランザクションへの署名をユーザーに提案したりできるようになります。 詳細については、[MetaMaskのドキュメント](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents)を参照してください。
+`window.ethereum`は、MetaMaskやその他のウォレットプロバイダーによって挿入されるグローバルAPIで、WebサイトがユーザーのEthereumアカウントを要求できるようにするものです。 承認されると、ユーザーが接続しているブロックチェーンからデータを読み取ったり、メッセージやトランザクションへの署名をユーザーに提案したりできるようになります。 詳細については[MetaMaskのドキュメント](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents)をご覧ください。
-`window.ethereum`が_存在しない_場合は、MeTaMaskがインストールされていないことを意味します。 その結果、空の文字列に設定された、返される`address`と、ユーザーがMetaMaskをインストールする必要があることを伝える`status`JSXオブジェクトが入ったJSONオブジェクトが返されます。
+`window.ethereum`が_存在しない_場合、それはMetaMaskがインストールされていないことを意味します。 これにより、返される`address`が空の文字列で、`status` JSXオブジェクトがユーザーにMetaMaskをインストールするよう促すJSONオブジェクトが返されます。
-**これから記述するほとんどの関数は、状態変数(State Variable)とUIの更新に使用できるJSONオブジェクトを返します。**
+**私たちが書く関数のほとんどは、状態変数とUIを更新するために使用できるJSONオブジェクトを返します。**
-`window.ethereum`が_存在_する場合、興味深いことが起こります。
+さて、`window.ethereum`が_存在する_場合、ここからが面白くなります。
-try/catchループを使用して、`[window.ethereum.request({ method: "eth_requestAccounts" });](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts)`を呼び出すことで、MetaMaskへの接続を試みます。 この関数を呼び出すと、ブラウザでMetaMaskが開き、ユーザーはウォレットを分散型アプリケーション(Dapp)に接続するように求められます。
+try/catchループを使用して、[`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts)を呼び出してMetaMaskへの接続を試みます。 この関数を呼び出すと、ブラウザでMetaMaskが開き、ユーザーはウォレットを分散型アプリケーション(Dapp)に接続するように求められます。
-- ユーザーが接続を選んだ場合、`method: "eth_requestAccounts"`は、分散型アプリケーション(Dapp)に接続されているすべてのユーザーのアカウントアドレスを含む配列を返します。 `connectWallet`関数は、配列内の_最初の_`address`と\(9 行目参照\)、ユーザーにスマートコントラクトにメッセージを書き込むように促す`status`メッセージが入ったJSONオブジェクトを返します。
-- ユーザーが接続を拒否した場合、JSONオブジェクトには、返される`address`に入る空の文字列と、ユーザーが接続を拒否したことを示す`status`メッセージが入ることになります。
+- ユーザーが接続を選択した場合、`method: "eth_requestAccounts"`は、dappに接続されているすべてのユーザーのアカウントアドレスを含む配列を返します。 まとめると、`connectWallet`関数は、この配列の_最初の_`address`(9行目参照)と、ユーザーにスマートコントラクトへのメッセージを書き込むよう促す`status`メッセージを含むJSONオブジェクトを返します。
+- ユーザーが接続を拒否した場合、JSONオブジェクトには返される`address`の空文字列と、ユーザーが接続を拒否したことを示す`status`メッセージが含まれます。
-### Minter.js UIコンポーネントにconnectWallet関数を追加 {#add-connect-wallet}
+### connectWallet関数をMinter.js UIコンポーネントに追加する {#add-connect-wallet}
-`connectWallet`関数を記述したので、 `Minter.js`コンポーネントに接続しましょう。
+この`connectWallet`関数を書いたので、`Minter.js`コンポーネントに接続しましょう。
-まず、`Minter.js`ファイルの上部に`import { connectWallet } from "./utils/interact.js";`を追加して、`Minter.js`ファイルに関数をインポートする必要があります。 `Minter.js`の最初の11行は、次のようになります。
+まず、`Minter.js`ファイルの先頭に`import { connectWallet } from "./utils/interact.js";`を追加して、この関数を`Minter.js`ファイルにインポートする必要があります。 `Minter.js`の最初の11行は次のようになります。
```javascript
import { useEffect, useState } from "react";
@@ -301,7 +302,7 @@ import { connectWallet } from "./utils/interact.js";
const Minter = (props) => {
- //State variables
+ //状態変数
const [walletAddress, setWallet] = useState("");
const [status, setStatus] = useState("");
const [name, setName] = useState("");
@@ -309,7 +310,7 @@ const Minter = (props) => {
const [url, setURL] = useState("");
```
-次に、`connectWalletPressed`関数の中で、インポートされた`connectWallet`関数を、以下のように呼び出します。
+次に、`connectWalletPressed`関数の中で、インポートした`connectWallet`関数を次のように呼び出します。
```javascript
const connectWalletPressed = async () => {
@@ -321,9 +322,9 @@ const connectWalletPressed = async () => {
`interact.js`ファイルによって、機能の大部分が`Minter.js`コンポーネントからどのように抽象化されているかに注目してください。 これは、モデルビューコントローラ(M-V-C)パラダイムに準拠しているためです。
-`connectWalletPressed`では、単にインポートされた`connectWallet`関数のawait呼び出しを行っています。さらに、そのレスポンスを使用し、`status`と`walletAddress`変数を状態フックを介して更新しています。
+`connectWalletPressed`では、インポートした`connectWallet`関数をawaitで呼び出し、そのレスポンスを使って状態フックを介して`status`と`walletAddress`変数を更新します。
-それでは、 `Minter.js`と `interact.js`の両方のファイルを保存して、これまでのUIをテストしてみましょう。
+それでは、`Minter.js`と`interact.js`の両方のファイルを保存して、これまでのUIをテストしてみましょう。
localhost:3000でブラウザを開き、ページ右上にある「Connect Wallet」ボタンを押します。
@@ -331,9 +332,9 @@ MetaMaskがインストールされている場合は、ウォレットを分散
ウォレットボタンに、接続した自分のアドレスが表示されているはずです。
-次に、ページを更新してみてください。変ですね。 ウォレットボタンによって、すでに接続しているにもかかわらずMetaMaskに接続するよう求められます。
+次に、ページを再読み込みしてみてください... これは奇妙です。 ウォレットボタンによって、すでに接続しているにもかかわらずMetaMaskに接続するよう求められます。
-でも心配しないでください。 `getCurrentWalletConnected`という関数を実装することで、簡単にこれを修正できます。この関数は、アドレスが分散型アプリケーション(Dapp)にすでに接続されているかどうかを確認し、それに応じてUIを更新します。
+でも心配しないでください。 `getCurrentWalletConnected`という関数を実装することで、これを簡単に修正できます。この関数は、アドレスがすでにdappに接続されているかどうかを確認し、それに応じてUIを更新します。
### getCurrentWalletConnected関数 {#get-current-wallet}
@@ -349,12 +350,12 @@ export const getCurrentWalletConnected = async () => {
if (addressArray.length > 0) {
return {
address: addressArray[0],
- status: "👆🏽 Write a message in the text-field above.",
+ status: "👆🏽 上のテキストフィールドにメッセージを書いてください。",
}
} else {
return {
address: "",
- status: "🦊 Connect to MetaMask using the top right button.",
+ status: "🦊 右上のボタンを使ってMetaMaskに接続してください。",
}
}
} catch (err) {
@@ -371,8 +372,7 @@ export const getCurrentWalletConnected = async () => {
@@ -382,19 +382,19 @@ export const getCurrentWalletConnected = async () => {
}
```
-このコードは、_非常に_前述の`connectWallet`関数に似ています。
+このコードは、先ほど書いた`connectWallet`関数と_非常によく似ています_。
-主な違いとしては、ユーザーがウォレットに接続するためにMetaMaskを開く`eth_requestAccounts`メソッドを呼び出す代わりに、 ここでは`eth_accounts`メソッドを呼び出しています。これは、現在、分散型アプリケーション(Dapp)に接続されているMetaMaskのアドレスを含む配列を単に返すだけです。
+主な違いは、ユーザーがウォレットを接続するためにMetaMaskを開く`eth_requestAccounts`メソッドを呼び出す代わりに、ここでは`eth_accounts`メソッドを呼び出している点です。これは、現在dappに接続されているMetaMaskのアドレスを含む配列を単に返すだけです。
この関数を動作させるため、`Minter.js`コンポーネントの`useEffect`関数で呼び出しましょう。
-`connectWallet`で行ったのと同様に、この関数を`interact.js`ファイルから `Minter.js`ファイルへ次のようにインポートする必要があります。
+`connectWallet`で行ったのと同様に、この関数を`interact.js`ファイルから`Minter.js`ファイルへ次のようにインポートする必要があります。
```javascript
import { useEffect, useState } from "react"
import {
connectWallet,
- getCurrentWalletConnected, //import here
+ getCurrentWalletConnected, //ここでインポート
} from "./utils/interact.js"
```
@@ -408,11 +408,11 @@ useEffect(async () => {
}, [])
```
-`walletAddress`状態変数と`status`状態変数を更新するのに、呼び出した`getCurrentWalletConnected`のレスポンスを使用していることに注目してください。
+`walletAddress`と`status`の状態変数を更新するのに、`getCurrentWalletConnected`の呼び出しのレスポンスを使用していることに注目してください。
このコードを追加したら、ブラウザウィンドウを更新してみてください。 リフレッシュ後も、ボタンには接続されていることが示されており、接続されたウォレットのアドレスのプレビューが表示されているはずです。
-### addWalletListenerの実装 {#implement-add-wallet-listener}
+### addWalletListenerを実装する {#implement-add-wallet-listener}
分散型アプリケーション(Dapp)ウォレットの設定の最終ステップは、ウォレットリスナーを実装することです。これにより、ユーザーが接続を切断したり、アカウントを切り替えたりした場合など、ウォレットの状態が変更されたときにUIが更新されます。
@@ -424,10 +424,10 @@ function addWalletListener() {
window.ethereum.on("accountsChanged", (accounts) => {
if (accounts.length > 0) {
setWallet(accounts[0])
- setStatus("👆🏽 Write a message in the text-field above.")
+ setStatus("👆🏽 上のテキストフィールドにメッセージを書いてください。")
} else {
setWallet("")
- setStatus("🦊 Connect to MetaMask using the top right button.")
+ setStatus("🦊 右上のボタンを使ってMetaMaskに接続してください。")
}
})
} else {
@@ -435,7 +435,7 @@ function addWalletListener() {
)
@@ -445,9 +445,9 @@ function addWalletListener() {
ここで何が起きているか、簡単に見ていきましょう。
-- まず、ブラウザで`window.ethereum`が有効になっているか\(すなわち MetaMaskがインストールされているか\)を関数がチェックしています。
- - 有効になっていない場合、ユーザーにMetaMaskのインストールを求めるJSX文字列を`status`状態変数に設定します。
- - 有効になっている場合、MetaMaskウォレットの状態変更をリッスンしている3行目の`window.ethereum.on("accountsChanged")`リスナーを設定します。この状態変更には、ユーザーが追加のアカウントを分散型アプリケーション(Dapp)に接続した場合、アカウントを切り替えた場合、アカウントを切断した場合が含まれます。 少なくとも1つのアカウントが接続されていれば、`accounts`配列の最初のアカウントがリスナーから返されたときに、`walletAddress`状態変数が更新されます。 それ以外の場合は、`walletAddress`に空の文字列が設定されます。
+- まず、この関数は`window.ethereum`が有効になっているか(つまり、MetaMaskがインストールされているか)をチェックします。
+ - 有効でない場合、`status`状態変数を、ユーザーにMetaMaskのインストールを促すJSX文字列に設定するだけです。
+ - 有効になっている場合、3行目のリスナー`window.ethereum.on("accountsChanged")`を設定します。これはMetaMaskウォレットの状態変更をリッスンします。これには、ユーザーがdappに追加のアカウントを接続した場合、アカウントを切り替えた場合、アカウントを切断した場合が含まれます。 少なくとも1つのアカウントが接続されていれば、`walletAddress`状態変数は、リスナーから返された`accounts`配列の最初のアカウントとして更新されます。 それ以外の場合、`walletAddress`には空の文字列が設定されます。
最後に、`useEffect`関数で次のように呼び出す必要があります。
@@ -463,11 +463,11 @@ useEffect(async () => {
これで完了です。 ウォレットのすべての機能をプログラミングしました。 ウォレットが設定されたので、非代替性トークン(NFT)をミントする方法を理解しましょう!
-## 非代替性トークン(NFT)メタデータ入門 {#nft-metadata-101}
+## NFTメタデータの基礎 {#nft-metadata-101}
このチュートリアルの最初の方で説明した非代替性トークン(NFT)のメタデータを思い出してください。非代替性トークン(NFT)メタデータは、非代替性トークン(NFT)にデジタル資産、名前、説明、その他の属性などのプロパティーを持たせ、非代替性トークン(NFT)を利用できるようにします。
-JSONオブジェクトとしてメタデータを設定し、保存する必要があります。これで、スマートコントラクトの`mintNFT`関数呼び出すときに`tokenURI`パラメータとして渡すことができます。
+このメタデータをJSONオブジェクトとして設定して保存し、スマートコントラクトの`mintNFT`関数を呼び出すときに`tokenURI`パラメータとして渡せるようにする必要があります。
「Link to Asset」、「Name」、「Description」フィールドのテキストは、非代替性トークン(NFT)のメタデータで別々のプロパティになります。 メタデータをJSONオブジェクトとしてフォーマットしますが、このJSONオブジェクトの格納には、以下のような複数のオプションがあります。
@@ -475,25 +475,25 @@ JSONオブジェクトとしてメタデータを設定し、保存する必要
- AWSやFirebaseなどの中央集権型サーバーに保存できます。 しかし、これは分散化の信念に反するものです。
- 惑星間ファイルシステム(IPFS)という、分散型ファイルシステムでデータを保存、共有するための、分散型プロトコルおよびピアツーピア・ネットワークを使用できます。 このプロトコルは、分散化されており無料のため、最良のオプションです。
-惑星間ファイルシステム(IPFS)にメタデータを保存するには、[Pinata](https://pinata.cloud/)という便利な惑星間ファイルシステム(IPFS) APIとツールキットを使用します。 次のステップでは、この方法を具体的に説明します。
+メタデータをIPFSに保存するには、便利なIPFS APIおよびツールキットである[Pinata](https://pinata.cloud/)を使用します。 次のステップでは、この方法を具体的に説明します。
-## Pinataを使用してメタデータをIPFSに固定化 {#use-pinata-to-pin-your-metadata-to-IPFS}
+## Pinataを使ってメタデータをIPFSにピン留めする {#use-pinata-to-pin-your-metadata-to-IPFS}
-[Pinata](https://pinata.cloud/)アカウントをお持ちでない場合は、[こちら](https://app.pinata.cloud/auth/signup)から無料のアカウントにサインアップし、メールアドレスとアカウントの認証手順を完了してください。
+[Pinata](https://pinata.cloud/)アカウントをお持ちでない場合は、[こちら](https://app.pinata.cloud/auth/signup)から無料アカウントにサインアップし、メールアドレスとアカウントの認証手順を完了してください。
-### Pinata APIキーの作成 {#create-pinata-api-key}
+### Pinata APIキーを作成する {#create-pinata-api-key}
-[https://pinata.cloud/keys](https://pinata.cloud/keys)ページに移動して、上部にある「New Key」ボタンを選択し、Adminウィジェットを有効(Enabled)に設定してからキーに名前を付けます。
+[https://pinata.cloud/keys](https://pinata.cloud/keys)ページに移動して、上部にある「New Key」ボタンを選択し、Adminウィジェットを有効に設定してからキーに名前を付けます。
API情報を含むポップアップが表示されます。 この情報は、必ず安全な場所に保存してください。
キーの設定が完了したので、プロジェクトに追加して使用できるようにしましょう。
-### .envファイルの作成 {#create-a-env}
+### .envファイルを作成する {#create-a-env}
-環境ファイルにPinataキーとシークレットを安全に保存できます。 [dotenvパッケージ](https://www.npmjs.com/package/dotenv)をプロジェクトディレクトリにインストールしましょう。
+環境ファイルにPinataキーとシークレットを安全に保存できます。 プロジェクトディレクトリに[dotenvパッケージ](https://www.npmjs.com/package/dotenv)をインストールしましょう。
-ターミナルで\(ローカルホストを実行しているタブとは別の\)新しいタブを開き、`minter-starter-files`フォルダにいることを確認してください。次に、ターミナルで以下のコマンドを実行します。
+ターミナルで新しいタブを開き(ローカルホストを実行しているタブとは別のタブ)、`minter-starter-files`フォルダにいることを確認してから、ターミナルで次のコマンドを実行します。
```text
npm install dotenv --save
@@ -505,7 +505,7 @@ npm install dotenv --save
vim.env
```
-vim\(テキストエディタ\)で `.env`ファイルが開きます。 保存するには、キーボードで「esc」+「:」+「q」をこの順序で押します。
+これにより、vim(テキストエディタ)で`.env`ファイルが開きます。 保存するには、キーボードで「esc」+「:」+「q」をこの順序で押します。
次に、VSCodeで`.env`ファイルに移動し、次のようにしてPinata APIキーとAPIシークレットを追加します。
@@ -516,11 +516,11 @@ REACT_APP_PINATA_SECRET =
ファイルを保存します。これで、JSONメタデータを惑星間ファイルシステム(IPFS)にアップロードする関数を書き始める準備が整いました。
-### pinJSONToIPFSの実装 {#pin-json-to-ipfs}
+### pinJSONToIPFSを実装する {#pin-json-to-ipfs}
-幸いにもPinataでは、[惑星間ファイルシステム(IPFS)へのJSONデータのアップロードに特化したAPI](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json)と、少しの変更を加えるだけで使用できるaxiosのサンプルを備えた便利なJavaScriptを使用できます。
+幸いにもPinataには、[JSONデータをIPFSにアップロードするための専用API](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json)と、少しの変更で使えるaxiosを使った便利なJavaScriptのサンプルがあります。
-`utils`フォルダーに`pinata.js`という別のファイルを作成し、.envファイルからPinataのシークレットとキーをインポートしましょう。
+`utils`フォルダーに`pinata.js`という別のファイルを作成し、.envファイルからPinataのシークレットとキーを次のようにインポートしましょう。
```javascript
require("dotenv").config()
@@ -528,7 +528,7 @@ const key = process.env.REACT_APP_PINATA_KEY
const secret = process.env.REACT_APP_PINATA_SECRET
```
-次に、`pinata.js`ファイルに以下の追加コードを貼り付けます。 コードの意味はこれから説明しますので、心配する必要はありません。
+次に、pinata.jsファイルに以下の追加コードを貼り付けます。 コードの意味はこれから説明しますので、心配する必要はありません。
```javascript
require("dotenv").config()
@@ -539,7 +539,7 @@ const axios = require("axios")
export const pinJSONToIPFS = async (JSONBody) => {
const url = `https://api.pinata.cloud/pinning/pinJSONToIPFS`
- //making axios POST request to Pinata ⬇️
+ //Pinataへのaxios POSTリクエストを作成 ⬇️
return axios
.post(url, JSONBody, {
headers: {
@@ -568,30 +568,30 @@ export const pinJSONToIPFS = async (JSONBody) => {
最初に、ブラウザとnode.jsのためのPromiseベースのHTTPクライアントである[axios](https://www.npmjs.com/package/axios)をインポートしています。axiosは、Pinataへのリクエストで使用します。
-その下に、`pinJSONToIPFS`非同期関数があります。この関数は、`pinJSONToIPFS` APIへのPOSTリクエストを行うために、`JSONBody`を入力として取り、PinataのAPIキーとシークレットをヘッダーに入れます。
+その下に、`pinJSONToIPFS`非同期関数があります。この関数は、`JSONBody`を入力として取り、PinataのAPIキーとシークレットをヘッダーに入れて、`pinJSONToIPFS` APIへのPOSTリクエストを行います。
-- POSTリクエストが成功した場合、この関数は、trueに設定された`success`ブール値と、メタデータがピン留めされた`pinataUrl`が入ったJSONオブジェクトを返します。 ここで返された`pinataUrl`は、スマートコントラクトのmint関数の`tokenURI`の入力として使用されます。
-- POSTリクエストが失敗した場合、この関数は、falseに設定された`success`ブール値と、エラーを伝える`message`文字列が入ったJSONオブジェクトを返します。
+- このPOSTリクエストが成功した場合、この関数は、`success`ブール値がtrueで、メタデータがピン留めされた`pinataUrl`が入ったJSONオブジェクトを返します。 ここで返された`pinataUrl`は、スマートコントラクトのmint関数の`tokenURI`の入力として使用されます。
+- このPOSTリクエストが失敗した場合、この関数は、`success`ブール値がfalseで、エラーを伝える`message`文字列が入ったJSONオブジェクトを返します。
`connectWallet`関数の戻り値の型と同様に、JSONオブジェクトが返されるので、そのパラメータを状態変数とUIの更新に使用できます。
-## スマートコントラクトのロード {#load-your-smart-contract}
+## スマートコントラクトを読み込む {#load-your-smart-contract}
-これで、`pinJSONToIPFS`関数を介して非代替性トークン(NFT)メタデータを惑星間ファイルシステム(IPFS)にアップロードする手段を手に入れました。次は、`mintNFT`関数を呼び出せるように、スマートコントラクトのインスタンスをロードする手段が必要です。
+`pinJSONToIPFS`関数を介してNFTメタデータをIPFSにアップロードする手段を手に入れたので、次は`mintNFT`関数を呼び出せるように、スマートコントラクトのインスタンスを読み込む手段が必要です。
-前述したように、このチュートリアルでは、[こちらの既存の非代替性トークン(NFT)スマートコントラクト](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE)を使用します。ただし、この作成方法を学びたい、もしくは自分で作成したい場合は、[「非代替性トークン(NFT)の作り方」](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft)という別のチュートリアルを確認することを強くお勧めします。
+前述したように、このチュートリアルでは[こちらの既存のNFTスマートコントラクト](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE)を使用します。しかし、その作成方法を学びたい、もしくは自分で作成したい場合は、もう一つのチュートリアル["NFTの作成方法"](https://www.alchemy.com/docs/how-to-create-an-nft)をご覧になることを強くお勧めします。
-### コントラクトアプリケーションバイナリインターフェース(ABI) {#contract-abi}
+### コントラクトABI {#contract-abi}
ファイルを詳しく調べてみると、`src`ディレクトリに`contract-abi.json`ファイルがあることが分かります。 アプリケーションバイナリインターフェース(ABI)は、コントラクトが呼び出す関数を指定し、関数が確実に意図しているフォーマットでデータを返すようにするために必要です。
さらに、イーサリアムブロックチェーンに接続してスマートコントラクトをロードするための、Alchemy APIキーとAlchemy Web3 APIも必要になります。
-### Alchemy APIキーの作成 {#create-alchemy-api}
+### Alchemy APIキーを作成する {#create-alchemy-api}
-Alchemyのアカウントをお持ちでない場合は、[こちら](https://alchemy.com/?a=eth-org-nft-minter)から無料で登録できます。
+まだAlchemyアカウントをお持ちでない場合は、[こちらから無料でサインアップしてください](https://alchemy.com/?a=eth-org-nft-minter)。
-Alchemyのアカウントを作成した後、アプリを作成することでAPIキーを生成することができます。 これにより、Ropstenテストネットワークへのリクエストが可能になります。
+Alchemyのアカウントを作成した後、アプリを作成することでAPIキーを生成することができます。 これにより、Ropsten テストネットワークへのリクエストが可能になります。
ナビゲーションバーの「Apps」にマウスを合わせて、「Create App」をクリックし、Alchemyダッシュボードの「Create App」ページに移動してください。
@@ -601,7 +601,7 @@ Alchemyのアカウントを作成した後、アプリを作成することでA
HTTP Alchemy API URLを作成したので、クリップボードにコピーします。
-それを`.env`ファイルに追加してみましょう。 これで.envファイル全体は、次のようになります。
+…そして、それを`.env`ファイルに追加しましょう。 これで.envファイル全体は、次のようになります。
```text
REACT_APP_PINATA_KEY =
@@ -609,11 +609,11 @@ REACT_APP_PINATA_SECRET =
REACT_APP_ALCHEMY_KEY = https://eth-ropsten.alchemyapi.io/v2/
```
-コントラクトアプリケーションバイナリインターフェース(ABI)とAlchemy APIキーが用意できたので、[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)を使用してスマートコントラクトをロードする準備ができました。
+コントラクトABIとAlchemy APIキーが用意できたので、[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)を使用してスマートコントラクトを読み込む準備ができました。
-### Alchemy Web3エンドポイントとコントラクトの設定 {#setup-alchemy-endpoint}
+### Alchemy Web3エンドポイントとコントラクトを設定する {#setup-alchemy-endpoint}
-まず、[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)がインストールされていない場合は、ターミナルで次のようにホームディレクトリである`nft-minter-tutorial`に移動してインストールする必要があります。
+まず、[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)がまだインストールされていない場合は、ターミナルでホームディレクトリ`nft-minter-tutorial`に移動してインストールする必要があります:
```text
cd ..
@@ -629,7 +629,7 @@ const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
const web3 = createAlchemyWeb3(alchemyKey)
```
-[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)は、[Web3.js](https://docs.web3js.org/)のラッパーであり、強化されたAPIメソッドや重要なメリットを提供し、Web3デベロッパーの負担を軽減します。 最小限の設定で使えるように設計されているので、アプリですぐに使用可能です。
+[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3)は[Web3.js](https://docs.web3js.org/)のラッパーであり、強化されたAPIメソッドやその他の重要なメリットを提供し、web3開発者としての作業を容易にします。 最小限の設定で使えるように設計されているので、アプリですぐに使用可能です。
次に、コントラクトアプリケーションバイナリインターフェース(ABI)とコントラクトアドレスをファイルに追加しましょう。
@@ -645,9 +645,9 @@ const contractAddress = "0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE"
これで両方を追加できたので、mint関数のコーディングを始める準備ができました。
-## mintNFT関数の実装 {#implement-the-mintnft-function}
+## mintNFT関数を実装する {#implement-the-mintnft-function}
-`interact.js`ファイル内に、`mintNFT`関数を定義しましょう。この関数は、名前が示すとおりに非代替性トークン(NFT)をミントします。
+`interact.js`ファイル内に、`mintNFT`関数を定義しましょう。この関数は、その名の通りNFTをミントします。
多数の非同期呼び出しを\(メタデータをIPFSにピン留めするためにPinataに対して、スマートコントラクトをロードするためにAlchemy Web3に対して、トランザクションに署名するためにMetaMaskに対して\)行うため、この関数もまた非同期になります。
@@ -663,21 +663,21 @@ export const mintNFT = async (url, name, description) => {}
```javascript
export const mintNFT = async (url, name, description) => {
- //error handling
+ //エラー処理
if (url.trim() == "" || name.trim() == "" || description.trim() == "") {
return {
success: false,
- status: "❗Please make sure all fields are completed before minting.",
+ status: "❗ミントする前にすべてのフィールドに入力してください。",
}
}
}
```
-基本的に、入力パラメーターのいずれかが空の文字列である場合、falseに設定された`success`ブール値と、UIのすべてのフィールドに入力する必要があることを伝える`status`文字列が入ったJSONオブジェクトを返します。
+基本的に、入力パラメータのいずれかが空の文字列である場合、`success`ブール値がfalseで、UIのすべてのフィールドに入力する必要があることを伝える`status`文字列が入ったJSONオブジェクトを返します。
-### IPFSにメタデータをアップロード {#upload-metadata-to-ipfs}
+### メタデータをIPFSにアップロードする {#upload-metadata-to-ipfs}
-メタデータが適切にフォーマットされていることを確認したら、次のステップは、それをJSONオブジェクトにラップし、作成した`pinJSONToIPFS`を介して惑星間ファイルシステム(IPFS)にアップロードすることです。
+メタデータが適切にフォーマットされていることを確認したら、次のステップは、それをJSONオブジェクトにラップし、作成した`pinJSONToIPFS`を介してIPFSにアップロードすることです。
そのためにはまず、`pinJSONToIPFS`関数を`interact.js`ファイルにインポートする必要があります。 `interact.js`の最上部に、次の行を追加してください。
@@ -685,32 +685,32 @@ export const mintNFT = async (url, name, description) => {
import { pinJSONToIPFS } from "./pinata.js"
```
-`pinJSONToIPFS`が、JSON本体を取ることを思い出してください。 そのため、呼び出す前に`url`、`name`、`description`パラメータをJSONオブジェクトにフォーマットする必要があります。
+`pinJSONToIPFS`がJSON本体を入力として取ることを思い出してください。 そのため、呼び出す前に`url`、`name`、`description`パラメータをJSONオブジェクトにフォーマットする必要があります。
次のようにコードを更新して、`metadata`というJSONオブジェクトを作成し、この`metadata`パラメータを使用して`pinJSONToIPFS`を呼び出します。
```javascript
export const mintNFT = async (url, name, description) => {
- //error handling
+ //エラー処理
if (url.trim() == "" || name.trim() == "" || description.trim() == "") {
return {
success: false,
- status: "❗Please make sure all fields are completed before minting.",
+ status: "❗ミントする前にすべてのフィールドに入力してください。",
}
}
- //make metadata
+ //メタデータを作成
const metadata = new Object()
metadata.name = name
metadata.image = url
metadata.description = description
- //make pinata call
+ //pinata呼び出しを作成
const pinataResponse = await pinJSONToIPFS(metadata)
if (!pinataResponse.success) {
return {
success: false,
- status: "😢 Something went wrong while uploading your tokenURI.",
+ status: "😢 tokenURIのアップロード中に問題が発生しました。",
}
}
const tokenURI = pinataResponse.pinataUrl
@@ -719,7 +719,7 @@ export const mintNFT = async (url, name, description) => {
`pinJSONToIPFS(metadata)`の呼び出しのレスポンスを、`pinataResponse`オブジェクトに格納していることに注目してください。 次に、このオブジェクトにエラーがないか解析します。
-エラーがある場合、falseに設定された`success`ブール値と、呼び出しが失敗したことを伝える`status`文字列が入ったJSONオブジェクトを返します。 それ以外の場合は、`pinataURL`を`pinataResponse`から抽出し、それを`tokenURI`変数として格納します。
+エラーがある場合、`success`ブール値がfalseで、呼び出しが失敗したことを伝える`status`文字列が入ったJSONオブジェクトを返します。 それ以外の場合は、`pinataURL`を`pinataResponse`から抽出し、それを`tokenURI`変数として格納します。
では、ファイルの先頭で初期化したAlchemy Web3 APIを使用して、スマートコントラクトをロードしてみましょう。 `mintNFT`関数の下部に次のコードの行を追加して、`window.contract`グローバル変数にコントラクトを設定します。
@@ -727,19 +727,19 @@ export const mintNFT = async (url, name, description) => {
window.contract = await new web3.eth.Contract(contractABI, contractAddress)
```
-`mintNFT`関数に最後に追加するのは、イーサリアムのトランザクションです。
+`mintNFT`関数に最後に追加するのは、Ethereumのトランザクションです。
```javascript
-//set up your Ethereum transaction
+//Ethereumトランザクションを設定
const transactionParameters = {
- to: contractAddress, // Required except during contract publications.
- from: window.ethereum.selectedAddress, // must match user's active address.
+ to: contractAddress, // コントラクト公開時以外は必須
+ from: window.ethereum.selectedAddress, // ユーザーのアクティブなアドレスと一致する必要あり
data: window.contract.methods
.mintNFT(window.ethereum.selectedAddress, tokenURI)
- .encodeABI(), //make call to NFT smart contract
+ .encodeABI(), //NFTスマートコントラクトを呼び出し
}
-//sign the transaction via MetaMask
+//MetaMask経由でトランザクションに署名
try {
const txHash = await window.ethereum.request({
method: "eth_sendTransaction",
@@ -748,13 +748,13 @@ try {
return {
success: true,
status:
- "✅ Check out your transaction on Etherscan: https://ropsten.etherscan.io/tx/" +
+ "✅ Etherscanでトランザクションを確認: https://ropsten.etherscan.io/tx/" +
txHash,
}
} catch (error) {
return {
success: false,
- status: "😥 Something went wrong: " + error.message,
+ status: "😥 問題が発生しました: " + error.message,
}
}
```
@@ -762,54 +762,54 @@ try {
イーサリアムトランザクションをすでによくご存知ならば、構造が今まで見てきたものとかなり似ていることに気付くでしょう。
- まず、トランザクションパラメータを設定します。
- - `to`に受取人のアドレス\(スマートコントラクト\)を設定します 。
- - `from`にトランザクションの署名者\(MetaMaskに接続されているユーザーのアドレス: `window.ethereum.selectedAddress`\)を指定します。
- - `data`には、スマートコントラクトの`mintNFT`メソッド呼び出しが含まれ、`tokenURI`とユーザーのウォレットのアドレス`window.ethereum.selectedAddress`を入力として受け取ります。
-- 次に、`window.ethereum.request`をawaitで呼び出して、MetaMaskにトランザクションの署名を依頼します。 このリクエストで、ethメソッド\(eth_sendTransaction\)を指定し、`transactionParameters`を渡していることに注目してください。 この時点で、ブラウザでMetaMaskが開かれ、ユーザーにトランザクションの署名または拒否を求めます。
- - トランザクションが成功した場合、この関数は、trueに設定された`success`ブール値と、Etherscanでトランザクションについての詳細を確認するようユーザーに求める`status`文字列が入ったJSONオブジェクトを返します。
- - トランザクションが失敗した場合、この関数は、falseに設定された`success`ブール値と、エラーメッセージを伝える`status`文字列が入ったJSONオブジェクトを返します。
+ - `to`は受信者アドレス(スマートコントラクト)を指定します
+ - `from`はトランザクションの署名者を指定します(ユーザーのMetaMaskに接続されたアドレス: `window.ethereum.selectedAddress`)
+ - `data`には、スマートコントラクトの`mintNFT`メソッドへの呼び出しが含まれ、入力として`tokenURI`とユーザーのウォレットアドレス`window.ethereum.selectedAddress`を受け取ります
+- 次に、`window.ethereum.request`をawaitで呼び出して、MetaMaskにトランザクションの署名を依頼します。 このリクエストで、ethメソッド(`eth_sendTransaction`)を指定し、`transactionParameters`を渡していることに注目してください。 この時点で、ブラウザでMetaMaskが開かれ、ユーザーにトランザクションの署名または拒否を求めます。
+ - トランザクションが成功した場合、この関数は、ブール値`success`がtrueに設定され、`status`文字列がユーザーにトランザクションの詳細についてEtherscanを確認するよう促すJSONオブジェクトを返します。
+ - トランザクションが失敗した場合、この関数は、`success`ブール値がfalseに設定され、`status`文字列がエラーメッセージを伝えるJSONオブジェクトを返します。
`mintNFT`関数全体は、次のようになります。
```javascript
export const mintNFT = async (url, name, description) => {
- //error handling
+ //エラー処理
if (url.trim() == "" || name.trim() == "" || description.trim() == "") {
return {
success: false,
- status: "❗Please make sure all fields are completed before minting.",
+ status: "❗ミントする前にすべてのフィールドに入力してください。",
}
}
- //make metadata
+ //メタデータを作成
const metadata = new Object()
metadata.name = name
metadata.image = url
metadata.description = description
- //pinata pin request
+ //pinataピン留めリクエスト
const pinataResponse = await pinJSONToIPFS(metadata)
if (!pinataResponse.success) {
return {
success: false,
- status: "😢 Something went wrong while uploading your tokenURI.",
+ status: "😢 tokenURIのアップロード中に問題が発生しました。",
}
}
const tokenURI = pinataResponse.pinataUrl
- //load smart contract
+ //スマートコントラクトを読み込む
window.contract = await new web3.eth.Contract(contractABI, contractAddress) //loadContract();
- //set up your Ethereum transaction
+ //Ethereumトランザクションを設定
const transactionParameters = {
- to: contractAddress, // Required except during contract publications.
- from: window.ethereum.selectedAddress, // must match user's active address.
+ to: contractAddress, // コントラクト公開時以外は必須
+ from: window.ethereum.selectedAddress, // ユーザーのアクティブなアドレスと一致する必要あり
data: window.contract.methods
.mintNFT(window.ethereum.selectedAddress, tokenURI)
- .encodeABI(), //make call to NFT smart contract
+ .encodeABI(), //NFTスマートコントラクトを呼び出す
}
- //sign transaction via MetaMask
+ //MetaMask経由でトランザクションに署名
try {
const txHash = await window.ethereum.request({
method: "eth_sendTransaction",
@@ -818,13 +818,13 @@ export const mintNFT = async (url, name, description) => {
return {
success: true,
status:
- "✅ Check out your transaction on Etherscan: https://ropsten.etherscan.io/tx/" +
+ "✅ Etherscanでトランザクションを確認: https://ropsten.etherscan.io/tx/" +
txHash,
}
} catch (error) {
return {
success: false,
- status: "😥 Something went wrong: " + error.message,
+ status: "😥 問題が発生しました: " + error.message,
}
}
}
@@ -832,7 +832,7 @@ export const mintNFT = async (url, name, description) => {
巨大な関数でしたね! あとは、`mintNFT`関数を`Minter.js`コンポーネントに接続するだけです。
-## mintNFTをMinter.jsフロントエンドに接続 {#connect-our-frontend}
+## mintNFTをMinter.jsフロントエンドに接続する {#connect-our-frontend}
`Minter.js`ファイルを開いて、上部の`import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";`の行を次のように更新してください。
@@ -844,7 +844,7 @@ import {
} from "./utils/interact.js"
```
-最後に、次のように`onMintPressed`関数を実装し、インポートした`mintNFT`関数をawaitで呼び出します。さらに、`status`状態変数を更新し、トランザクションが成功したか失敗したかを反映させるようにします。
+最後に、`onMintPressed`関数を実装してインポートした`mintNFT`関数をawaitで呼び出し、`status`状態変数を更新してトランザクションが成功したか失敗したかを反映させます。
```javascript
const onMintPressed = async () => {
@@ -853,22 +853,22 @@ const onMintPressed = async () => {
}
```
-## 稼働中のウェブサイトに非代替性トークン(NFT)をデプロイ {#deploy-your-NFT}
+## NFTを稼働中のWebサイトにデプロイする {#deploy-your-NFT}
-プロジェクトを稼働させてユーザーが使える準備ができましたでしょうか? 稼働しているウェブサイトへMinterをデプロイする[チュートリアル](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online)をご覧ください。
+プロジェクトを稼働させてユーザーが使える準備ができましたでしょうか? ミンターを稼働中のWebサイトにデプロイする方法については、[こちらのチュートリアル](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online)をご覧ください。
次は最後のステップです。
-## ブロックチェーンの世界を席巻しよう! {#take-the-blockchain-world-by-storm}
+## ブロックチェーンの世界に旋風を巻き起こす {#take-the-blockchain-world-by-storm}
これは冗談です。あなたは、このチュートリアルを最後までやりきりました!
要約すると、非代替性トークン(NFT)ミンターを構築することで次の方法を学ぶことが出来ました。
-- フロントエンドのプロジェクト経由でMetaMaskへアクセス
-- フロントエンドからスマートコントラクトメソッドの呼び出し
-- MetaMaskを使ったトランザクションの署名
+- フロントエンドのプロジェクト経由でMetaMaskに接続する
+- フロントエンドからスマートコントラクトメソッドを呼び出す
+- MetaMaskを使用してトランザクションに署名する
-ウォレットに分散型アプリケーション(Dapp)を介してミントされた非代替性トークン(NFT)を表示する方法については、[ウォレットに非代替性トークン(NFT)を表示する方法](https://docs.alchemyapi.io/alchemy/tutorials/how-to-write-and-deploy-a-nft-smart-contract/how-to-view-your-nft-in-your-wallet)という簡単なチュートリアルをご覧ください。
+おそらく、dappを介してミントされたNFTをウォレットで披露したいと思うでしょうから、簡単なチュートリアル[ウォレットでNFTを表示する方法](https://www.alchemy.com/docs/how-to-view-your-nft-in-your-mobile-wallet)をぜひご覧ください。
-ご不明な点がありましたら、いつでも[Alchemy Discord](https://discord.gg/gWuC7zB)でお問い合わせください。 このチュートリアルのコンセプトが、今後のプロジェクトでどのように応用されるのか楽しみでなりません。
+そして、いつものように、何か質問があれば、[Alchemy Discord](https://discord.gg/gWuC7zB)でお手伝いします。 このチュートリアルのコンセプトが、今後のプロジェクトでどのように応用されるのか楽しみでなりません。
diff --git a/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md
index d1b9c3ffae4..4388b37ec0b 100644
--- a/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md
+++ b/public/content/translations/ja/developers/tutorials/optimism-std-bridge-annotated-code/index.md
@@ -1,84 +1,89 @@
---
-title: "Optimismの標準ブリッジコントラクトを紹介します"
-description: Optimismの標準ブリッジは、どのように機能するか。 および、その理由。
+title: "Optimism標準ブリッジコントラクトのウォークスルー"
+description: "Optimismの標準ブリッジはどのように機能するのでしょうか? なぜこのように機能するのでしょうか?"
author: Ori Pomerantz
-tags:
- - "Solidity"
- - "ブリッジ"
- - "レイヤー2"
+tags: [ "Solidity", "ブリッジ", "レイヤー2" ]
skill: intermediate
published: 2022-03-30
lang: ja
---
-[Optimism](https://www.optimism.io/)は、[Optimisitc ロールアップ](/developers/docs/scaling/optimistic-rollups/)を行うメカニズムのひとつです。 Optimistic ロールアップでは、ネットワークに含まれるすべてノードではなく一部のノードのみを対象としてトランザクションが処理されるため、イーサリアム・メインネット(「レイヤー1」または「L1」とも呼ばれます)よりも手数料が低くなります。 一部のノードのみを対象として処理されるものの、すべてのデータはL1に書き込まれるため、あらゆる事項につき、メインネットにおける完全性および可用性についての保証に基づいて証明、再構築することが可能です。
+[Optimism](https://www.optimism.io/)は[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups/)です。
+オプティミスティック・ロールアップは、ネットワーク上のすべてのノードではなく一部のノードのみでトランザクションが処理されるため、イーサリアムメインネット(レイヤー1またはL1とも呼ばれる)よりもはるかに低い価格でトランザクションを処理できます。
+同時に、すべてのデータがL1に書き込まれるため、メインネットの完全性と可用性の保証の元で、すべてを証明、再構築することが可能です。
-Optimism(またはその他のL2)上でL1のアセットを使用するには、当該アセットを[ブリッジ](/bridges/#prerequisites)する必要があります。 アセットをブリッジする方法のひとつとして、アセット(最も一般的なのは、ETHや[ERC-20 トークン](/developers/docs/standards/tokens/erc-20/)です)をL1上でロックし、L2上で同等のアセットを受け取る方法があります。 最終的に、これらのアセットを所持するユーザーは、再度L1にブリッジする必要があるでしょう。 L1にアセットをブリッジすると、L2上のアセットはバーンされ、L1上のアセットがユーザーに戻されます。
+Optimism(またはその他のL2)でL1アセットを使用するには、アセットを[ブリッジ](/bridges/#prerequisites)する必要があります。
+これを実現する一つの方法は、ユーザーがL1でアセット(最も一般的なのはETHと[ERC-20トークン](/developers/docs/standards/tokens/erc-20/)です)をロックし、L2で使用する同等のアセットを受け取ることです。
+最終的に、それらのアセットを手にした人は、L1にブリッジして戻したいと思うかもしれません。
+このとき、L2のアセットはバーンされ、L1でユーザーに返還されます。
-以上が、[Optimismにおける標準ブリッジ](https://docs.optimism.io/app-developers/bridging/standard-bridge)の仕組みです。 この記事では、このブリッジ機能についてSolidity上で適切に作成したソースコードを確認しながら、その仕組みを学びます。
+これが、[Optimism標準ブリッジ](https://docs.optimism.io/app-developers/bridging/standard-bridge)の仕組みです。
+この記事では、そのブリッジのソースコードをレビューし、その仕組みを確認し、適切に記述されたSolidityコードの例として学習します。
## 制御フロー {#control-flows}
-ブリッジは、2つのメインフローで構成されます:
+ブリッジには、2つの主要なフローがあります:
-- L1からL2への入金
-- L2からL1への出金
+- デポジット (L1からL2へ)
+- 引き出し (L2からL1へ)
-### 入金フロー {#deposit-flow}
+### デポジットフロー {#deposit-flow}
-#### L1 {#deposit-flow-layer-1}
+#### レイヤー1 {#deposit-flow-layer-1}
-1. ERC-20を入金する場合、入金者はブリッジに対し、入金額を使用するためのアローワンスを与えます。
-2. 入金者は、L1ブリッジ(`depositERC20`、`depositERC20To`、 `depositETH`あるいは `depositETHTo`)を呼び出します。
-3. L1ブリッジが、ブリッジされたアセットを保持します。
- - ETHの場合:アセットは、呼び出しを通じて入金者に送信されます。
- - ERC-20トークンの場合:アセットは、入金者が提供するアローワンスを使用して、ブリッジ自体に送信されます。
-4. L1のブリッジが、クロスドメインのメッセージメカニズムを通じて、L2のブリッジ上で`finalizeDeposit`を呼び出します。
+1. ERC-20をデポジットする場合、デポジットする人は、デポジットされる金額を使用する権限をブリッジに与えます。
+2. デポジットする人はL1ブリッジを呼び出します(`depositERC20`、`depositERC20To`、`depositETH`、または`depositETHTo`)
+3. L1ブリッジは、ブリッジされた資産の所有権を取得します。
+ - ETH: アセットは呼び出しの一部として、デポジットする人によって転送されます。
+ - ERC-20: アセットは、デポジットする人から提供された権限を使用して、ブリッジによってそれ自体に転送されます。
+4. L1ブリッジは、クロスドメインメッセージメカニズムを使用して、L2ブリッジの`finalizeDeposit`を呼び出します。
-#### L2 {#deposit-flow-layer-2}
+#### レイヤー2 {#deposit-flow-layer-2}
-5. L2のブリッジは、`finalizeDeposit`の呼び出しにつき、以下が適切であることを確認します:
- - クロスドメインのメッセージ・コントラクトからの呼び出しであること。
- - ブリッジがL1上で作成されたものであること。
-6. L2のブリッジはさらに、L2上のERC-20トークンコントラクトにつき、以下が適切であることを確認します:
- - L2のコントラクトにおいて、L1における対応するコントラクトが、L1上で送信されたトークンと同一であると報告していること。
- - L2のコントラクトが、([ERC-165を使用した](https://eips.ethereum.org/EIPS/eip-165))適切なインターフェイスをサポートすると報告していること。
-7. L2のコントラクトが適切であると確認できた場合は、適切なアドレスに対して希望する量のトークンをミントするために、そのコントラクトを呼び出してください。 そうでない場合は、出金プロセスを開始して、ユーザーがL1上のトークンを請求できるようにします。
+5. L2ブリッジは`finalizeDeposit`への呼び出しが正当なものであることを検証します:
+ - クロスドメインメッセージコントラクトからの呼び出しであること
+ - もともとL1のブリッジからの呼び出しであること
+6. L2ブリッジは、L2上のERC-20トークンコントラクトが正しいものであるかを確認します:
+ - L2コントラクトは、そのL1の対応物がL1から来たトークンと同じものであることを報告します。
+ - L2コントラクトは正しいインターフェースをサポートしていることを報告します([ERC-165を使用](https://eips.ethereum.org/EIPS/eip-165))。
+7. L2コントラクトが正しい場合、それを呼び出して適切な数のトークンを適切なアドレスにミントします。 そうでない場合、ユーザーがL1でトークンを要求できるように、引き出しプロセスを開始します。
-### 出金フロー {#withdrawal-flow}
+### 引き出しフロー {#withdrawal-flow}
#### レイヤー2 {#withdrawal-flow-layer-2}
-1. 出金者は、L2のブリッジ(`withdraw`または`withdrawTo`)を呼び出します 。
-2. L2のブリッジは、`msg.sender`が所有する適切な数のトークンをバーンします。
-3. L2のブリッジは、クロスドメインのメッセージ・メカニズムを利用して、L1のブリッジ上で、 `finalizeETHWithdrawal`または`finalizeERC20Withdrawal`を呼び出します。
+1. 引き出す人はL2ブリッジを呼び出します(`withdraw`または`withdrawTo`)
+2. L2ブリッジは、`msg.sender`に属する適切な数のトークンをバーンします。
+3. L2ブリッジは、クロスドメインメッセージメカニズムを使用して、L1ブリッジで`finalizeETHWithdrawal`または`finalizeERC20Withdrawal`を呼び出します。
-#### L1 {#withdrawal-flow-layer-1}
+#### レイヤー1 {#withdrawal-flow-layer-1}
-4. L1のブリッジは、`finalizeETHWithdraw`または`finalizeERC20Withdral`の呼び出しにつき、以下が適切であるかを確認します:
- - クロスドメインのメッセージ・メカニズムを経由していること。
- - L2のブリッジで作成されていること。
-5. L1のブリッジは、適切な資産(ETHまたはERC-20)を適切なアドレスに送信します。
+4. L1ブリッジは、`finalizeETHWithdrawal`または`finalizeERC20Withdrawal`への呼び出しが正当であることを検証します:
+ - クロスドメインメッセージメカニズムからの呼び出しであること
+ - もともとL2のブリッジからの呼び出しであること
+5. L1ブリッジは、適切な資産(ETHまたはERC-20)を適切なアドレスに転送します。
-## レイヤー1のコード {#layer-1-code}
+## レイヤー1コード {#layer-1-code}
-以下は、イーサリアム・メインネット(L1)で実行されるコードです。
+これは、L1であるイーサリアムメインネットで実行されるコードです。
### IL1ERC20Bridge {#IL1ERC20Bridge}
-このインターフェイスは、[こちら](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol)で定義されています。 このインターフェイスには、ERC-20トークンをブリッジするために必要な機能と定義が含まれます。
+[このインターフェースはここで定義されています](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol)。
+これには、ERC-20トークンのブリッジングに必要な関数と定義が含まれています。
```solidity
// SPDX-License-Identifier: MIT
```
-Optimismのコードの大部分は、[MITライセンス](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-)に基づいています。
+[OptimismのコードのほとんどはMITライセンスの下でリリースされています](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-)。
```solidity
pragma solidity >0.5.0 <0.9.0;
```
-本記事の執筆時点で、Solidityの最新バージョンは0.8.12です。 バージョン0.9.0においてこのコードが利用できるかは、同バージョンがリリースされるまで不明です。
+執筆時点で、Solidityの最新バージョンは0.8.12です。
+バージョン0.9.0がリリースされるまで、このコードに互換性があるかどうかはわかりません。
```solidity
/**
@@ -86,20 +91,23 @@ pragma solidity >0.5.0 <0.9.0;
*/
interface IL1ERC20Bridge {
/**********
- * Events *
+ * イベント *
**********/
event ERC20DepositInitiated(
```
-Optimismのブリッジ関連用語において、_入金_とは、L1からL2に送金することを意味し、_出金_とは、L2からL1へ送金することを意味します。
+Optimismのブリッジ用語では、「デポジット」はL1からL2への転送を意味し、「引き出し」はL2からL1への転送を意味します。
```solidity
address indexed _l1Token,
address indexed _l2Token,
```
-ほとんどの場合、L1上のERC-20のアドレスは、L2上で対応するERC-20のアドレスとは異なります。 トークンアドレスのリストは、[こちら](https://static.optimism.io/optimism.tokenlist.json)を参照してください。 `chainId`が1のアドレスであれば、L1 (メインネット) 上のトークンであり、`chainId`が10のアドレスでれば、L2(Optimism)上のトークンです。 残りの2つの`chainId`の値は、Kovanテストネットワーク(42)とOptimistic Kovanテストネットワーク(69)のためのものです。
+ほとんどの場合、L1上のERC-20のアドレスは、L2上の同等のERC-20のアドレスとは異なります。
+[トークンアドレスのリストはこちらで確認できます](https://static.optimism.io/optimism.tokenlist.json)。
+`chainId`が1のアドレスはL1 (メインネット) 上にあり、`chainId`が10のアドレスはL2 (Optimism) 上にあります。
+他の2つの`chainId`の値は、Kovanテストネットワーク(42)とOptimistic Kovanテストネットワーク(69)のものです。
```solidity
address indexed _from,
@@ -109,7 +117,7 @@ Optimismのブリッジ関連用語において、_入金_とは、L1からL2に
);
```
-転送にはメモを追加することができ、メモは転送を報告するイベントに追加されます。
+転送にメモを追加することが可能で、その場合、それらを報告するイベントに追加されます。
```solidity
event ERC20WithdrawalFinalized(
@@ -122,33 +130,34 @@ Optimismのブリッジ関連用語において、_入金_とは、L1からL2に
);
```
-入金と出金の両方向につき、同じブリッジのコントラクトが処理します。 つまり、L1のブリッジでは入金を初期化し、出金を確定します。
+同じブリッジコントラクトが、両方向の転送を処理します。
+L1ブリッジの場合、これはデポジットの開始と引き出しの完了を意味します。
```solidity
/********************
- * Public Functions *
+ * 公開関数 *
********************/
/**
- * @dev get the address of the corresponding L2 bridge contract.
- * @return Address of the corresponding L2 bridge contract.
+ * @dev 対応するL2ブリッジコントラクトのアドレスを取得します。
+ * @return 対応するL2ブリッジコントラクトのアドレス。
*/
function l2TokenBridge() external returns (address);
```
-実際には、L2のブリッジは事前にデプロイされており、常に「`0x42000000000000000000000000000000000000000010`」のアドレスとなるため、この機能は必要ではありません。 この機能は、L2上のブリッジとの対称性を確保するためのものです。というのも、L1ブリッジのアドレスを確認することは無意味とは_言えない_ためです。
+この関数は、L2では事前にデプロイされたコントラクトであるため、実際には必要ありません。したがって、常にアドレス`0x4200000000000000000000000000000000000010`にあります。
+これはL2ブリッジとの対称性のためにあります。なぜなら、L1ブリッジのアドレスは簡単にはわからないからです。
```solidity
/**
- * @dev deposit an amount of the ERC20 to the caller's balance on L2.
- * @param _l1Token Address of the L1 ERC20 we are depositing
- * @param _l2Token Address of the L1 respective L2 ERC20
- * @param _amount Amount of the ERC20 to deposit
- * @param _l2Gas Gas limit required to complete the deposit on L2.
- * @param _data Optional data to forward to L2. This data is provided
- * solely as a convenience for external contracts. Aside from enforcing a maximum
- * length, these contracts provide no guarantees about its content.
+ * @dev L2の呼び出し元残高にERC20の金額をデポジットします。
+ * @param _l1Token デポジットするL1 ERC20のアドレス
+ * @param _l2Token L1の各L2 ERC20のアドレス
+ * @param _amount デポジットするERC20の金額
+ * @param _l2Gas L2でデポジットを完了するために必要なガスリミット。
+ * @param _data L2に転送するオプションのデータ。このデータは、外部コントラクトの便宜のためにのみ提供されます。
+ * 最大長を強制する以外、これらのコントラクトはその内容について何の保証も提供しません。
*/
function depositERC20(
address _l1Token,
@@ -159,19 +168,20 @@ Optimismのブリッジ関連用語において、_入金_とは、L1からL2に
) external;
```
-`_l2Gas`のパラメータは、このトランザクションが使用できるL2上のガス量です。 この値は、[一定の(高い)上限まで無料であるため](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2)、ミント時にERC-20がコントラクトが特に異常な動作を行わない限り、問題は発生しません。 以下の関数は、異なるブロックチェーンにおける同一アドレスにアセットをブリッジしたいという一般的なシナリオで用いることができます。
+`_l2Gas`パラメータは、トランザクションが使用できるL2ガスの量です。
+[一定の(高い)制限まで、これは無料です](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2)。そのため、ミント時にERC-20コントラクトが本当に奇妙なことをしない限り、問題にはならないはずです。
+この関数は、ユーザーが異なるブロックチェーン上の同じアドレスに資産をブリッジするという、一般的なシナリオに対応します。
```solidity
/**
- * @dev deposit an amount of ERC20 to a recipient's balance on L2.
- * @param _l1Token Address of the L1 ERC20 we are depositing
- * @param _l2Token Address of the L1 respective L2 ERC20
- * @param _to L2 address to credit the withdrawal to.
- * @param _amount Amount of the ERC20 to deposit.
- * @param _l2Gas Gas limit required to complete the deposit on L2.
- * @param _data Optional data to forward to L2. This data is provided
- * solely as a convenience for external contracts. Aside from enforcing a maximum
- * length, these contracts provide no guarantees about its content.
+ * @dev L2の受取人の残高にERC20の金額をデポジットします。
+ * @param _l1Token デポジットするL1 ERC20のアドレス
+ * @param _l2Token L1の各L2 ERC20のアドレス
+ * @param _to 引き出しの入金先L2アドレス。
+ * @param _amount デポジットするERC20の金額。
+ * @param _l2Gas L2でデポジットを完了するために必要なガスリミット。
+ * @param _data L2に転送するオプションのデータ。このデータは、外部コントラクトの便宜のためにのみ提供されます。
+ * 最大長を強制する以外、これらのコントラクトはその内容について何の保証も提供しません。
*/
function depositERC20To(
address _l1Token,
@@ -183,26 +193,24 @@ Optimismのブリッジ関連用語において、_入金_とは、L1からL2に
) external;
```
-次のコードは`depositERC20`とほぼ同一の関数ですが、ERC-20トークンを異なるアドレスに送信することができます。
+この関数は`depositERC20`とほぼ同じですが、ERC-20を異なるアドレスに送信できます。
```solidity
/*************************
- * Cross-chain Functions *
+ * クロスチェーン関数 *
*************************/
/**
- * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
- * L1 ERC20 token.
- * This call will fail if the initialized withdrawal from L2 has not been finalized.
+ * @dev L2からL1への引き出しを完了し、受取人のL1 ERC20トークン残高に資金を入金します。
+ * この呼び出しは、L2からの初期化された引き出しが完了していない場合、失敗します。
*
- * @param _l1Token Address of L1 token to finalizeWithdrawal for.
- * @param _l2Token Address of L2 token where withdrawal was initiated.
- * @param _from L2 address initiating the transfer.
- * @param _to L1 address to credit the withdrawal to.
- * @param _amount Amount of the ERC20 to deposit.
- * @param _data Data provided by the sender on L2. This data is provided
- * solely as a convenience for external contracts. Aside from enforcing a maximum
- * length, these contracts provide no guarantees about its content.
+ * @param _l1Token finalizeWithdrawalの対象となるL1トークンのアドレス。
+ * @param _l2Token 引き出しが開始されたL2トークンのアドレス。
+ * @param _from 転送を開始するL2アドレス。
+ * @param _to 引き出しの入金先L1アドレス。
+ * @param _amount デポジットするERC20の金額。
+ * @param _data L2の送信者から提供されたデータ。このデータは、外部コントラクトの便宜のためにのみ提供されます。
+ * 最大長を強制する以外、これらのコントラクトはその内容について何の保証も提供しません。
*/
function finalizeERC20Withdrawal(
address _l1Token,
@@ -215,16 +223,20 @@ Optimismのブリッジ関連用語において、_入金_とは、L1からL2に
}
```
-Optimismにおける出金(および、他のL2からL1へのメッセージ送信)は、2つのステップで実行されます:
+Optimismでの引き出し(およびL2からL1への他のメッセージ)は、2段階のプロセスです:
-1. L2でトランザクションを開始する。
-2. L1で、トランザクションを確定/クレームする。 L1でのトランザクションは、L2でのトランザクションに対する[異議申し立て期間](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) が終了した後で実行可能になります。
+1. L2での開始トランザクション。
+2. L1での完了または請求トランザクション。
+ このトランザクションは、L2トランザクションの[フォールトチャレンジ期間](https://community.optimism.io/docs/how-optimism-works/#fault-proofs)が終了した後に実行される必要があります。
### IL1StandardBridge {#il1standardbridge}
-このインターフェイスは、[こちら](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol)で定義されています。 このブリッジには、ETHを対象とするイベントおよび関数の定義が含まれています。 これらの定義は、ERC-20トークンを対象とする`IL1ERC20Bridge`の定義とほぼ同一です。
+[このインターフェースはここで定義されています](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol)。
+このファイルには、ETHのイベントと関数の定義が含まれています。
+これらの定義は、上記の`IL1ERC20Bridge`で定義されたERC-20のものと非常によく似ています。
-一部のERC-20トークンは、標準ブリッジでは処理できず、カスタム処理が必要となるため、このブリッジのインターフェイスは2つのファイルで構成されています。 これにより、カスタム処理が必要なトークンを取り扱うブリッジについては`IL1ERC20Bridge`を実装すればよく、ETHのブリッジ機能を実装する必要はありません。
+ブリッジインターフェースは2つのファイルに分かれています。なぜなら、一部のERC-20トークンはカスタム処理が必要で、標準ブリッジでは処理できないからです。
+これにより、そのようなトークンを処理するカスタムブリッジは、`IL1ERC20Bridge`を実装でき、ETHもブリッジする必要がありません。
```solidity
// SPDX-License-Identifier: MIT
@@ -237,7 +249,7 @@ import "./IL1ERC20Bridge.sol";
*/
interface IL1StandardBridge is IL1ERC20Bridge {
/**********
- * Events *
+ * イベント *
**********/
event ETHDepositInitiated(
address indexed _from,
@@ -247,32 +259,33 @@ interface IL1StandardBridge is IL1ERC20Bridge {
);
```
-このイベントは、ERC-20トークン用のイベント(`ERC20DepositInitiated`)とほぼ同一ですが、L1およびL2上のトークンアドレスが含まれていない点が異なります。 他のイベントおよび関数についても、この点が異なります。
+このイベントは、ERC-20バージョン(`ERC20DepositInitiated`)とほぼ同じですが、L1とL2のトークンアドレスがない点が異なります。
+他のイベントや関数についても同様です。
```solidity
event ETHWithdrawalFinalized(
.
- 。
- 。
+ .
+ .
);
/********************
- * Public Functions *
+ * 公開関数 *
********************/
/**
- * @dev Deposit an amount of the ETH to the caller's balance on L2.
- 。
- 。
- 。
+ * @dev L2の呼び出し元残高にETHの金額をデポジットします。
+ .
+ .
+ .
*/
function depositETH(uint32 _l2Gas, bytes calldata _data) external payable;
/**
- * @dev Deposit an amount of ETH to a recipient's balance on L2.
- 。
- 。
- 。
+ * @dev L2の受取人の残高にETHの金額をデポジットします。
+ .
+ .
+ .
*/
function depositETHTo(
address _to,
@@ -281,16 +294,15 @@ interface IL1StandardBridge is IL1ERC20Bridge {
) external payable;
/*************************
- * Cross-chain Functions *
+ * クロスチェーン関数 *
*************************/
/**
- * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the
- * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called
- * before the withdrawal is finalized.
- 。
- 。
- 。
+ * @dev L2からL1への引き出しを完了し、受取人のL1 ETHトークン残高に資金を入金します。
+ * この関数はxDomainMessengerのみが呼び出せるため、引き出しが完了する前に呼び出されることはありません。
+ .
+ .
+ .
*/
function finalizeETHWithdrawal(
address _from,
@@ -303,7 +315,7 @@ interface IL1StandardBridge is IL1ERC20Bridge {
### CrossDomainEnabled {#crossdomainenabled}
-[このコントラクト](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol)は、[L1](#the-l1-bridge-contract)および[L2](#the-l2-bridge-contract)の両方のブリッジにおいて継承され、相手のレイヤーに対してメッセージを送信します。
+[このコントラクト](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol)は、両方のブリッジ([L1](#the-l1-bridge-contract)と[L2](#the-l2-bridge-contract))によって継承され、他のレイヤーにメッセージを送信します。
```solidity
// SPDX-License-Identifier: MIT
@@ -313,52 +325,54 @@ pragma solidity >0.5.0 <0.9.0;
import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol";
```
-[このインターフェース](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol)は、クロスドメインのメッセンジャーを用いて、相手のレイヤーに対するメッセージの送信方法をコントラクトに通知するものです。 このクロスドメインのメッセンジャーは完全に別個のシステムであるため、今後改めて記事を執筆したいと考えています。
+[このインターフェース](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol)は、クロスドメインメッセンジャーを使用して、他のレイヤーにメッセージを送信する方法をコントラクトに伝えます。
+このクロスドメインメッセンジャーはまったく別のシステムであり、それ自体で記事にする価値があるため、将来的に書きたいと思っています。
```solidity
/**
* @title CrossDomainEnabled
- * @dev Helper contract for contracts performing cross-domain communications
+ * @dev クロスドメイン通信を実行するコントラクトのヘルパーコントラクト
*
- * Compiler used: defined by inheriting contract
+ * 使用されるコンパイラ: 継承するコントラクトによって定義
*/
contract CrossDomainEnabled {
/*************
- * Variables *
+ * 変数 *
*************/
- // Messenger contract used to send and receive messages from the other domain.
+ // 他のドメインからメッセージを送受信するために使用されるメッセンジャーコントラクト
address public messenger;
/***************
- * Constructor *
+ * コンストラクタ *
***************/
/**
- * @param _messenger Address of the CrossDomainMessenger on the current layer.
+ * @param _messenger 現在のレイヤー上のCrossDomainMessengerのアドレス
*/
constructor(address _messenger) {
messenger = _messenger;
}
```
-このコントラクトが知る必要がある唯一のパラメータは、当該レイヤーにおけるクロスドメイン・メッセンジャーのアドレスです。 このパラメータは、コンストラクタ上で設定された後は変更されません。
+コントラクトが知る必要がある唯一のパラメータは、このレイヤー上のクロスドメインメッセンジャーのアドレスです。
+このパラメータはコンストラクタで一度設定され、変更されることはありません。
```solidity
/**********************
- * Function Modifiers *
+ * 関数修飾子 *
**********************/
/**
- * Enforces that the modified function is only callable by a specific cross-domain account.
- * @param _sourceDomainAccount The only account on the originating domain which is
- * authenticated to call this function.
+ * 変更された関数が特定のクロスドメインアカウントによってのみ呼び出し可能であることを強制します。
+ * @param _sourceDomainAccount この関数を呼び出すことが認証されている、発信元ドメインの唯一のアカウント。
*/
modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) {
```
-クロスドメインのメッセージング機能は、ブロックチェーン(イーサリアム・メインネットまたはOptimism)上で実行されているあらゆるコントラクトからアクセス可能です。 ただし、相手方のブリッジから送信された特定のメッセージ_のみ_を信頼するためには、双方のブリッジが必要になります。
+クロスドメインメッセージングは、実行されているブロックチェーン(イーサリアムメインネットまたはOptimism)上のどのコントラクトからもアクセスできます。
+しかし、各側のブリッジが、他の側のブリッジから来た場合にのみ特定のメッセージを信頼するようにする必要があります。
```solidity
require(
@@ -367,7 +381,7 @@ contract CrossDomainEnabled {
);
```
-適切なクロスドメイン・メッセンジャー (以下の`messenger`を参照)から送信されたメッセージのみ、信頼できます。
+適切なクロスドメインメッセンジャー(以下で見るように`messenger`)からのメッセージのみが信頼できます。
```solidity
@@ -377,9 +391,10 @@ contract CrossDomainEnabled {
);
```
-クロスドメイン・メッセンジャーでは、[the `.xDomainMessageSender()` 関数](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128)を用いて、相手方のレイヤーにメッセージを送信するアドレスを提供します。 当該メッセージで開始されたトランザクションで呼び出す場合に限り、メッセージの送信元アドレスを表示することができます。
+クロスドメインメッセンジャーが、他のレイヤーでメッセージを送信したアドレスを提供する方法は、[`.xDomainMessageSender()`関数](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128)です。
+メッセージによって開始されたトランザクションで呼び出される限り、この情報を提供できます。
-このメッセージにつき、相手方のブリッジから送信されたものであることを確認する必要があります。
+受け取ったメッセージが他のブリッジから来たことを確認する必要があります。
```solidity
@@ -387,29 +402,28 @@ contract CrossDomainEnabled {
}
/**********************
- * Internal Functions *
+ * 内部関数 *
**********************/
/**
- * Gets the messenger, usually from storage. This function is exposed in case a child contract
- * needs to override.
- * @return The address of the cross-domain messenger contract which should be used.
+ * 通常はストレージからメッセンジャーを取得します。この関数は、子コントラクトがオーバーライドする必要がある場合に公開されます。
+ * @return 使用すべきクロスドメインメッセンジャーコントラクトのアドレス。
*/
function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) {
return ICrossDomainMessenger(messenger);
}
```
-この機能は、クロスドメイン・メッセンジャーを返します。 `messenger`の変数ではなく関数を使うのは、この値を継承するコントラクトに対し、どのクロスドメイン・メッセンジャーを使用するかを特定するアルゴリズムを使用できるようにするためです。
+この関数は、クロスドメインメッセンジャーを返します。
+変数`messenger`ではなく関数を使用するのは、これから継承するコントラクトが、どのクロスドメインメッセンジャーを使用するかを指定するアルゴリズムを使用できるようにするためです。
```solidity
/**
- * Sends a message to an account on another domain
- * @param _crossDomainTarget The intended recipient on the destination domain
- * @param _message The data to send to the target (usually calldata to a function with
- * `onlyFromCrossDomainAccount()`)
- * @param _gasLimit The gasLimit for the receipt of the message on the target domain.
+ * 他のドメインのアカウントにメッセージを送信します。
+ * @param _crossDomainTarget 宛先ドメインの意図した受信者
+ * @param _message ターゲットに送信するデータ(通常は`onlyFromCrossDomainAccount()`を持つ関数へのcalldata)
+ * @param _gasLimit ターゲットドメインでのメッセージのレシートのgasLimit。
*/
function sendCrossDomainMessage(
address _crossDomainTarget,
@@ -417,17 +431,18 @@ contract CrossDomainEnabled {
bytes memory _message
```
-最後に、次の関数は相手方のレイヤーにメッセージを送信するものです。
+最後に、他のレイヤーにメッセージを送信する関数です。
```solidity
) internal {
// slither-disable-next-line reentrancy-events, reentrancy-benign
```
-[Slither](https://github.com/crytic/slither)は、Optimismにおいて、すべてのコントラクトの脆弱性やその他の潜在的な問題箇所を特定するために実行される静的解析ツールです。 ここでは、以下の行により2つの脆弱性がトリガーされます。
+[Slither](https://github.com/crytic/slither)は、Optimismがすべてのコントラクトで実行し、脆弱性やその他の潜在的な問題を検出するための静的アナライザーです。
+この場合、次の行は2つの脆弱性を引き起こします:
-1. [リエントランシーのイベント](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3)
-2. [無害のリエントランシー](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2)
+1. [再入可能性イベント](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3)
+2. [良性の再入可能性](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2)
```solidity
getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit);
@@ -435,18 +450,19 @@ contract CrossDomainEnabled {
}
```
-このケースでは、Slitherが当該情報を把握する方法を持たない場合でも、`getCrossDomainMessenger()`が信頼できるアドレスを返すと分かっているため、リエントランシーについて心配する必要はありません。
+この場合、`getCrossDomainMessenger()`が信頼できるアドレスを返すことがわかっているため、再入可能性について心配する必要はありません。たとえSlitherがそれを知る方法がなくてもです。
-### L1上のブリッジコントラクト {#the-l1-bridge-contract}
+### L1ブリッジコントラクト {#the-l1-bridge-contract}
-このコントラクトのソースコードは、[こちら](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1StandardBridge.sol)で入手してください。
+[このコントラクトのソースコードはこちらです](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1StandardBridge.sol)。
```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
```
-このインターフェイスは、他のコントラクトにも含まれる場合があるため、Solidityのさまざまなバージョンをサポートする必要があります。 しかしここでは、ブリッジ自体がコントラクトであるため、使用できるSolidityのバージョンを限定することが可能です。
+インターフェースは他のコントラクトの一部になる可能性があるため、幅広いSolidityバージョンをサポートする必要があります。
+しかし、ブリッジ自体は私たちのコントラクトであり、使用するSolidityバージョンについて厳密にすることができます。
```solidity
/* Interface Imports */
@@ -454,124 +470,139 @@ import { IL1StandardBridge } from "./IL1StandardBridge.sol";
import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol";
```
-[IL1ERC20Bridge](#IL1ERC20Bridge)と[IL1StandardBridge](#IL1StandardBridge)については、すでに説明しました。
+[IL1ERC20Bridge](#IL1ERC20Bridge)と[IL1StandardBridge](#IL1StandardBridge)については、上記で説明しました。
```solidity
import { IL2ERC20Bridge } from "../../L2/messaging/IL2ERC20Bridge.sol";
```
-[このインターフェイス](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol)では、L2上で標準ブリッジを制御するためのメッセージを作成します。
+[このインターフェース](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol)により、L2の標準ブリッジを制御するためのメッセージを作成できます。
```solidity
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
```
-[このインターフェイス](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)は、ERC-20のコントラクトを制御するために使用します。 詳細については、[こちら](/developers/tutorials/erc20-annotated-code/#the-interface)をご覧ください。
+[このインターフェース](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)により、ERC-20コントラクトを制御できます。
+[詳細はこちらで読むことができます](/developers/tutorials/erc20-annotated-code/#the-interface)。
```solidity
/* Library Imports */
import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol";
```
-[上記](#crossdomainenabled)で説明したように、このコントラクトはレイヤー間のメッセージングに使用します。
+[上で説明したように](#crossdomainenabled)、このコントラクトはレイヤー間メッセージングに使用されます。
```solidity
import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol";
```
-[`Lib_PredeployAddresses`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/constants/Lib_PredeployAddresses.sol)には、常に同じアドレスを持つL2上のコントラクトのアドレスが含まれています。 これには、L2上の標準ブリッジが含まれます。
+`Lib_PredeployAddresses`には、常に同じアドレスを持つL2コントラクトのアドレスが含まれています。 これにはL2の標準ブリッジが含まれます。
```solidity
import { Address } from "@openzeppelin/contracts/utils/Address.sol";
```
-[OpenZeppelinのアドレス・ユーティリティ](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol)です。 これは、コントラクト上のアドレスと外部所有アカウント(EOA)に含まれるアドレスを区別するために使われます。
+[OpenZeppelinのアドレスユーティリティ](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol)。 これは、コントラクトアドレスと外部所有アカウント(EOA)に属するアドレスを区別するために使用されます。
-これは、直接の呼び出しとコントラクトのコンストラクタで作成した呼び出しを区別できないため完全なソリューションとは言えませんが、少なくとも、よくあるユーザーエラーを特定、防止することは可能です。
+これは、直接の呼び出しとコントラクトのコンストラクタからの呼び出しを区別する方法がないため、完璧な解決策ではないことに注意してください。しかし、少なくともこれにより、一般的なユーザーエラーを特定し、防ぐことができます。
```solidity
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
```
-[ERC-20標準](https://eips.ethereum.org/EIPS/eip-20)では、コントラクトが実行失敗を報告する手段として以下の2つがあります:
+[ERC-20標準](https://eips.ethereum.org/EIPS/eip-20)は、コントラクトが失敗を報告する2つの方法をサポートしています:
1. 元に戻す
2. `false`を返す
-両方のケースに対応するとコードがより複雑になるため、代わりに[OpenZeppelinの`SafeERC20`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol)を使用します。これにより、[失敗した場合は常に元に戻されます](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96)。
+両方のケースを処理するとコードが複雑になるため、代わりにOpenZeppelinの[`SafeERC20`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol)を使用します。これにより、[すべての失敗が revert になる](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96)ことが保証されます。
```solidity
/**
* @title L1StandardBridge
- * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard
- * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits
- * and listening to it for newly finalized withdrawals.
+ * @dev L1 ETHおよびERC20ブリッジは、デポジットされたL1資金と、L2で使用されている標準トークンを保存するコントラクトです。
+ * 対応するL2ブリッジと同期し、デポジットを通知し、新しく完了した引き出しをリッスンします。
*
*/
contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {
using SafeERC20 for IERC20;
```
-この行は、`IERC20`インターフェイスを使用する際に、常に`IERC20`ラッパーを用いることを指定するものです。
+この行は、`IERC20`インターフェースを使用するたびに`SafeERC20`ラッパーを使用するように指定する方法です。
```solidity
/********************************
- * External Contract References *
+ * 外部コントラクト参照 *
********************************/
address public l2TokenBridge;
```
-[L2StandardBridge](#the-l2-bridge-contract)のアドレスです。
+[L2StandardBridge](#the-l2-bridge-contract)のアドレス。
```solidity
- // Maps L1 token to L2 token to balance of the L1 token deposited
+ // L1トークンをL2トークンにマッピングし、デポジットされたL1トークンの残高にマッピングします。
mapping(address => mapping(address => uint256)) public deposits;
```
-[2次元スパース配列](https://en.wikipedia.org/wiki/Sparse_matrix)を定義するには、このようなダブル[マッピング](https://www.tutorialspoint.com/solidity/solidity_mappings.htm)を用います。 このデータ構造の値は、`deposit[L1 token addr][L2 token addr]`として識別されます。 初期値はゼロになります。 ゼロ以外の値が設定されたセルのみが、ストレージに書き込まれます。
+このような二重の[マッピング](https://www.tutorialspoint.com/solidity/solidity_mappings.htm)は、[2次元スパース配列](https://en.wikipedia.org/wiki/Sparse_matrix)を定義する方法です。
+このデータ構造の値は、`deposit[L1トークンアドレス][L2トークンアドレス]`として識別されます。
+デフォルト値はゼロです。
+異なる値に設定されたセルのみがストレージに書き込まれます。
```solidity
/***************
- * Constructor *
+ * コンストラクタ *
***************/
- // This contract lives behind a proxy, so the constructor parameters will go unused.
+ // このコントラクトはプロキシの背後にあるため、コンストラクタのパラメータは使用されません。
constructor() CrossDomainEnabled(address(0)) {}
```
-ストレージ内のすべての変数をコピーせずに、このコントラクトを更新するには、 [`プロキシ`](https://docs.openzeppelin.com/contracts/3.x/api/proxy)を使用します。プロキシは、[`delegatecall`](https://solidity-by-example.org/delegatecall/)を用いて、プロキシのコントラクトにおいてアドレスが保存された別個のコントラクトに対して呼び出しを転送するものです(コントラクトを更新する際に、プロキシに対してこのアドレスを変更するように指示することになります)。 「`delegatecall`」を使用すると、ストレージは、_呼び出し元の_コントラクトのストレージのままになるため、すべてのコントラクト状態変数の値は影響を受けません。
+ストレージ内のすべての変数をコピーすることなく、このコントラクトをアップグレードできるようにしたいです。
+そのためには、[`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy)を使用します。これは、[`delegatecall`](https://solidity-by-example.org/delegatecall/)を使用して、プロキシコントラクトによってアドレスが保存されている別のコントラクトに呼び出しを転送するコントラクトです(アップグレード時に、プロキシにそのアドレスを変更するように指示します)。
+`delegatecall`を使用すると、ストレージは呼び出し元コントラクトのストレージのままになるため、すべてのコントラクトの状態変数の値は影響を受けません。
-このパターンを用いる効果のひとつとして、`delegatecall`の_呼び出し先_であるコントラクトのストレージが使用されないため、送信されたコンストラクタの値が意味を持たない点が挙げられます。 これこそ、`CrossDomainEnabled`のコンストラクタに対して無意味な値を入力できる理由です。 同時に、以下の初期化がコンストラクタとは別個に存在するである理由でもあります。
+このパターンの1つの効果は、`delegatecall`の呼び出し先であるコントラクトのストレージが使用されないため、それに渡されるコンストラクタの値は重要ではないということです。
+これが、`CrossDomainEnabled`コンストラクタに無意味な値を提供できる理由です。
+また、以下の初期化がコンストラクタから分離されている理由でもあります。
```solidity
/******************
- * Initialization *
+ * 初期化 *
******************/
/**
- * @param _l1messenger L1 Messenger address being used for cross-chain communications.
- * @param _l2TokenBridge L2 standard bridge address.
+ * @param _l1messenger クロスチェーン通信に使用されるL1メッセンジャーアドレス。
+ * @param _l2TokenBridge L2標準ブリッジアドレス。
*/
// slither-disable-next-line external-function
```
-この[Slitherのテスト](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external)は、コントラクトのコードにより呼び出される関数以外の関数であり、`public`ではなく、`external`と宣言される関数を特定するものです。 `external`関数のガス代は、コールデータに含まれるパラメータで指定できるため、安価に抑えることができます。 `public`と宣言された関数は、コントラクト内でアクセス可能である必要があります。 コントラクトはそれ自体のコールデータを変更できないため、パラメータはメモリに保存する必要があります。 このような関数を外部から呼び出す場合、コールデータをメモリにコピーする必要があるため、ガス代が発生します。 今回は関数を1回のみ呼び出すため、コスト上の非効率性は度外視できます。
+この[Slitherテスト](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external)は、コントラクトコードから呼び出されず、したがって`public`ではなく`external`として宣言できる関数を特定します。
+`external`関数のガス代は、calldataでパラメータを提供できるため、低くなる可能性があります。
+`public`と宣言された関数は、コントラクト内からアクセス可能である必要があります。
+コントラクトは自身のcalldataを変更できないため、パラメータはメモリに保存する必要があります。
+そのような関数が外部から呼び出される場合、calldataをメモリにコピーする必要があり、ガス代がかかります。
+この場合、関数は一度しか呼び出されないため、非効率性は問題になりません。
```solidity
function initialize(address _l1messenger, address _l2TokenBridge) public {
require(messenger == address(0), "Contract has already been initialized.");
```
-`initialize`関数は、1回だけ呼び出す必要があります。 L1のクロスドメイン・メッセンジャーまたは L2のトークンブリッジのいずれかのアドレスが変更されると、新しいプロキシとそれを呼び出す新しいブリッジが作成されます。 これは、システム全体がアップグレードされた場合を除いて発生する可能性は低く、非常にまれです。
+`initialize`関数は、一度だけ呼び出す必要があります。
+L1クロスドメインメッセンジャーまたはL2トークンブリッジのアドレスが変更された場合、新しいプロキシとそれを呼び出す新しいブリッジを作成します。
+これは、システム全体がアップグレードされる場合を除き、起こる可能性は低く、非常にまれな出来事です。
-この関数には、呼び出し可能な_アカウント_を制限するメカニズムが含まれない点に注意してください。 つまり理論的には、ネットワークに対する攻撃者は、プロキシとブリッジの最初のバージョンがデプロイされるまで待機し、正当なユーザーが`initialize`関数にアクセスできる前に[フロントラン](https://solidity-by-example.org/hacks/front-running/)を実行することが可能です。 これを防ぐには、以下の2つの方法があります:
+この関数には、誰が呼び出せるかを制限するメカニズムがないことに注意してください。
+つまり理論的には、攻撃者はプロキシとブリッジの最初のバージョンがデプロイされるのを待ち、正当なユーザーが`initialize`関数にアクセスする前に[フロントラン](https://solidity-by-example.org/hacks/front-running/)を実行することができます。 しかし、これを防ぐ方法は2つあります:
-1. コントラクトがEOAにより直接デプロイされるのではなく、[別のコントラクトが作成したトランザクションにおいて](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595)デプロイされる場合、全体のプロセスがアトミックになり、他のトランザクションが実行される前に終了する場合があります。
-2. 正当な`initialize`呼び出しが失敗した場合、常に、新たに作成されたプロキシおよびブリッジを無視し、さらに新しいものを作成することが可能です。
+1. コントラクトがEOAによって直接デプロイされるのではなく、[別のコントラクトがそれらを作成するトランザクション](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595)でデプロイされる場合、プロセス全体がアトミックになり、他のトランザクションが実行される前に完了することができます。
+2. `initialize`への正当な呼び出しが失敗した場合、新しく作成されたプロキシとブリッジを無視して、新しいものを作成することは常に可能です。
```solidity
messenger = _l1messenger;
@@ -584,34 +615,33 @@ contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {
```solidity
/**************
- * Depositing *
+ * デポジット *
**************/
- /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious
- * contract via initcode, but it takes care of the user error we want to avoid.
+ /** @dev 送信者がEOAであることを要求する修飾子。このチェックは、悪意のあるコントラクトによって
+ * initcode経由で回避される可能性がありますが、私たちが避けたいユーザーエラーに対応します。
*/
modifier onlyEOA() {
- // Used to stop deposits from contracts (avoid accidentally lost tokens)
+ // コントラクトからのデポジットを停止するために使用(誤って失われたトークンを避けるため)
require(!Address.isContract(msg.sender), "Account not EOA");
_;
}
```
-これは、OpenZeppelinの`Address`ユーティリティが必要となる理由です。
+これが、OpenZeppelinの`Address`ユーティリティが必要だった理由です。
```solidity
/**
- * @dev This function can be called with no data
- * to deposit an amount of ETH to the caller's balance on L2.
- * Since the receive function doesn't take data, a conservative
- * default amount is forwarded to L2.
+ * @dev この関数は、データを指定せずに呼び出すことができ、L2の呼び出し元残高にETHの金額をデポジットします。
+ * receive関数はデータを取らないため、保守的なデフォルト金額がL2に転送されます。
*/
receive() external payable onlyEOA {
_initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes(""));
}
```
-この関数は、テスト用のものです。 通常の使用を目的とするものではないため、インターフェイスの定義には含まれない点に注意してください。
+この関数は、テスト目的で存在します。
+インターフェース定義には表示されないことに注意してください。通常の使用のためではありません。
```solidity
/**
@@ -633,18 +663,16 @@ contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {
}
```
-これら2つの関数は、実際のETH入金を処理する関数である`_initiateETHDeposit`に関連したラッパーです。
+これら2つの関数は、実際のETHデポジットを処理する関数である`_initiateETHDeposit`のラッパーです。
```solidity
/**
- * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of
- * the deposit.
- * @param _from Account to pull the deposit from on L1.
- * @param _to Account to give the deposit to on L2.
- * @param _l2Gas Gas limit required to complete the deposit on L2.
- * @param _data Optional data to forward to L2. This data is provided
- * solely as a convenience for external contracts. Aside from enforcing a maximum
- * length, these contracts provide no guarantees about its content.
+ * @dev ETHを保存し、L2 ETHゲートウェイにデポジットを通知することで、デポジットのロジックを実行します。
+ * @param _from L1でデポジットを引き出すアカウント。
+ * @param _to L2でデポジットを与えるアカウント。
+ * @param _l2Gas L2でデポジットを完了するために必要なガスリミット。
+ * @param _data L2に転送するオプションのデータ。このデータは、外部コントラクトの便宜のためにのみ提供されます。
+ * 最大長を強制する以外、これらのコントラクトはその内容について何の保証も提供しません。
*/
function _initiateETHDeposit(
address _from,
@@ -652,11 +680,13 @@ contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {
uint32 _l2Gas,
bytes memory _data
) internal {
- // Construct calldata for finalizeDeposit call
+ // finalizeDeposit呼び出しのcalldataを構築
bytes memory message = abi.encodeWithSelector(
```
-クロスドメインのメッセージは、メッセージをコールデータとして宛先のコントラクトを呼び出す仕組みとして機能します。 Solidityのコントラクトは常に、コールデータを[ABI仕様](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html)に従って解釈します。 Solidityの[`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions)は、このコールデータを作成するものです。
+クロスドメインメッセージの仕組みは、宛先コントラクトがメッセージをcalldataとして呼び出されることです。
+Solidityコントラクトは、常に[ABI仕様](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html)に従ってcalldataを解釈します。
+Solidity関数[`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions)は、そのcalldataを作成します。
```solidity
IL2ERC20Bridge.finalizeDeposit.selector,
@@ -669,24 +699,24 @@ contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {
);
```
-ここでのメッセージは、[ `finalizeDeposit`関数](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148)を以下のパラメータで呼び出すことです。
+ここでのメッセージは、これらのパラメータで[`finalizeDeposit`関数](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148)を呼び出すことです:
-| パラメータ | 値 | 説明 |
-| ----------- | -------------------------------- | --------------------------------------------------------------------------------------------------- |
-| \_l1Token | address(0) | L1上のETH (ERC-20トークンではない) を表す特別な値 |
-| \_l2Token | Lib_PredeployAddresses.OVM_ETH | Optimism上でETHを管理するL2のコントラクト`0xDeadDeAddeAddEAddeadDEaDDeaDDeAD0000` (このコントラクトは、Optimism内部でのみ使用されます) |
-| \_from | \_from | L1上のETH送信元アドレス |
-| \_to | \_to | L2上のETH受領用アドレス |
-| amount | msg.value | 送信されたwei額(すでにブリッジに送信済みの額) |
-| \_data | \_data | 入金に添付する追加の日付 |
+| パラメータ | 値 | 意味 |
+| ------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
+| \_l1Token | address(0) | L1上のETH(ERC-20トークンではない)を表す特別な値 |
+| \_l2Token | Lib_PredeployAddresses.OVM_ETH | OptimismでETHを管理するL2コントラクト、`0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000`(このコントラクトはOptimism内部でのみ使用されます) |
+| \_from | \_from | L1でETHを送信するアドレス |
+| \_to | \_to | L2でETHを受信するアドレス |
+| 金額 | msg.value | 送信されたweiの量(すでにブリッジに送信済み) |
+| \_data | \_data | デポジットに添付する追加データ |
```solidity
- // Send calldata into L2
+ // calldataをL2に送信
// slither-disable-next-line reentrancy-events
sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);
```
-クロスドメイン・メッセンジャーを通じて、メッセージを送信します。
+クロスドメインメッセンジャーを介してメッセージを送信します。
```solidity
// slither-disable-next-line reentrancy-events
@@ -694,16 +724,16 @@ contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {
}
```
-この送信をリッスンするすべての分散型アプリケーションに対し、通知イベントを発行します。
+この転送をリッスンしている分散型アプリケーションに通知するためにイベントを発行します。
```solidity
/**
* @inheritdoc IL1ERC20Bridge
*/
function depositERC20(
- .
- 。
- 。
+ .
+ .
+ .
) external virtual onlyEOA {
_initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data);
}
@@ -712,30 +742,28 @@ contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {
* @inheritdoc IL1ERC20Bridge
*/
function depositERC20To(
- .
- 。
- 。
+ .
+ .
+ .
) external virtual {
_initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data);
}
```
-これら2つの関数は、実際のERC-20トークンの入金を処理する関数である`_initiateERC20Deposit`に関連したラッパーです。
+これら2つの関数は、実際のERC-20デポジットを処理する`_initiateERC20Deposit`関数のラッパーです。
```solidity
/**
- * @dev Performs the logic for deposits by informing the L2 Deposited Token
- * contract of the deposit and calling a handler to lock the L1 funds. (e.g., transferFrom)
+ * @dev L2デポジットトークンコントラクトにデポジットを通知し、ハンドラを呼び出してL1資金をロックするロジックを実行します。(例: transferFrom)
*
- * @param _l1Token Address of the L1 ERC20 we are depositing
- * @param _l2Token Address of the L1 respective L2 ERC20
- * @param _from Account to pull the deposit from on L1
- * @param _to Account to give the deposit to on L2
- * @param _amount Amount of the ERC20 to deposit.
- * @param _l2Gas Gas limit required to complete the deposit on L2.
- * @param _data Optional data to forward to L2. This data is provided
- * solely as a convenience for external contracts. Aside from enforcing a maximum
- * length, these contracts provide no guarantees about its content.
+ * @param _l1Token デポジットするL1 ERC20のアドレス
+ * @param _l2Token L1の各L2 ERC20のアドレス
+ * @param _from L1でデポジットを引き出すアカウント
+ * @param _to L2でデポジットを与えるアカウント
+ * @param _amount デポジットするERC20の金額。
+ * @param _l2Gas L2でデポジットを完了するために必要なガスリミット。
+ * @param _data L2に転送するオプションのデータ。このデータは、外部コントラクトの便宜のためにのみ提供されます。
+ * 最大長を強制する以外、これらのコントラクトはその内容について何の保証も提供しません。
*/
function _initiateERC20Deposit(
address _l1Token,
@@ -748,26 +776,28 @@ contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled {
) internal {
```
-この関数は、上記の`_initiateETHDeposit`に似ていますが、いくつかの重要な点が異なります。 最大の違いは、この関数では、トークンのアドレスおよび送信額をパラメータとして受け取るという点です。 ETHの場合、ブリッジへの呼び出しにはすでに、ブリッジアカウントへの資産の移転(`msg.value`)が含まれています。
+この関数は上記の`_initiateETHDeposit`に似ていますが、いくつかの重要な違いがあります。
+最初の違いは、この関数がトークンアドレスと転送量をパラメータとして受け取ることです。
+ETHの場合、ブリッジへの呼び出しには、すでにブリッジアカウントへの資産の移転(`msg.value`)が含まれています。
```solidity
- // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future
- // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if
- // _from is an EOA or address(0).
+ // L1でデポジットが開始されると、L1ブリッジは将来の引き出しのために資金を自身に転送します。
+ // safeTransferFromは、コントラクトにコードがあるかどうかもチェックするため、_fromがEOAまたはaddress(0)の場合、これは失敗します。
// slither-disable-next-line reentrancy-events, reentrancy-benign
IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount);
```
-ERC-20トークンについては、ETHの場合とは異なる送信プロセスが実行されます:
+ERC-20トークンの転送は、ETHとは異なるプロセスに従います:
-1. ユーザー(`_from`)は、ブリッジに対し、送信したいトークン量に見合ったアローワンスを与えます。
-2. 次に、トークンコントラクトのアドレスや金額等で、ブリッジを呼び出します。
-3. ブリッジは、入金プロセスの一環として、トークンをブリッジ自体に送信します。
+1. ユーザー(`_from`)は、適切なトークンを転送するための権限をブリッジに与えます。
+2. ユーザーは、トークンコントラクトのアドレス、金額などでブリッジを呼び出します。
+3. ブリッジは、デポジットプロセスの一環として、トークンを(自身に)転送します。
-最初のステップは、第2、3のステップとは別のトランザクションで実行しても構いません。 ただし、`_initiateERC20Deposit`を呼び出す 2 つの関数 (`depositERC20`と`depositERC20To`)は、`_from`をパラメータとして`msg.sender`を含むこの関数を呼び出すだけなので、フロントランニングの問題は発生しません。
+最初のステップは、最後の2つのステップとは別のトランザクションで行われる場合があります。
+ただし、`_initiateERC20Deposit`を呼び出す2つの関数(`depositERC20`と`depositERC20To`)は、`_from`パラメータとして`msg.sender`を使用してこの関数を呼び出すだけなので、フロントランニングは問題になりません。
```solidity
- // Construct calldata for _l2Token.finalizeDeposit(_to, _amount)
+ // _l2Token.finalizeDeposit(_to, _amount)のcalldataを構築
bytes memory message = abi.encodeWithSelector(
IL2ERC20Bridge.finalizeDeposit.selector,
_l1Token,
@@ -778,7 +808,7 @@ ERC-20トークンについては、ETHの場合とは異なる送信プロセ
_data
);
- // Send calldata into L2
+ // calldataをL2に送信
// slither-disable-next-line reentrancy-events, reentrancy-benign
sendCrossDomainMessage(l2TokenBridge, _l2Gas, message);
@@ -786,7 +816,8 @@ ERC-20トークンについては、ETHの場合とは異なる送信プロセ
deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount;
```
-`deposits`のデータ構造に、トークンの入金額を追加します。 L2上には、L1上にある同一のERC-20トークンに対応した複数のアドレスが存在する場合があるため、入金の推移を追跡するには、L1上のERC-20トークンに関するブリッジ上の残高を参照するだけでは不十分です。
+デポジットされたトークンの量を`deposits`データ構造に追加します。
+L2には同じL1 ERC-20トークンに対応する複数のアドレスが存在する可能性があるため、ブリッジのL1 ERC-20トークン残高を使用してデポジットを追跡するだけでは不十分です。
```solidity
@@ -795,7 +826,7 @@ ERC-20トークンについては、ETHの場合とは異なる送信プロセ
}
/*************************
- * Cross-chain Functions *
+ * クロスチェーン関数 *
*************************/
/**
@@ -808,20 +839,21 @@ ERC-20トークンについては、ETHの場合とは異なる送信プロセ
bytes calldata _data
```
-L2のブリッジは、L2のクロスドメイン・メッセンジャーに対して、L1のクロスドメイン・メッセンジャーがこの関数を呼び出すことを指示するメッセージを送信します(もちろん、L1上で、[このメッセージを確定するトランザクション](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions)が送信された後においてです)。
+L2ブリッジはL2クロスドメインメッセンジャーにメッセージを送信し、これによりL1クロスドメインメッセンジャーがこの関数を呼び出します(もちろん、[メッセージを完了するトランザクション](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions)がL1で送信された後)。
```solidity
) external onlyFromCrossDomainAccount(l2TokenBridge) {
```
-このメッセージにつき、L2のトークン・ブリッジで作成され、クロスドメイン・メッセンジャーを経由して送信された_正当な_メッセージであることを確認してください。 この関数は、ブリッジからETHを出金するために使用するため、承認された呼び出し元だけが呼び出したことを確認する必要があります。
+これが、クロスドメインメッセンジャーから来て、L2トークンブリッジから発信された正当なメッセージであることを確認してください。
+この関数はブリッジからETHを引き出すために使用されるため、承認された呼び出し元によってのみ呼び出されることを確認する必要があります。
```solidity
// slither-disable-next-line reentrancy-events
(bool success, ) = _to.call{ value: _amount }(new bytes(0));
```
-ETHを送信するには、`msg.value`でwei金額を指定して、受領者を呼び出します。
+ETHを転送する方法は、`msg.value`にweiの量を指定して受信者を呼び出すことです。
```solidity
require(success, "TransferHelper::safeTransferETH: ETH transfer failed");
@@ -830,7 +862,7 @@ ETHを送信するには、`msg.value`でwei金額を指定して、受領者を
emit ETHWithdrawalFinalized(_from, _to, _amount, _data);
```
-出金イベントを発行します。
+引き出しに関するイベントを発行します。
```solidity
}
@@ -848,17 +880,16 @@ ETHを送信するには、`msg.value`でwei金額を指定して、受領者を
) external onlyFromCrossDomainAccount(l2TokenBridge) {
```
-この関数は、上記の `finalizeETHWithdrawal`関数に類似していますが、ERC-20トークンに関する事項が異なります。
+この関数は上記の`finalizeETHWithdrawal`に似ていますが、ERC-20トークンに必要な変更が加えられています。
```solidity
deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount;
```
-`deposits`のデータ構造を更新します。
+`deposits`データ構造を更新します。
```solidity
-
- // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer
+ // L1で引き出しが完了すると、L1ブリッジは資金を引き出し人に転送します。
// slither-disable-next-line reentrancy-events
IERC20(_l1Token).safeTransfer(_to, _amount);
@@ -868,28 +899,33 @@ ETHを送信するには、`msg.value`でwei金額を指定して、受領者を
/*****************************
- * Temporary - Migrating ETH *
+ * 一時的 - ETHの移行 *
*****************************/
/**
- * @dev Adds ETH balance to the account. This is meant to allow for ETH
- * to be migrated from an old gateway to a new gateway.
- * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the
- * old contract
+ * @dev アカウントにETH残高を追加します。これは、古いゲートウェイから新しいゲートウェイにETHを移行できるようにすることを目的としています。
+ * 注意: これは、古いコントラクトから移行されたETHを受け取ることができるように、1回のアップグレードのみに残されます。
*/
function donateETH() external payable {}
}
```
-このブリッジは、従来の実装から変更されています。 以前の実装から現在の実装に移行した際に、すべての資産を移転させる必要がありました。 ERC-20トークンについては、移転のみが可能でした。 一方、ETHをコントラクトに移転するには、そのコントラクトの承認が必要であり、これは`donateETH`で実行できます。
+ブリッジの以前の実装がありました。
+その実装からこの実装に移行したとき、すべての資産を移動する必要がありました。
+ERC-20トークンは移動するだけです。
+ただし、ETHをコントラクトに転送するには、そのコントラクトの承認が必要であり、それが`donateETH`が提供するものです。
## L2上のERC-20トークン {#erc-20-tokens-on-l2}
-ERC-20トークンを標準ブリッジに適合させるためには、標準ブリッジ_のみが_トークンをミントできるようにする必要があります。 これが必要になるのは、各ブリッジにおいて、Optimism上で流通するトークンの数がL1のブリッジコントラクト内でロックされたトークンの数と一致することを保証する必要があるためです。 L2上のトークンが多すぎる場合、L2上のアセットL1にブリッジして戻すことができないユーザーが発生します。 この場合、信頼できるブリッジが存在せず、事実上、[部分準備銀行制度](https://www.investopedia.com/terms/f/fractionalreservebanking.asp)を生み出すことになってしまいます。 一方、L1上でのトークンが多くなりすぎると、L2トークンをバーンしない限りトークンをリリースできなくなるため、ブリッジコントラクト内の一部のトークンは永遠にロックされた状態になってしまいます。
+ERC-20トークンが標準ブリッジに適合するためには、標準ブリッジ、そして標準ブリッジのみがトークンをミントできるようにする必要があります。
+これは、Optimismで流通しているトークンの数が、L1ブリッジコントラクト内にロックされているトークンの数と等しいことをブリッジが保証する必要があるためです。
+L2にトークンが多すぎると、一部のユーザーは資産をL1に戻すことができなくなります。
+信頼できるブリッジの代わりに、私たちは本質的に[部分準備銀行制度](https://www.investopedia.com/terms/f/fractionalreservebanking.asp)を再現することになります。
+L1にトークンが多すぎると、L2トークンをバーンしない限り解放する方法がないため、それらのトークンの一部はブリッジコントラクト内に永久にロックされたままになります。
### IL2StandardERC20 {#il2standarderc20}
-標準ブリッジを使用するL2上のすべてのERC-20トークンは、標準ブリッジが必要とする関数およびイベントが搭載された[このインターフェイス](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol)を提供する必要があります。
+標準ブリッジを使用するL2上のすべてのERC-20トークンは、[このインターフェース](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol)を提供する必要があります。これには、標準ブリッジが必要とする関数とイベントが含まれています。
```solidity
// SPDX-License-Identifier: MIT
@@ -898,20 +934,24 @@ pragma solidity ^0.8.9;
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
```
-[ERC-20に対する標準インターフェイス](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)には、`mint`および`burn`関数が含まれません。 これらのメソッドは、[ERC-20標準](https://eips.ethereum.org/EIPS/eip-20)において必須でないため、トークンを作成、破壊するメカニズムは指定されていないのです。
+[標準のERC-20インターフェース](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)には、`mint`および`burn`関数は含まれていません。
+これらのメソッドは、[ERC-20標準](https://eips.ethereum.org/EIPS/eip-20)では要求されておらず、トークンを作成および破棄するメカニズムは指定されていません。
```solidity
import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
```
-[ERC-165インターフェイス](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol)は、コントラクトが提供する機能を特定するために用います。 [この標準については、こちらで読むことができます](https://eips.ethereum.org/EIPS/eip-165)。
+[ERC-165インターフェース](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol)は、コントラクトが提供する関数を指定するために使用されます。
+[こちらで標準を読むことができます](https://eips.ethereum.org/EIPS/eip-165)。
```solidity
interface IL2StandardERC20 is IERC20, IERC165 {
function l1Token() external returns (address);
```
-この関数は、このコントラクトに対してブリッジされた L1上のトークンアドレスを提供するものです。 同じ機能の逆方向の関数が存在しない点に注意してください。 L1上のトークンについては、L2のサポートが計画されていたか、あるいはいつ実装されたかを問わず、常にブリッジ可能である必要があります。
+この関数は、このコントラクトにブリッジされたL1トークンのアドレスを提供します。
+逆方向の同様の関数がないことに注意してください。
+L2サポートが実装時に計画されていたかどうかに関係なく、任意のL1トークンをブリッジできる必要があります。
```solidity
@@ -924,11 +964,13 @@ interface IL2StandardERC20 is IERC20, IERC165 {
}
```
-トークンをミント (作成) およびバーン (破棄) するための関数とイベントです。 トークン数が適切である(L1上でロックされたトークン数と一致する)ことを保証するため、これらの関数を実行できるのはこのブリッジのみである必要があります。
+トークンをミント(作成)およびバーン(破棄)するための関数とイベント。
+トークンの数が正しいこと(L1にロックされているトークンの数と等しいこと)を保証するため、ブリッジはこれらの関数を実行できる唯一のエンティティである必要があります。
### L2StandardERC20 {#L2StandardERC20}
-[これは](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol)、`IL2StandardERC20`インターフェイスの実装です。 カスタムロジックが必要ない場合は、常にこの関数を用いてください。
+[これは`IL2StandardERC20`インターフェースの実装です](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol)。
+何らかのカスタムロジックが必要でない限り、これを使用する必要があります。
```solidity
// SPDX-License-Identifier: MIT
@@ -937,7 +979,8 @@ pragma solidity ^0.8.9;
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
```
-[OpenZeppelinで作成したERC-20コントラクト](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)です。 Optimismでは、既存の機能がよく監査され、資産を保持する上で十分信頼できる場合は、新たな機能を追加すべきではないと考えています。
+[OpenZeppelin ERC-20コントラクト](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)。
+Optimismは、特に車輪が十分に監査され、資産を保持するのに十分信頼できる必要がある場合に、車輪を再発明することを信じていません。
```solidity
import "./IL2StandardERC20.sol";
@@ -947,15 +990,15 @@ contract L2StandardERC20 is IL2StandardERC20, ERC20 {
address public l2Bridge;
```
-これらは、通常ERC-20では必要になりませんが、ここでは追加で必要となる2つの設定パラメータです。
+これらは、私たちが要求し、通常ERC-20が必要としない2つの追加の設定パラメータです。
```solidity
/**
- * @param _l2Bridge Address of the L2 standard bridge.
- * @param _l1Token Address of the corresponding L1 token.
- * @param _name ERC20 name.
- * @param _symbol ERC20 symbol.
+ * @param _l2Bridge L2標準ブリッジのアドレス。
+ * @param _l1Token 対応するL1トークンのアドレス。
+ * @param _name ERC20名。
+ * @param _symbol ERC20シンボル。
*/
constructor(
address _l2Bridge,
@@ -968,7 +1011,7 @@ contract L2StandardERC20 is IL2StandardERC20, ERC20 {
}
```
-まず、`ERC20(_name, _symbol)`で継承したコントラクトのコンストラクタを呼び出し、新たに変数を設定します。
+まず、継承元のコントラクトのコンストラクタ(`ERC20(_name, _symbol)`)を呼び出し、次に独自の変数を設定します。
```solidity
@@ -988,11 +1031,12 @@ contract L2StandardERC20 is IL2StandardERC20, ERC20 {
}
```
-[ERC-165](https://eips.ethereum.org/EIPS/eip-165)は、このように動作します。 各インターフェイスは、サポートする一連の関数を含んでおり、これらの機能の[exclusive](https://en.wikipedia.org/wiki/Exclusive_or)または[ABI関数セレクタ](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector)として特定されます。
+これが[ERC-165](https://eips.ethereum.org/EIPS/eip-165)の仕組みです。
+すべてのインターフェースは、サポートされている関数の数であり、それらの関数の[ABI関数セレクタ](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector)の[排他的論理和](https://en.wikipedia.org/wiki/Exclusive_or)として識別されます。
-L2のブリッジは、ERC-165を健全性チェックとして用いて、資産を送信するのに用いるERC-20コントラクトが `IL2StandardERC20`であるか確認します。
+L2ブリッジは、ERC-165をサニティチェックとして使用して、資産を送信するERC-20コントラクトが`IL2StandardERC20`であることを確認します。
-**注意:不正なコントラクトが`supportsInterface`に対して虚偽の値を返すことを防ぐメカニズムは含まれていないため、これはセキュリティ保護のメカニズム_ではなく_、健全性チェックのメカニズムです。
+**注:** 不正なコントラクトが`supportsInterface`に偽の回答を提供することを防ぐものはないため、これはサニティチェックメカニズムであり、セキュリティメカニズムではありません。
```solidity
// slither-disable-next-line external-function
@@ -1011,13 +1055,15 @@ L2のブリッジは、ERC-165を健全性チェックとして用いて、資
}
```
-資産をミント/バーンできるのは、L2のブリッジのみです。
+資産をミントおよびバーンできるのは、L2ブリッジのみです。
-`_mint`および`_burn`は、実際には、[OpenZeppelinで作成したERC-20コントラクト](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn)で定義されています。 トークンをミント/バーンできる条件は、ERC-20を使用する方法と同じように多種多様であるため、このコントラクトは単純に外部に露出していないのです。
+`_mint`と`_burn`は、実際には[OpenZeppelin ERC-20コントラクト](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn)で定義されています。
+そのコントラクトは、トークンをミントおよびバーンする条件がERC-20の使用方法と同じくらい多様であるため、それらを外部に公開しないだけです。
-## L2ブリッジのコード {#l2-bridge-code}
+## L2ブリッジコード {#l2-bridge-code}
-これは、Optimismでブリッジを実行するコードです。 このコントラクトのソースコードは、[こちら](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol)から入手できます。
+これは、Optimismでブリッジを実行するコードです。
+[このコントラクトのソースはこちらです](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol)。
```solidity
// SPDX-License-Identifier: MIT
@@ -1029,48 +1075,50 @@ import { IL1ERC20Bridge } from "../../L1/messaging/IL1ERC20Bridge.sol";
import { IL2ERC20Bridge } from "./IL2ERC20Bridge.sol";
```
-[IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol)のインターフェースは、上述した[L1用のインターフェイス](#IL1ERC20Bridge)とほぼ同様ですが、 以下の2点が大きく異なります。
+[IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol)インターフェースは、上で見た[L1の同等のもの](#IL1ERC20Bridge)と非常に似ています。
+2つの大きな違いがあります:
-1. L1では、あなたが入金を開始し、出金を確定します。 L2の場合、あなたは出金を開始し、入金を確定します。
-2. L1では、ETHとERC-20トークンを区別する必要があります。 L2では、Optimism上のETH残高は内部で、アドレス「[0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://optimistic.etherscan.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)」のERC-20トークンとして処理されるため、両方で同じ関数を使います。
+1. L1では、デポジットを開始し、引き出しを完了します。
+ ここでは、引き出しを開始し、デポジットを完了します。
+2. L1では、ETHとERC-20トークンを区別する必要があります。
+ L2では、Optimismの内部ETH残高はアドレス[0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://explorer.optimism.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000)のERC-20トークンとして処理されるため、両方に同じ関数を使用できます。
```solidity
-/* Library Imports */
+/* ライブラリのインポート */
import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol";
import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol";
-/* Contract Imports */
+/* コントラクトのインポート */
import { IL2StandardERC20 } from "../../standards/IL2StandardERC20.sol";
/**
* @title L2StandardBridge
- * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to
- * enable ETH and ERC20 transitions between L1 and L2.
- * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard
- * bridge.
- * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1
- * bridge to release L1 funds.
+ * @dev L2標準ブリッジは、L1標準ブリッジと連携して、L1とL2間のETHおよびERC20の移行を可能にするコントラクトです。
+ * このコントラクトは、L1標準ブリッジへのデポジットを聞くと、新しいトークンのミンターとして機能します。
+ * このコントラクトは、引き出しを意図したトークンのバーナーとしても機能し、L1ブリッジにL1資金を解放するように通知します。
*/
contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {
/********************************
- * External Contract References *
+ * 外部コントラクト参照 *
********************************/
address public l1TokenBridge;
```
-これは、L1ブリッジのアドレスを追跡する関数です。 L1用のブリッジの場合とは異なり、この変数は_必須_です。 L1ブリッジのアドレスは、事前に知ることはできません。
+L1ブリッジのアドレスを追跡します。
+L1の同等のものとは対照的に、ここではこの変数が必要であることに注意してください。
+L1ブリッジのアドレスは事前にわかりません。
```solidity
/***************
- * Constructor *
+ * コンストラクタ *
***************/
/**
- * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract.
- * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain.
+ * @param _l2CrossDomainMessenger このコントラクトで使用されるクロスドメインメッセンジャー。
+ * @param _l1TokenBridge メインチェーンにデプロイされたL1ブリッジのアドレス。
*/
constructor(address _l2CrossDomainMessenger, address _l1TokenBridge)
CrossDomainEnabled(_l2CrossDomainMessenger)
@@ -1079,7 +1127,7 @@ contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {
}
/***************
- * Withdrawing *
+ * 引き出し *
***************/
/**
@@ -1108,21 +1156,21 @@ contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {
}
```
-これら2つの関数は、出金を開始するものです。 L1上のトークンアドレスを指定する必要がない点に注意してください。 L1上で対応するトークンのアドレスは、L2トークンが伝達するからです。
+これら2つの関数は、引き出しを開始します。
+L1トークンアドレスを指定する必要はないことに注意してください。
+L2トークンは、L1の同等のアドレスを教えてくれることが期待されています。
```solidity
/**
- * @dev Performs the logic for withdrawals by burning the token and informing
- * the L1 token Gateway of the withdrawal.
- * @param _l2Token Address of L2 token where withdrawal is initiated.
- * @param _from Account to pull the withdrawal from on L2.
- * @param _to Account to give the withdrawal to on L1.
- * @param _amount Amount of the token to withdraw.
- * @param _l1Gas Unused, but included for potential forward compatibility considerations.
- * @param _data Optional data to forward to L1. This data is provided
- * solely as a convenience for external contracts. Aside from enforcing a maximum
- * length, these contracts provide no guarantees about its content.
+ * @dev トークンをバーンし、L1トークンゲートウェイに引き出しを通知することで、引き出しのロジックを実行します。
+ * @param _l2Token 引き出しが開始されたL2トークンのアドレス。
+ * @param _from L2で引き出しを引き出すアカウント。
+ * @param _to L1で引き出しを与えるアカウント。
+ * @param _amount 引き出すトークンの量。
+ * @param _l1Gas 未使用ですが、将来の互換性の考慮事項のために含まれています。
+ * @param _data L1に転送するオプションのデータ。このデータは、外部コントラクトの便宜のためにのみ提供されます。
+ * 最大長を強制する以外、これらのコントラクトはその内容について何の保証も提供しません。
*/
function _initiateWithdrawal(
address _l2Token,
@@ -1132,17 +1180,16 @@ contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {
uint32 _l1Gas,
bytes calldata _data
) internal {
- // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2
- // usage
+ // 引き出しが開始されると、その後のL2での使用を防ぐために、引き出し人の資金をバーンします。
// slither-disable-next-line reentrancy-events
IL2StandardERC20(_l2Token).burn(msg.sender, _amount);
```
-`_from`パラメータに依存_するのではなく_、`msg.sender`を使用する点に注意してください。これにより、偽造がより困難になります(私の知る限り、不可能です)。
+`_from`パラメータに依存するのではなく、偽造するのがはるかに難しい(私の知る限り不可能) `msg.sender`に依存していることに注意してください。
```solidity
- // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)
+ // l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)のcalldataを構築
// slither-disable-next-line reentrancy-events
address l1Token = IL2StandardERC20(_l2Token).l1Token();
bytes memory message;
@@ -1150,7 +1197,7 @@ contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled {
if (_l2Token == Lib_PredeployAddresses.OVM_ETH) {
```
-L1では、ETHとERC-20トークンを区別する必要があります。
+L1では、ETHとERC-20を区別する必要があります。
```solidity
message = abi.encodeWithSelector(
@@ -1172,7 +1219,7 @@ L1では、ETHとERC-20トークンを区別する必要があります。
);
}
- // Send message up to L1 bridge
+ // メッセージをL1ブリッジに送信
// slither-disable-next-line reentrancy-events
sendCrossDomainMessage(l1TokenBridge, _l1Gas, message);
@@ -1181,7 +1228,7 @@ L1では、ETHとERC-20トークンを区別する必要があります。
}
/************************************
- * Cross-chain Function: Depositing *
+ * クロスチェーン関数: デポジット *
************************************/
/**
@@ -1196,69 +1243,66 @@ L1では、ETHとERC-20トークンを区別する必要があります。
bytes calldata _data
```
-この関数は、`L1StandardBridge`が呼び出します。
+この関数は`L1StandardBridge`によって呼び出されます。
```solidity
) external virtual onlyFromCrossDomainAccount(l1TokenBridge) {
```
-メッセージの発信元が適切であることを確認します。 この関数は、`_mint`を呼び出すものであり、L1上でブリッジが所有するトークンに含まれないトークンを提供するために使用できるため、重要です。
+メッセージのソースが正当であることを確認してください。
+この関数は`_mint`を呼び出し、ブリッジがL1で所有するトークンでカバーされていないトークンを与えるために使用できるため、これは重要です。
```solidity
- // Check the target token is compliant and
- // verify the deposited token on L1 matches the L2 deposited token representation here
+ // ターゲットトークンが準拠していることを確認し、
+ // L1でデポジットされたトークンがここのL2デポジットトークン表現と一致することを検証します。
if (
// slither-disable-next-line reentrancy-events
ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) &&
_l1Token == IL2StandardERC20(_l2Token).l1Token()
```
-以下の健全性チェックを実行してください:
+サニティチェック:
-1. 正しいインターフェースがサポートされていること。
-2. L2上のERC-20コントラクトにおけるL1アドレスが、L1上のトークンソースと一致すること。
+1. 正しいインターフェースがサポートされていること
+2. L2 ERC-20コントラクトのL1アドレスが、トークンのL1ソースと一致すること
```solidity
) {
- // When a deposit is finalized, we credit the account on L2 with the same amount of
- // tokens.
+ // デポジットが完了すると、L2のアカウントに同額のトークンを入金します。
// slither-disable-next-line reentrancy-events
IL2StandardERC20(_l2Token).mint(_to, _amount);
// slither-disable-next-line reentrancy-events
emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data);
```
-健全性チェックに合格したら、入金を確定します。
+サニティチェックに合格した場合、デポジットを完了します:
1. トークンをミントします。
2. 適切なイベントを発行します。
```solidity
} else {
- // Either the L2 token which is being deposited-into disagrees about the correct address
- // of its L1 token, or does not support the correct interface.
- // This should only happen if there is a malicious L2 token, or if a user somehow
- // specified the wrong L2 token address to deposit into.
- // In either case, we stop the process here and construct a withdrawal
- // message so that users can get their funds out in some cases.
- // There is no way to prevent malicious token contracts altogether, but this does limit
- // user error and mitigate some forms of malicious contract behavior.
+ // デポジット先のL2トークンが、そのL1トークンの正しいアドレスについて同意しないか、正しいインターフェースをサポートしていないかのいずれかです。
+ // これは、悪意のあるL2トークンがある場合、またはユーザーが何らかの方法でデポジット先の間違ったL2トークンアドレスを指定した場合にのみ発生するはずです。
+ // いずれの場合も、ここでプロセスを停止し、引き出しメッセージを構築して、ユーザーが場合によっては資金を取り出せるようにします。
+ // 悪意のあるトークンコントラクトを完全に防ぐ方法はありませんが、これによりユーザーエラーが制限され、悪意のあるコントラクトの動作のいくつかの形態が軽減されます。
```
-L2のトークンアドレスが間違っており、検知可能なエラーが発生した場合、入金をキャンセルし、トークンをL1に返却する必要があります。 これをL2から実行する唯一の方法は、不正申し立て期間が経過してからメッセージを送信することですが、それでも、トークンを永遠に失うよりは、ユーザーにとってははるかにベターな選択でしょう。
+ユーザーが間違ったL2トークンアドレスを使用して検出可能なエラーを犯した場合、デポジットをキャンセルしてL1でトークンを返したいです。
+これをL2から行う唯一の方法は、フォールトチャレンジ期間を待つ必要があるメッセージを送信することですが、それはユーザーがトークンを永久に失うよりもはるかに良いです。
```solidity
bytes memory message = abi.encodeWithSelector(
IL1ERC20Bridge.finalizeERC20Withdrawal.selector,
_l1Token,
_l2Token,
- _to, // switched the _to and _from here to bounce back the deposit to the sender
+ _to, // ここで_toと_fromを切り替えて、デポジットを送信者に跳ね返す
_from,
_amount,
_data
);
- // Send message up to L1 bridge
+ // メッセージをL1ブリッジに送信
// slither-disable-next-line reentrancy-events
sendCrossDomainMessage(l1TokenBridge, 0, message);
// slither-disable-next-line reentrancy-events
@@ -1268,10 +1312,15 @@ L2のトークンアドレスが間違っており、検知可能なエラーが
}
```
-## まとめ {#conclusion}
+## 結論 {#conclusion}
+
+標準ブリッジは、資産転送のための最も柔軟なメカニズムです。
+しかし、非常に汎用的であるため、必ずしも最も使いやすいメカニズムではありません。
+特に、出金に関しては、ほとんどのユーザーが、チャレンジ期間を待つ必要がなく、出金をファイナライズするためにマークル証明を必要としない[サードパーティ製ブリッジ](https://optimism.io/apps#bridge)を使用することを好みます。
-標準ブリッジは、アセットを移転する上で最も柔軟なメカニズムです。 しかし、汎用性が高いため、必ずしも使いやすいメカニズムではない場合もあります。 特に出金については、大部分のユーザーは、異議申し立て期間が存在せず、出金を最終確認するためにMerkleプルーフを必要としない[サードパーティーのブリッジ](https://optimism.io/apps#bridge)を使いたいと考えるでしょう。
+これらのブリッジは通常、L1に資産を持ち、それを少額の手数料(多くの場合、標準ブリッジの引き出しのガス代よりも安い)ですぐに提供することで機能します。
+ブリッジ(またはそれを運営する人々)がL1の資産が不足すると予想する場合、L2から十分な資産を転送します。 これらは非常に大きな引き出しであるため、引き出しコストは多額にわたって償却され、はるかに小さい割合になります。
-サードパーティのブリッジは通常、少額の手数料(標準ブリッジの出金にかかるガス代よりも安価な場合が多いです)で、L1上でアセットを保持する機能を提供します。 ブリッジ(または、ブリッジを稼働するスタッフ)がL1上での資産不足を予想する場合、L2から必要な資産が移転されます。 これらは非常に大規模な出金になるため、出金コストは高額を対象として償却され、手数料が全体に占める割合が非常に低くなります。
+この記事が、レイヤー2の仕組みと、明確で安全なSolidityコードの書き方について、より理解を深めるのに役立ったことを願っています。
-この記事が、レイヤー2の仕組みと、明確で安全なSolidityコードの書き方について、より理解を深めることに役立つことを願っています。
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
diff --git a/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md
index 3b8dd029780..dcb7f836a86 100644
--- a/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md
+++ b/public/content/translations/ja/developers/tutorials/reverse-engineering-a-contract/index.md
@@ -1,40 +1,38 @@
---
title: "コントラクトのリバースエンジニアリング"
-description: ソースコードがない場合にコントラクトを理解する方法
+description: "ソースコードがない場合にコントラクトを理解する方法"
author: Ori Pomerantz
lang: ja
-tags:
- - "イーサリアム仮想マシン(EVM)"
- - "オペコード"
+tags: [ "evm", "オペコード" ]
skill: advanced
published: 2021-12-30
---
## はじめに {#introduction}
-_ブロックチェーン上に秘密はありません。_ブロックチェーン上で起こる全てのことは、一貫性があり、検証可能で、公開されています。 理想的には、[コントラクトはEtherscanで公開され、検証されたソースコードであるべきです](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code)。 しかし、[必ずしもそうとは限りません](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code)。 この記事では、ソースコード([`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f))を見ることなくコントラクトをリバースエンジニアリングする方法を学びます。
+_ブロックチェーン上に秘密はありません_。ブロックチェーン上で起こる全てのことは、一貫性があり、検証可能で、公開されています。 理想的には、[コントラクトのソースコードはEtherscanで公開・検証されるべきです](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code)。 しかし、[必ずしもそうとは限りません](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code)。 この記事では、ソースコードがないコントラクト[`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f)を調べることで、コントラクトをリバースエンジニアリングする方法を学びます。
-リバースコンパイラを使用しても、必ず[利用可能な結果](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f)が生成されるわけではありません。 この記事では、手動でリバースエンジニアリングを実行し、[オペコード](https://github.com/wolflo/evm-opcodes)からコントラクトを理解する方法を学びます。また、デコンパイラによる結果を理解する方法も学びます。
+逆コンパイラは存在しますが、必ずしも[利用可能な結果](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f)が得られるとは限りません。 この記事では、手動でリバースエンジニアリングを行い、[オペコード](https://github.com/wolflo/evm-opcodes)からコントラクトを理解する方法と、デコンパイラの結果を解釈する方法を学びます。
-この記事を理解するには、イーサリアム仮想マシン(EVM)の基礎を理解しており、イーサリアム仮想マシン(EVM)アセンブラにある程度精通している必要があります。 [イーサリアム仮想マシン(EVM)に関するトピックについてはこちら](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e)をご覧ください。
+この記事を理解するには、イーサリアム仮想マシン(EVM)の基礎を理解しており、EVMアセンブラにある程度精通している必要があります。 [これらのトピックについてはこちらをお読みください](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e)。
## 実行可能コードの準備 {#prepare-the-executable-code}
-Etherscanにアクセスするとコントラクトのオペコードを入手できます。「**Contract**」タブをクリックし、次に「**Switch to Opcodes View**」をクリックしてください。 これで一行ずつオペコートが表示されます。
+コントラクトのEtherscanページにアクセスし、**Contract**タブをクリックしてから**Switch to Opcodes View**をクリックすると、オペコードを取得できます。 1行に1つのオペコードが表示されるビューになります。
-
+
-ジャンプ (JUMP) を理解するには、コード内のオペコードの場所を理解する必要があります。 そのための1つの方法は、Googleスプレッドシートを開き、オペコードをC列に貼り付けることです。[既に準備されているこのスプレッドシートをコピーすれば、次のステップをスキップできます](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing)。
+ただし、ジャンプを理解するには、コード内の各オペコードの場所を知る必要があります。 そのためには、Googleスプレッドシートを開き、オペコードをC列に貼り付けるという方法があります。[こちらの準備済みのスプレッドシートのコピーを作成すれば、次の手順をスキップできます](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing)。
-次のステップは、正しいコードの位置を取得することです。これで、ジャンプを理解できるようになります。 オペコードのサイズをB列に、場所(16進数)をA列に配置します。`B1`セルに以下の関数を入力し、それをB列の残りの部分にコードの最終行までコピーアンドペーストします。 これを行った後、B列を非表示にできます。
+次のステップでは、ジャンプを理解できるように、正しいコードのロケーションを取得します。 B列にオペコードサイズを、A列に(16進数の)ロケーションを入れます。セル`B1`にこの関数を入力し、コードの最後までB列の残りのセルにコピー&ペーストします。 これを行った後、B列を非表示にできます。
```
=1+IF(REGEXMATCH(C1,"PUSH"),REGEXEXTRACT(C1,"PUSH(\d+)"),0)
```
-この関数は、まず1バイトをオペコード自体に追加し、次に`PUSH`を探します。 PUSHは特殊なオペコードであり、プッシュされる値用に追加のバイトを保持する必要があります。 オペコードが`PUSH`の場合、バイト数を抽出して加算します。
+まず、この関数はオペコード自体のために1バイトを追加し、次に`PUSH`を探します。 プッシュオペコードは特殊で、プッシュされる値用に追加のバイトを保持する必要があります。 オペコードが`PUSH`の場合、バイト数を抽出して加算します。
-`A1`に最初のオフセットである0を配置します。 次に`A2`に下記の関数を配置し、A列の残りの部分にコピーアンドペーストします。
+`A1`に最初のオフセットであるゼロを配置します。 次に、`A2`にこの関数を配置し、A列の残りの部分にコピーアンドペーストします。
```
=dec2hex(hex2dec(A1)+B1)
@@ -42,112 +40,112 @@ Etherscanにアクセスするとコントラクトのオペコードを入手
ジャンプ(`JUMP`と`JUMPI`)の前にプッシュされる値は16進数で渡されるため、この関数で16進数の値を得る必要があります。
-## エントリーポイント(0x00) {#the-entry-point-0x00}
+## エントリーポイント (0x00) {#the-entry-point-0x00}
コントラクトは、必ず最初のバイトから実行されます。 以下は、コードの冒頭部分です。
-| オフセット | オペコード | スタック(オペコードの後) |
-| -----:| ------------ | ------------------- |
-| 0 | PUSH1 0x80 | 0x80 |
-| 2 | PUSH1 0x40 | 0x40, 0x80 |
-| 4 | MSTORE | なし |
-| 5 | PUSH1 0x04 | 0x04 |
-| 7 | CALLDATASIZE | CALLDATASIZE 0x04 |
-| 8 | LT | CALLDATASIZE\<4 |
-| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 |
-| C | JUMPI | なし |
+| オフセット | オペコード | スタック(オペコードの後) |
+| ----: | ------------ | -------------------------------------------- |
+| 0 | PUSH1 0x80 | 0x80 |
+| 2 | PUSH1 0x40 | 0x40, 0x80 |
+| 4 | MSTORE | なし |
+| 5 | PUSH1 0x04 | 0x04 |
+| 7 | CALLDATASIZE | CALLDATASIZE 0x04 |
+| 8 | LT | CALLDATASIZE<4 |
+| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE<4 |
+| C | JUMPI | なし |
このコードは、次の2つのことをしています。
-1. メモリロケーションの0x40~0x5Fへ、32バイト値として0x80を書き込みます(0x5Fに0x80が格納され、0x40~0x5Eはすべてゼロになります)。
-2. コールデータサイズ(CALLDATASIZE)を読み取ります。 通常、イーサリアムコントラクトのコールデータは、[アプリケーションバイナリインターフェース(ABI)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html)に従います。アプリケーションバイナリインターフェース(ABI)では、最低でも4バイトが関数セレクタに必要です。 コールデータのサイズが4未満の場合、0x5Eへジャンプします。
+1. メモリロケーションの0x40~0x5Fへ、32バイト値として0x80を書き込みます(0x5Fに0x80が格納され、0x40~0x5Eはすべてゼロになります)。
+2. コールデータサイズを読み取ります。 通常、イーサリアムコントラクトのコールデータは[ABI (アプリケーションバイナリインターフェース)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html)に従います。これには、関数セレクタ用に最低4バイトが必要です。 コールデータのサイズが4未満の場合、0x5Eへジャンプします。

-### 0x5Eのハンドラ(非アプリケーションバイナリインターフェース(ABI)コールデータの処理) {#the-handler-at-0x5e-for-non-abi-call-data}
+### 0x5Eのハンドラ (非ABIコールデータ用) {#the-handler-at-0x5e-for-non-abi-call-data}
| オフセット | オペコード |
-| -----:| ------------ |
+| ----: | ------------ |
| 5E | JUMPDEST |
-| 5F | CALLDATASIZE |
+| 5E | CALLDATASIZE |
| 60 | PUSH2 0x007c |
| 63 | JUMPI |
-このスニペットは、`JUMPDEST`で始まります。 イーサリアム仮想マシン(EVM)プログラムは、`JUMPDEST`ではないオペコードにジャンプした場合に例外を投げます。 次に、CALLDATASIZEを確認し、それが「true」の場合(ゼロではない場合)、0x7Cにジャンプします。 これについては後述します。
+このスニペットは、JUMPDESTで始まります。 イーサリアム仮想マシン(EVM)プログラムは、`JUMPDEST`ではないオペコードにジャンプした場合に例外を投げます。 次に、CALLDATASIZEを確認し、それが「true」の場合(ゼロではない場合)、0x7Cにジャンプします。 これについては後述します。
-| オフセット | オペコード | スタック(オペコードの後) |
-| -----:| ---------- | --------------------------------------------------------------------- |
-| 64 | CALLVALUE | 呼び出しによって[Wei](/glossary/#wei)が提供されます。 Solidityでは、`msg.value`が呼び出されます。 |
-| 65 | PUSH1 0x06 | 6 CALLVALUE |
-| 67 | PUSH1 0x00 | 0 6 CALLVALUE |
-| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE |
-| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE |
-| 6B | SLOAD | Storage[6] CALLVALUE 0 6 CALLVALUE |
+| オフセット | オペコード | スタック(オペコードの後) |
+| ----: | ---------- | -------------------------------------------------------------------------------------- |
+| 64 | CALLVALUE | 呼び出しによって提供された[Wei](/glossary/#wei)。 Solidityでは`msg.value`と呼ばれます |
+| 65 | PUSH1 0x06 | 6 CALLVALUE |
+| 67 | PUSH1 0x00 | 0 6 CALLVALUE |
+| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE |
+| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE |
+| 6B | SLOAD | Storage[6] CALLVALUE 0 6 CALLVALUE |
-コールデータがない場合、Storage[6]の値を読み取ります。 このStorage[6] の値はまだわかりませんが、コールデータなしで受信したコントラクトのトランザクションを探すことはできます。 コールデータなしで(つまりメソッドなしで)ETHを送金するだけのトランザクションの場合、Etherscanに`Transfer`メソッドがあります。 実際、[コントラクトが受信した最初のトランザクション](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7)は、送金(transfer)です。
+コールデータがない場合、Storage[6]の値を読み取ります。 このStorage[6]の値はまだわかりませんが、コールデータなしで受信したコントラクトのトランザクションを探すことはできます。 コールデータなしで(つまりメソッドなしで)ETHを送金するだけのトランザクションの場合、Etherscanに`Transfer`メソッドがあります。 実際、[コントラクトが受け取った最初のトランザクション](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7)は送金です。
-このトランザクションを調べるには、「**Click to show more**」をクリックします。コールデータ(Input Dataと表示される)が実際に空(`0x`)であることが分かります。 また、値が1.559ETHであることに留意してください。これに関しては、後述します。
+このトランザクションを調べ、「**Click to see More**」をクリックすると、コールデータ(インプットデータ)が実際に空(`0x`)であることが分かります。 また、値が1.559ETHであることに留意してください。これに関しては、後述します。
-
+
-次に「**State**」タブをクリックし、リバースエンジニアリングしているコントラクト(0x2510...)を展開します。 トランザクション中に `Storage[6]` が変更されたことが分かります。「Hex」から「**Number**」に変更すると、次のコントラクトの値に応じてweiに変換された値、1,559,000,000,000,000,000になります(分かりやすくするためにコンマを追加しています) 。
+次に、**State**タブをクリックし、リバースエンジニアリングしているコントラクト(0x2510...)を展開します。 トランザクション中に`Storage[6]`が変更されたことが分かります。「Hex」から**Number**に変更すると、次のコントラクトの値に応じてweiに変換された値、1,559,000,000,000,000,000になります(分かりやすくするためにコンマを追加しています)。
![Storage[6]の変化](storage6.png)
-[同時期の他の`Transfer`トランザクション](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange)によって引き起こされた状態変更を確認すると、`Storage[6]`がしばらくの間、コントラクトの値を追跡していたことが分かります。 これを今から`Value*`と呼びます。 アスタリスク (`*`) は、この変数が何をするかまだ_分からない_ことを思い起こさせます。しかし、コントラクトの値を追跡するだけのものではありません。`ADDRESS BALANCE`を使用してアカウント残高を取得できる場合には、非常に高価なストレージを使う必要がないからです。 最初のオペコードは、コントラクト自体のアドレスをプッシュ(PUSH)します。 2番目のオペコードは、スタックの上部にあるアドレスを読み込み、そのアドレスの残高で置き換えます。
+[同期間の他の`Transfer`トランザクション](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange)によるステートの変更を見ると、`Storage[6]`がしばらくの間コントラクトの値を追跡していたことがわかります。 これを今から`Value*`と呼びます。 アスタリスク(`*`)は、この変数がまだ何をするかわからないことを示しています。しかし、これは単にコントラクトの値を追跡するためだけのものではありません。なぜなら、`ADDRESS BALANCE`を使ってアカウントの残高を取得できるのに、非常に高価なストレージを使う必要はないからです。 最初のオペコードは、コントラクト自体のアドレスをプッシュします。 2番目のオペコードは、スタックの上部にあるアドレスを読み込み、そのアドレスの残高で置き換えます。
-| オフセット | オペコード | スタック |
-| -----:| ------------ | --------------------------------------------- |
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ------------------------------------------- |
| 6C | PUSH2 0x0075 | 0x75 Value\* CALLVALUE 0 6 CALLVALUE |
| 6F | SWAP2 | CALLVALUE Value\* 0x75 0 6 CALLVALUE |
| 70 | SWAP1 | Value\* CALLVALUE 0x75 0 6 CALLVALUE |
| 71 | PUSH2 0x01a7 | 0x01A7 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
-| 74 | JUMP | |
+| 74 | JUMP | |
-ジャンプ先(JUMPDEST)でも、このコードのトレースを続けます。
+ジャンプ先でも、このコードのトレースを続けます。
-| オフセット | オペコード | スタック |
-| -----:| ---------- | ------------------------------------------------------------- |
+| オフセット | オペコード | スタック |
+| ----: | ---------- | ----------------------------------------------------------- |
| 1A7 | JUMPDEST | Value\* CALLVALUE 0x75 0 6 CALLVALUE |
| 1A8 | PUSH1 0x00 | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
| 1AA | DUP3 | CALLVALUE 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
| 1AB | NOT | 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
-`NOT`は、ビットごとのNOTであるため、コール値内の全てのビット値を反転します。
+`NOT`はビットごとの演算であるため、コール値内の全てのビット値を反転します。
-| オフセット | オペコード | スタック |
-| -----:| ------------ | ------------------------------------------------------------------------------- |
-| 1AC | DUP3 | Value\* 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
-| 1AD | GT | Value\*>2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ---------------------------------------------------------------------------------------------------- |
+| 1AC | DUP3 | Value\* 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
+| 1AD | GT | Value\*>2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
| 1AE | ISZERO | Value\*\<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
| 1AF | PUSH2 0x01df | 0x01DF Value\*\<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
-| 1B2 | JUMPI | |
+| 1B2 | JUMPI | |
-`Value*`の値が、2^256-CALLVALUE-1以下の場合にジャンプ(JUMP)します。 これは、オーバーフローを防ぐためのロジックに見えます。 実際に、オフセット0X01DEでいくつかの無意味な操作(例: 削除される寸前にメモリへの書き込み)をした後、オーバーフローが検出されると、標準の動作としてコントラクトが元に戻されます。
+`Value*`の値が、2^256-CALLVALUE-1以下の場合にジャンプします。 これは、オーバーフローを防ぐためのロジックに見えます。 実際に、オフセット0x01DEでいくつかの無意味な操作(例: 削除される寸前にメモリへの書き込み)をした後、オーバーフローが検出されると、標準の動作としてコントラクトが元に戻されます。
このようなオーバーフローが発生する可能性は、非常に低いことに留意してください。これは、コール値に`Value*`を加えたものが、2^256 wei(約10^59 ETH)と同等になる必要があるためです。 [ETHの総供給量は、この記事の執筆時点で2億未満です](https://etherscan.io/stat/supply)。
-| オフセット | オペコード | スタック |
-| -----:| -------- | ------------------------------------------- |
+| オフセット | オペコード | スタック |
+| ----: | -------- | ----------------------------------------- |
| 1DF | JUMPDEST | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE |
| 1E0 | POP | Value\* CALLVALUE 0x75 0 6 CALLVALUE |
| 1E1 | ADD | Value\*+CALLVALUE 0x75 0 6 CALLVALUE |
| 1E2 | SWAP1 | 0x75 Value\*+CALLVALUE 0 6 CALLVALUE |
-| 1E3 | JUMP | |
+| 1E3 | JUMP | |
ここに到達した場合、`Value* + CALLVALUE`を取得して、オフセット0x75へジャンプします。
-| オフセット | オペコード | スタック |
-| -----:| -------- | --------------------------------- |
+| オフセット | オペコード | スタック |
+| ----: | -------- | ------------------------------- |
| 75 | JUMPDEST | Value\*+CALLVALUE 0 6 CALLVALUE |
| 76 | SWAP1 | 0 Value\*+CALLVALUE 6 CALLVALUE |
| 77 | SWAP2 | 6 Value\*+CALLVALUE 0 CALLVALUE |
-| 78 | SSTORE | 0 CALLVALUE |
+| 78 | SSTORE | 0 CALLVALUE |
ここに到達した場合(コールデータが空である必要があります)、`Value*`にコール値を加えます。 これは、`Transfer`トランザクションが行うことと一致しています。
| オフセット | オペコード |
-| -----:| ----- |
+| ----: | ----- |
| 79 | POP |
| 7A | POP |
| 7B | STOP |
@@ -156,7 +154,7 @@ Etherscanにアクセスするとコントラクトのオペコードを入手
まとめると、最初のコードのフローチャートは次のようになります。
-
+
## 0x7Cのハンドラ {#the-handler-at-0x7c}
@@ -164,71 +162,71 @@ Etherscanにアクセスするとコントラクトのオペコードを入手
ここへ到達するのは、次のような場合です。
-- (オフセット0x63から)1バイト、2バイトまたは3バイトのコールデータががある場合
+- (オフセット0x63から)1バイト、2バイトまたは3バイトのコールデータがある場合
- (オフセット0x42と0x5Dから)メソッドのシグネチャが不明な場合
-| オフセット | オペコード | スタック |
-| -----:| ------------ | -------------------- |
-| 7C | JUMPDEST | |
-| 7D | PUSH1 0x00 | 0x00 |
-| 7F | PUSH2 0x009d | 0x9D 0x00 |
-| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 |
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ------------------------------------------------------------------------ |
+| 7C | JUMPDEST | |
+| 7D | PUSH1 0x00 | 0x00 |
+| 7F | PUSH2 0x009d | 0x9D 0x00 |
+| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 |
| 84 | SLOAD | Storage[3] 0x9D 0x00 |
これは別のストレージセルです。このセルはどのトランザクションにも見つからなかったので、これが何を意味しているのか理解するのは困難です。 しかし、以下のコードがこれを明確にします。
-| オフセット | オペコード | スタック |
-| -----:| ------------------------------------------------- | ------------------------------- |
+| オフセット | オペコード | スタック |
+| ----: | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Storage[3] 0x9D 0x00 |
-| 9A | AND | Storage[3]-as-address 0x9D 0x00 |
+| 9A | AND | Storage[3]-as-address 0x9D 0x00 |
これらのオペコードは、Storage[3]から読み取った値を160ビットに切り捨てています。これは、イーサリアムアドレスの長さです。
-| オフセット | オペコード | スタック |
-| -----:| ----- | ------------------------------- |
+| オフセット | オペコード | スタック |
+| ----: | ----- | ----------------------------------------------------------------------------------- |
| 9B | SWAP1 | 0x9D Storage[3]-as-address 0x00 |
| 9C | JUMP | Storage[3]-as-address 0x00 |
-次のオペコードに進むため、このジャンプ(JUMP)は不要です。 このコードは、ガス効率が良くありません。
+次のオペコードに進むため、このジャンプは不要です。 このコードは、ガス効率が良くありません。
-| オフセット | オペコード | スタック |
-| -----:| ---------- | ------------------------------- |
-| 9D | JUMPDEST | Storage[3]-as-address 0x00 |
-| 9E | SWAP1 | 0x00 Storage[3]-as-address |
-| 9F | POP | Storage[3]-as-address |
-| A0 | PUSH1 0x40 | 0x40 Storage[3]-as-address |
+| オフセット | オペコード | スタック |
+| ----: | ---------- | --------------------------------------------------------------------------------------------------------------------------------------- |
+| 9D | JUMPDEST | Storage[3]-as-address 0x00 |
+| 9E | SWAP1 | 0x00 Storage[3]-as-address |
+| 9F | POP | Storage[3]-as-address |
+| A0 | PUSH1 0x40 | 0x40 Storage[3]-as-address |
| A2 | MLOAD | Mem[0x40] Storage[3]-as-address |
コードの最初で、Mem[0x40]を0x80に設定しました。 その後の0x40を確かめると変更していないことが分かります。つまり、これは0x80であると推測できます。
-| オフセット | オペコード | スタック |
-| -----:| ------------ | ------------------------------------------------- |
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ----------------------------------------------------------------------------------------------------- |
| A3 | CALLDATASIZE | CALLDATASIZE 0x80 Storage[3]-as-address |
| A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 Storage[3]-as-address |
| A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 Storage[3]-as-address |
| A7 | CALLDATACOPY | 0x80 Storage[3]-as-address |
-0x80から始まるすべてのコールデータ(CALLDATA)をメモリにコピーします。
+0x80から始まるすべてのコールデータをメモリにコピーします。
-| オフセット | オペコード | スタック |
-| -----:| ------------- | -------------------------------------------------------------------------------- |
-| A8 | PUSH1 0x00 | 0x00 0x80 Storage[3]-as-address |
-| AA | DUP1 | 0x00 0x00 0x80 Storage[3]-as-address |
-| AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address |
-| AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address |
-| AD | DUP6 | Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address |
-| AE | GAS | GAS Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address |
-| AF | DELEGATE_CALL | |
+| オフセット | オペコード | スタック |
+| ----: | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| A8 | PUSH1 0x00 | 0x00 0x80 Storage[3]-as-address |
+| AA | DUP1 | 0x00 0x00 0x80 Storage[3]-as-address |
+| AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address |
+| AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address |
+| AD | DUP6 | Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address |
+| AE | GAS | GAS Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address |
+| AF | DELEGATE_CALL | |
-これで、かなり明確になりました。 このコントラクトは、[プロキシ](https://blog.openzeppelin.com/proxy-patterns/)として機能しており、Storage[3] 内のアドレスを呼び出して、実際の作業をしています。 `DELEGATE_CALL`は、別のコントラクトを呼び出しますが、同じストレージ内に留まります。 つまり、委任されたコントラクト(現在のコントラクトがこのコントラクトのプロキシとなります)が、同じストレージスペースにアクセスします。 コール(呼び出し)のパラメータは次の通りです。
+これで、かなり明確になりました。 このコントラクトは[プロキシ](https://blog.openzeppelin.com/proxy-patterns/)として機能しており、Storage[3] 内のアドレスを呼び出して、実際の作業をしています。 `DELEGATE_CALL`は、別のコントラクトを呼び出しますが、同じストレージ内に留まります。 つまり、委任されたコントラクト(現在のコントラクトがこのコントラクトのプロキシとなります)が、同じストレージスペースにアクセスします。 コール(呼び出し)のパラメータは次の通りです。
-- _ガス_: 残りのガス
-- _呼び出されたアドレス_: Storage[3]-as-address
+- _ガス_: 残りの全ガス
+- _呼び出し先アドレス_: Storage[3]-as-address
- _コールデータ_: 元のコールデータを配置する、0x80から始まるCALLDATASIZEバイト
- _リターンデータ_: なし(0x00 - 0x00)。リターンデータは他の方法で取得(以下を参照)
-| オフセット | オペコード | スタック |
-| -----:| -------------- | --------------------------------------------------------------------------------------------- |
+| オフセット | オペコード | スタック |
+| ----: | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| B0 | RETURNDATASIZE | RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
@@ -237,73 +235,73 @@ Etherscanにアクセスするとコントラクトのオペコードを入手
ここでは、すべてのリターンデータを0x80から始まるメモリバッファにコピーします。
-| オフセット | オペコード | スタック |
-| -----:| ------------ | ---------------------------------------------------------------------------------------------------------------------------- |
-| B6 | DUP2 | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| B6 | DUP2 | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
| B7 | DUP1 | (((call success/failure))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
| B8 | ISZERO | (((did the call fail))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
| B9 | PUSH2 0x00c0 | 0xC0 (((did the call fail))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
-| BC | JUMPI | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
-| BD | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
-| BE | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
-| BF | RETURN | |
+| BC | JUMPI | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
+| BD | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
+| BE | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
+| BF | RETURN | |
-リターンデータをバッファ(0x80~0x80+RETURNDATASIZE)にコピーする呼び出しの後、その呼び出しが成功した場合は、そのバッファを正確に返します(`RETURN`します)。
+リターンデータをバッファ(0x80~0x80+RETURNDATASIZE)にコピーする呼び出しの後、その呼び出しが成功した場合は、そのバッファを正確に返します。
-### DELEGATECALLの失敗 {#delegatecall-failed}
+### DELEGATECALL失敗 {#delegatecall-failed}
0xC0に到達した場合は、現在のコントラクトが呼び出したコントラクトが、元に戻された(REVERTされた)ことを意味します。 現在のコントラクトはこのコントラクトの単なるプロキシであるため、現在のコントラクトも同じデータを返して、元に戻す(REVERTする)必要があります。
-| オフセット | オペコード | スタック |
-| -----:| -------- | ------------------------------------------------------------------------------------------------------------------- |
+| オフセット | オペコード | スタック |
+| ----: | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| C0 | JUMPDEST | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
| C1 | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
| C2 | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address |
-| C3 | REVERT | |
+| C3 | REVERT | |
-そのため、前に`RETURN`で使用した同じバッファ(0x80~0x80+RETURNDATASIZE)を元に戻します(`REVERT`します)。
+そのため、前に`RETURN`で使用した同じバッファ(0x80~0x80+RETURNDATASIZE)を元に戻します(REVERTします)。
-
+
-## アプリケーションバイナリインターフェース(ABI)呼び出し {#abi-calls}
+## ABIコール {#abi-calls}
-コールデータのサイズが4バイト以上である場合、有効なアプリケーションバイナリインターフェース(ABI)呼び出しである可能性があります。
+コールデータのサイズが4バイト以上である場合、有効なABIコールである可能性があります。
-| オフセット | オペコード | スタック |
-| -----:| ------------ | ------------------------------------------------- |
-| D | PUSH1 0x00 | 0x00 |
-| F | CALLDATALOAD | (((First word (256 bits) of the call data))) |
-| 10 | PUSH1 0xe0 | 0xE0 (((First word (256 bits) of the call data))) |
-| 12 | SHR | (((first 32 bits (4 bytes) of the call data))) |
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ------------------------------------------------------------------------------------------------------------- |
+| D | PUSH1 0x00 | 0x00 |
+| F | CALLDATALOAD | (((コールデータの最初のワード (256ビット)))) |
+| 10 | PUSH1 0xe0 | 0xE0 (((コールデータの最初のワード (256ビット)))) |
+| 12 | SHR | (((コールデータの最初の32ビット (4バイト)))) |
-Etherscanでは、`1C`が未知のオペコードとなっていますが、これは[Etherscanでこの機能が作成された後に追加された](https://eips.ethereum.org/EIPS/eip-145)ため、まだ反映がされていないのが理由です。 [最新のオペコードテーブル](https://github.com/wolflo/evm-opcodes)では、これが右シフトであることが示されています
+Etherscanによると`1C`は未知のオペコードですが、これは[Etherscanがこの機能を実装した後に追加された](https://eips.ethereum.org/EIPS/eip-145)もので、まだ更新されていないためです。 [最新のオペコード表](https://github.com/wolflo/evm-opcodes)を見ると、これが右シフトであることがわかります
-| オフセット | オペコード | スタック |
-| -----:| ---------------- | -------------------------------------------------------------------------------------------------------- |
-| 13 | DUP1 | (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) |
-| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) |
-| 19 | GT | 0x3CD8045E>first-32-bits-of-the-call-data (((first 32 bits (4 bytes) of the call data))) |
-| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>first-32-bits-of-the-call-data (((first 32 bits (4 bytes) of the call data))) |
-| 1D | JUMPI | (((first 32 bits (4 bytes) of the call data))) |
+| オフセット | オペコード | スタック |
+| ----: | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 13 | DUP1 | (((コールデータの最初の32ビット (4バイト)))) (((コールデータの最初の32ビット (4バイト)))) |
+| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((コールデータの最初の32ビット (4バイト)))) (((コールデータの最初の32ビット (4バイト)))) |
+| 19 | GT | 0x3CD8045E>コールデータの最初の32ビット (((コールデータの最初の32ビット (4バイト)))) |
+| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>コールデータの最初の32ビット (((コールデータの最初の32ビット (4バイト)))) |
+| 1D | JUMPI | (((コールデータの最初の32ビット (4バイト)))) |
-このようにメソッドシグネチャのマッチングテストを2つに分割することで、平均的にテストの半分を節約できます。 その直後のコードと0x43のコードは、コールデータの最初の32ビットの複製(`DUP1`)、プッシュ(`PUSH4 (((method signature>`)、`EQ`を実行し等式を判定、メソッドシグネチャがマッチした場合は`JUMPI`、という同じパターンをたどります。 以下に、メソッドシグネチャ、そのアドレス、既知の場合は[対応するメソッド定義](https://www.4byte.directory/)を示します。
+このようにメソッドシグネチャのマッチングテストを2つに分割することで、平均的にテストの半分を節約できます。 その直後のコードと0x43のコードは、コールデータの最初の32ビットの複製(`DUP1`)、プッシュ(`PUSH4 (((method signature)`)、`EQ`を実行し等式を判定、メソッドシグネチャがマッチした場合は`JUMPI`、という同じパターンをたどります。 以下に、メソッドシグネチャ、そのアドレス、既知の場合は[対応するメソッド定義](https://www.4byte.directory/)を示します。
-| メソッド | メソッドシグネチャ | ジャンプ先のオフセット |
-| -------------------------------------------------------------------------------------- | ---------- | ----------- |
+| メソッド | メソッドシグネチャ | ジャンプ先のオフセット |
+| --------------------------------------------------------------------------------------------------------- | ---------- | ----------- |
| [splitter()](https://www.4byte.directory/signatures/?bytes4_signature=0x3cd8045e) | 0x3cd8045e | 0x0103 |
-| ??? | 0x81e580d3 | 0x0138 |
+| ??? | 0x81e580d3 | 0x0138 |
| [currentWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0xba0bafb4) | 0xba0bafb4 | 0x0158 |
-| ??? | 0x1f135823 | 0x00C4 |
+| ??? | 0x1f135823 | 0x00C4 |
| [merkleRoot()](https://www.4byte.directory/signatures/?bytes4_signature=0x2eb4a7ab) | 0x2eb4a7ab | 0x00ED |
一致するものが見つからない場合、そのコードは、現在のコントラクトがプロキシとなっているコントラクトに一致するものがあることを期待して、[0x7Cのプロキシハンドラ](#the-handler-at-0x7c)へジャンプします。
-
+
## splitter() {#splitter}
| オフセット | オペコード | スタック |
-| -----:| ------------ | ----------------------------- |
+| ----: | ------------ | ----------------------------- |
| 103 | JUMPDEST | |
| 104 | CALLVALUE | CALLVALUE |
| 105 | DUP1 | CALLVALUE CALLVALUE |
@@ -314,38 +312,38 @@ Etherscanでは、`1C`が未知のオペコードとなっていますが、こ
| 10D | DUP1 | 0x00 0x00 CALLVALUE |
| 10E | REVERT | |
-この関数が最初に行うことは、呼び出しがETHを送金していないことを確認することです。 この関数は、[`payable`](https://solidity-by-example.org/payable/)ではありません。 誰かがETHを送金してきた場合は、何かの間違いです。ETHを戻せなくなる前に元に戻す(`REVERT`する)必要があります。
-
-| オフセット | オペコード | スタック |
-| -----:| ------------------------------------------------- | --------------------------------------------------------------------------- |
-| 10F | JUMPDEST | |
-| 110 | POP | |
-| 111 | PUSH1 0x03 | 0x03 |
-| 113 | SLOAD | (((Storage[3] a.k.a the contract for which we are a proxy))) |
-| 114 | PUSH1 0x40 | 0x40 (((Storage[3] a.k.a the contract for which we are a proxy))) |
-| 116 | MLOAD | 0x80 (((Storage[3] a.k.a the contract for which we are a proxy))) |
-| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Storage[3] a.k.a the contract for which we are a proxy))) |
-| 12C | SWAP1 | 0x80 0xFF...FF (((Storage[3] a.k.a the contract for which we are a proxy))) |
-| 12D | SWAP2 | (((Storage[3] a.k.a the contract for which we are a proxy))) 0xFF...FF 0x80 |
-| 12E | AND | ProxyAddr 0x80 |
-| 12F | DUP2 | 0x80 ProxyAddr 0x80 |
-| 130 | MSTORE | 0x80 |
-
-0x80にはプロキシアドレスが含まれるようになりました。
+この関数が最初に行うことは、呼び出しがETHを送金していないことを確認することです。 この関数は[`payable`](https://solidity-by-example.org/payable/)ではありません。 誰かがETHを送金してきた場合は、何かの間違いです。ETHを戻せなくなる前に`REVERT`して回避する必要があります。
+
+| オフセット | オペコード | スタック |
+| ----: | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 10F | JUMPDEST | |
+| 110 | POP | |
+| 111 | PUSH1 0x03 | 0x03 |
+| 113 | SLOAD | (((Storage[3]、別名、このコントラクトがプロキシとなっているコントラクト))) |
+| 114 | PUSH1 0x40 | 0x40 (((Storage[3]、別名、このコントラクトがプロキシとなっているコントラクト))) |
+| 116 | MLOAD | 0x80 (((Storage[3]、別名、このコントラクトがプロキシとなっているコントラクト))) |
+| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Storage[3]、別名、このコントラクトがプロキシとなっているコントラクト))) |
+| 12C | SWAP1 | 0x80 0xFF...FF (((Storage[3]、別名、このコントラクトがプロキシとなっているコントラクト))) |
+| 12D | SWAP2 | (((Storage[3]、別名、このコントラクトがプロキシとなっているコントラクト))) 0xFF...FF 0x80 |
+| 12E | AND | ProxyAddr 0x80 |
+| 12F | DUP2 | 0x80 ProxyAddr 0x80 |
+| 130 | MSTORE | 0x80 |
+
+そして0x80にはプロキシアドレスが含まれるようになりました
| オフセット | オペコード | スタック |
-| -----:| ------------ | --------- |
+| ----: | ------------ | --------- |
| 131 | PUSH1 0x20 | 0x20 0x80 |
| 133 | ADD | 0xA0 |
| 134 | PUSH2 0x00e4 | 0xE4 0xA0 |
| 137 | JUMP | 0xA0 |
-### E4のコード {#the-e4-code}
+### E4コード {#the-e4-code}
-これらの行を見るのは初めてですが、他のメソッドと共有されています(以下を参照)。 スタックXの値を呼び出します。`splitter()`で、このXの値が0xA0であることを覚えておいてください。
+これらの行を見るのは初めてですが、他のメソッドと共有されています(以下を参照)。 スタックの値をXと呼びます。`splitter()`で、このXの値が0xA0であることを覚えておいてください。
| オフセット | オペコード | スタック |
-| -----:| ---------- | ----------- |
+| ----: | ---------- | ----------- |
| E4 | JUMPDEST | X |
| E5 | PUSH1 0x40 | 0x40 X |
| E7 | MLOAD | 0x80 X |
@@ -355,7 +353,7 @@ Etherscanでは、`1C`が未知のオペコードとなっていますが、こ
| EB | SWAP1 | 0x80 X-0x80 |
| EC | RETURN | |
-したがって、このコードは、スタック(X)内のメモリのポインターを受け取ります。これにより、コントラクトが0x80~Xまでのバッファを返します(`RETURN`します)。
+したがって、このコードは、スタック(X)内のメモリのポインターを受け取ります。これにより、コントラクトが0x80~Xまでのバッファを`RETURN`します。
`splitter()`の場合、これは現在のコントラクトがプロキシとなっているアドレスを返します。 `RETURN`は、0x80~0x9Fのバッファを返します。これは、このデータを書き込んだ場所です(上記のオフセット0x130)。
@@ -363,22 +361,22 @@ Etherscanでは、`1C`が未知のオペコードとなっていますが、こ
オフセット0x158~0x163のコードは、`splitter()`の0x103~0x10Eで見たものと(`JUMPI`の宛先以外は)同一であるため、`currentWindow()`も同様に`payable`ではないことが分かります。
-| オフセット | オペコード | スタック |
-| -----:| ------------ | -------------------- |
-| 164 | JUMPDEST | |
-| 165 | POP | |
-| 166 | PUSH2 0x00da | 0xDA |
-| 169 | PUSH1 0x01 | 0x01 0xDA |
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ------------------------------------------------------------------------ |
+| 164 | JUMPDEST | |
+| 165 | POP | |
+| 166 | PUSH2 0x00da | 0xDA |
+| 169 | PUSH1 0x01 | 0x01 0xDA |
| 16B | SLOAD | Storage[1] 0xDA |
| 16C | DUP2 | 0xDA Storage[1] 0xDA |
| 16D | JUMP | Storage[1] 0xDA |
-### DAのコード {#the-da-code}
+### DAコード {#the-da-code}
-このコードもまた他のメソッドと共有されます。 スタックYの値を呼び出します。`currentWindow()`で、このYの値がStorage[1]であることを覚えておいてください。
+このコードもまた他のメソッドと共有されます。 スタックの値をYと呼びます。`currentWindow()`で、このYの値がStorage[1]であることを覚えておいてください。
| オフセット | オペコード | スタック |
-| -----:| ---------- | ---------------- |
+| ----: | ---------- | ---------------- |
| DA | JUMPDEST | Y 0xDA |
| DB | PUSH1 0x40 | 0x40 Y 0xDA |
| DD | MLOAD | 0x80 Y 0xDA |
@@ -389,7 +387,7 @@ Etherscanでは、`1C`が未知のオペコードとなっていますが、こ
0x80~0x9FにYを書き込みます。
| オフセット | オペコード | スタック |
-| -----:| ---------- | -------------- |
+| ----: | ---------- | -------------- |
| E1 | PUSH1 0x20 | 0x20 0x80 0xDA |
| E3 | ADD | 0xA0 0xDA |
@@ -399,184 +397,184 @@ Etherscanでは、`1C`が未知のオペコードとなっていますが、こ
オフセット0xED~0xF8のコードは、`splitter()`の0x103~0x10Eで見たものと(`JUMPI`の宛先以外は)同一であるため、`merkleRoot()`も同様に`payable`ではないことが分かります。
-| オフセット | オペコード | スタック |
-| -----:| ------------ | -------------------- |
-| F9 | JUMPDEST | |
-| FA | POP | |
-| FB | PUSH2 0x00da | 0xDA |
-| FE | PUSH1 0x00 | 0x00 0xDA |
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ------------------------------------------------------------------------ |
+| F9 | JUMPDEST | |
+| FA | POP | |
+| FB | PUSH2 0x00da | 0xDA |
+| FE | PUSH1 0x00 | 0x00 0xDA |
| 100 | SLOAD | Storage[0] 0xDA |
| 101 | DUP2 | 0xDA Storage[0] 0xDA |
| 102 | JUMP | Storage[0] 0xDA |
-ジャンプ(JUMP)の後に何が起こるかは、[すでに分かっています](#the-da-code)。 つまり、`merkleRoot()`は、Storage[0]を返します。
+ジャンプの後に何が起こるかは、[すでに分かっています](#the-da-code)。 つまり、`merkleRoot()`は、Storage[0]を返します。
## 0x81e580d3 {#0x81e580d3}
-オフセット0x138~0x143のコードは、`splitter()`の0x103~0x10Eで見たものと(`JUMPI`の宛先以外は)同一であるため、この関数も同様に`payable`ではないことが分かりります。
-
-| オフセット | オペコード | スタック |
-| -----:| ------------ | ------------------------------------------------------------ |
-| 144 | JUMPDEST | |
-| 145 | POP | |
-| 146 | PUSH2 0x00da | 0xDA |
-| 149 | PUSH2 0x0153 | 0x0153 0xDA |
-| 14C | CALLDATASIZE | CALLDATASIZE 0x0153 0xDA |
-| 14D | PUSH1 0x04 | 0x04 CALLDATASIZE 0x0153 0xDA |
-| 14F | PUSH2 0x018f | 0x018F 0x04 CALLDATASIZE 0x0153 0xDA |
-| 152 | JUMP | 0x04 CALLDATASIZE 0x0153 0xDA |
-| 18F | JUMPDEST | 0x04 CALLDATASIZE 0x0153 0xDA |
-| 190 | PUSH1 0x00 | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 192 | PUSH1 0x20 | 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 194 | DUP3 | 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 195 | DUP5 | CALLDATASIZE 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 196 | SUB | CALLDATASIZE-4 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 197 | SLT | CALLDATASIZE-4\<32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 198 | ISZERO | CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 199 | PUSH2 0x01a0 | 0x01A0 CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 19C | JUMPI | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+オフセット0x138~0x143のコードは、`splitter()`の0x103~0x10Eで見たものと(`JUMPI`の宛先以外は)同一であるため、この関数も同様に`payable`ではないことが分かります。
+
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ----------------------------------------------------------------------------- |
+| 144 | JUMPDEST | |
+| 145 | POP | |
+| 146 | PUSH2 0x00da | 0xDA |
+| 149 | PUSH2 0x0153 | 0x0153 0xDA |
+| 14C | CALLDATASIZE | CALLDATASIZE 0x0153 0xDA |
+| 14D | PUSH1 0x04 | 0x04 CALLDATASIZE 0x0153 0xDA |
+| 14F | PUSH2 0x018f | 0x018F 0x04 CALLDATASIZE 0x0153 0xDA |
+| 152 | JUMP | 0x04 CALLDATASIZE 0x0153 0xDA |
+| 18F | JUMPDEST | 0x04 CALLDATASIZE 0x0153 0xDA |
+| 190 | PUSH1 0x00 | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 192 | PUSH1 0x20 | 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 194 | DUP3 | 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 195 | DUP5 | CALLDATASIZE 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 196 | SUB | CALLDATASIZE-4 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 197 | SLT | CALLDATASIZE-4<32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 198 | ISZERO | CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 199 | PUSH2 0x01a0 | 0x01A0 CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 19C | JUMPI | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
この関数は、コールデータに少なくとも32バイト(1ワード)を必要とするようです。
| オフセット | オペコード | スタック |
-| -----:| ------ | -------------------------------------------- |
+| ----: | ------ | -------------------------------------------- |
| 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
| 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
| 19F | REVERT | |
コールデータを取得しなかった場合、トランザクションはリターンデータなしで元に戻されます。
-この関数が、必要なコールデータを_取得した_場合、何が起こるか見ていきましょう。
+この関数が、必要なコールデータを取得した場合、何が起こるか見ていきましょう。
-| オフセット | オペコード | スタック |
-| -----:| ------------ | ---------------------------------------- |
-| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
-| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA |
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ----------------------------------------------------------- |
+| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA |
+| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA |
| 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA |
-`calldataload(4)`は、メソッドシグネチャの_後にある_コールデータの最初のワードです。
-
-| オフセット | オペコード | スタック |
-| -----:| ------------ | ---------------------------------------------------------------------------- |
-| 1A3 | SWAP2 | 0x0153 CALLDATASIZE calldataload(4) 0xDA |
-| 1A4 | SWAP1 | CALLDATASIZE 0x0153 calldataload(4) 0xDA |
-| 1A5 | POP | 0x0153 calldataload(4) 0xDA |
-| 1A6 | JUMP | calldataload(4) 0xDA |
-| 153 | JUMPDEST | calldataload(4) 0xDA |
-| 154 | PUSH2 0x016e | 0x016E calldataload(4) 0xDA |
-| 157 | JUMP | calldataload(4) 0xDA |
-| 16E | JUMPDEST | calldataload(4) 0xDA |
-| 16F | PUSH1 0x04 | 0x04 calldataload(4) 0xDA |
-| 171 | DUP2 | calldataload(4) 0x04 calldataload(4) 0xDA |
-| 172 | DUP2 | 0x04 calldataload(4) 0x04 calldataload(4) 0xDA |
-| 173 | SLOAD | Storage[4] calldataload(4) 0x04 calldataload(4) 0xDA |
-| 174 | DUP2 | calldataload(4) Storage[4] calldataload(4) 0x04 calldataload(4) 0xDA |
+`calldataload(4)`は、メソッドシグネチャの_後_にあるコールデータの最初のワードです
+
+| オフセット | オペコード | スタック |
+| ----: | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| 1A3 | SWAP2 | 0x0153 CALLDATASIZE calldataload(4) 0xDA |
+| 1A4 | SWAP1 | CALLDATASIZE 0x0153 calldataload(4) 0xDA |
+| 1A5 | POP | 0x0153 calldataload(4) 0xDA |
+| 1A6 | JUMP | calldataload(4) 0xDA |
+| 153 | JUMPDEST | calldataload(4) 0xDA |
+| 154 | PUSH2 0x016e | 0x016E calldataload(4) 0xDA |
+| 157 | JUMP | calldataload(4) 0xDA |
+| 16E | JUMPDEST | calldataload(4) 0xDA |
+| 16F | PUSH1 0x04 | 0x04 calldataload(4) 0xDA |
+| 171 | DUP2 | calldataload(4) 0x04 calldataload(4) 0xDA |
+| 172 | DUP2 | 0x04 calldataload(4) 0x04 calldataload(4) 0xDA |
+| 173 | SLOAD | Storage[4] calldataload(4) 0x04 calldataload(4) 0xDA |
+| 174 | DUP2 | calldataload(4) Storage[4] calldataload(4) 0x04 calldataload(4) 0xDA |
| 175 | LT | calldataload(4)\)`、もう一つが`isClaimed()`であり、エアドロップコントラクトのように見えます。 ここからは、オペコードごとに調べる代わりに、[デコンパイラ](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761)を使用します。デコンパイラは、このコントラクトの3つの関数について利用可能な結果を生成します。 他の関数のリバースエンジニアリングは、読者の演習として残しておきます。
@@ -585,160 +583,80 @@ calldataload(4)がStorage[4]より小さい場合、次のコードになりま
この関数についてデコンパイラが提供した内容は、次のとおりです。
```python
-def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable:
- require calldata.size - 4 >=′ 64
- if _param1 and _param2 > -1 / _param1:
- revert with 0, 17
- return (_param1 * _param2 / 100 * 10^6)
+def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable:\n require calldata.size - 4 >=′ 64\n if _param1 and _param2 > -1 / _param1:\n revert with 0, 17\n return (_param1 * _param2 / 100 * 10^6)
```
最初の`require`では、コールデータ内に2つのパラメータにとって十分なサイズ、つまり関数シグネチャの4バイトに加え少なくとも64バイトあるかどうかをテストしています。 そうでない場合、問題があるのは明らかです。
-`if`文は、`_param1`がゼロでないこと、さらに`_param1 * _param2`が負でないことを確認していると思われます。 これは、オーバー(アンダー)フローを防止している可能性があります。
+`if`文は、`_param1`がゼロでないこと、さらに`_param1 * _param2`が負でないことを確認していると思われます。 これは、ラップアラウンドを防ぐためでしょう。
最後に、この関数はスケーリング値を返します。
### claim {#claim}
-デコンパイラが作成するコードは複雑であり、すべてが重要なわけではありません。 役立つ情報を提供していると思われる行に焦点を当てるので、ある程度スキップします。
+デコンパイラが作成するコードは複雑であり、すべてが重要なわけではありません。 役立つ情報を提供していると思われる行に焦点を当てるので、一部をスキップします。
```python
-def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _param4) payable:
- ...
- require _param2 == addr(_param2)
- ...
- if currentWindow <= _param1:
- revert with 0, 'cannot claim for a future window'
+def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _param4) payable:\n ...\n require _param2 == addr(_param2)\n ...\n if currentWindow <= _param1:\n revert with 0, '将来のウィンドウに対して請求することはできません'
```
ここでは、重要事項が2つあります。
-- `_param2`は、`uint256`として宣言されているが、実際にはアドレスである
-- `_param1`は、請求対象のウィンドウであり、`currentWindow`であるか、前のウィンドウである必要がある
+- `_param2`は、`uint256`として宣言されていますが、実際にはアドレスです
+- `_param1`は、請求対象のウィンドウであり、`currentWindow`であるか、それ以前のウィンドウである必要があります。
```python
- ...
- if stor5[_claimWindow][addr(_claimFor)]:
- revert with 0, 'Account already claimed the given window'
+ ...\n if stor5[_claimWindow][addr(_claimFor)]:\n revert with 0, 'アカウントはすでに指定されたウィンドウで請求済みです'
```
そのため、Storage[5]はウィンドウとアドレスの配列であり、アドレスがウィンドウの報酬を請求したかどうかが分かります。
```python
- ...
- idx = 0
- s = 0
- while idx < _param4.length:
- ...
- if s + sha3(mem[(32 * _param4.length) + 328 len mem[(32 * _param4.length) + 296]]) > mem[(32 * idx) + 296]:
- mem[mem[64] + 32] = mem[(32 * idx) + 296]
- ...
- s = sha3(mem[_62 + 32 len mem[_62]])
- continue
- ...
- s = sha3(mem[_66 + 32 len mem[_66]])
- continue
- if unknown2eb4a7ab != s:
- revert with 0, 'Invalid proof'
+ ...\n idx = 0\n s = 0\n while idx < _param4.length:\n ...\n if s + sha3(mem[(32 * _param4.length) + 328 len mem[(32 * _param4.length) + 296]]) > mem[(32 * idx) + 296]:\n mem[mem[64] + 32] = mem[(32 * idx) + 296]\n ...\n s = sha3(mem[_62 + 32 len mem[_62]])\n continue\n ...\n s = sha3(mem[_66 + 32 len mem[_66]])\n continue\n if unknown2eb4a7ab != s:\n revert with 0, '無効な証明です'
```
-`unknown2eb4a7ab`は、実際には`merkleRoot()`関数であることが分かっています。したがって、このコードは[マークルプルーフ](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5)を検証していると思われます。 これは、`_param4`がマークルプルーフであることを意味します。
+`unknown2eb4a7ab`は実際には`merkleRoot()`関数であることがわかっているので、このコードは[マークル証明](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5)を検証しているようです。 これは、`_param4`がマークル証明であることを意味します。
```python
- call addr(_param2) with:
- value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei
- gas 30000 wei
+ call addr(_param2) with:\n value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei\n gas 30000 wei
```
-これは、コントラクトが自身のETHを別のアドレス(コントラクトまたは外部所有アカウント)に送金する方法です。 送金する金額の値で呼び出します。 これはETHのエアドロップであると思われます。
+これは、コントラクトが自身のETHを別のアドレス(コントラクトまたは外部所有)に送金する方法です。 送金する金額の値で呼び出します。 これはETHのエアドロップであると思われます。
```python
- if not return_data.size:
- if not ext_call.success:
- require ext_code.size(stor2)
- call stor2.deposit() with:
- value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei
+ if not return_data.size:\n if not ext_call.success:\n require ext_code.size(stor2)\n call stor2.deposit() with:\n value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei
```
-下の2行は、Storage[2] も呼び出すコントラクトであることを示しています。 [コンストラクタのトランザクションを見ると](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange)、このコントラクトは[0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2)であり、[ソースコードがEtherscanにアップロードされている](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code)ラップドイーサ(WETH)コントラクトであることが分かります。
+下の2行は、Storage[2]も呼び出すコントラクトであることを示しています。 [コンストラクタのトランザクション](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange)を見ると、このコントラクトが[0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2) (Wrapped Etherコントラクトで、[そのソースコードはEtherscanにアップロードされています](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code)) であることがわかります。
-このコントラクトは、`_param2`にETHを送金しようとしていると思われます。 送金できれば問題ありません。 送金できない場合は、[ラップドイーサ(WETH)](https://weth.io/)を送金しようとします。 `_param2`が外部所有アカウント(EOA)である場合、必ずETHを受け取ることができますが、コントラクトはETHの受け取りを拒否することができます。 しかし、ラップドイーサ(WETH)はERC-20であるため、コントラクトは受け取りを拒否できません。
+このコントラクトは、`_param2`にETHを送金しようとしていると思われます。 送金できれば問題ありません。 そうでなければ、[WETH](https://weth.tkn.eth.limo/)を送ろうと試みます。 `_param2`が外部所有アカウント (EOA)である場合、必ずETHを受け取ることができますが、コントラクトはETHの受け取りを拒否することができます。 しかし、WETHはERC-20であるため、コントラクトは受け取りを拒否できません。
```python
- ...
- log 0xdbd5389f: addr(_param2), unknown81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success)
+ ...\n log 0xdbd5389f: addr(_param2), unknown81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success)
```
-関数の最後に、ログエントリが生成されていることがわかります。 [生成されたログエントリを確認し](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events)、`0xdbd5...`で始まるトピックでフィルタリングします。 [そのようなエントリを生成したトランザクションの1つをクリックすると](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274)、実際に請求のように見えることがわかります。アカウントは、リバースエンジニアリングしているコントラクトにメッセージを送信し、代わりにETHを取得しています。
+関数の最後に、ログエントリが生成されていることがわかります。 [生成されたログエントリ](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events)を確認し、`0xdbd5...`で始まるトピックでフィルタリングします。 [そのようなエントリを生成したトランザクションの1つをクリックすると](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274)、実際に請求のように見えることがわかります。アカウントは、リバースエンジニアリングしているコントラクトにメッセージを送信し、代わりにETHを取得しています。

### 1e7df9d3 {#1e7df9d3}
-この関数は、上記の[`claim`](#claim)と非常に似ています。 この関数はマークルプルーフも同様に確認し、ETHを最初に送金しようと試み、同じタイプのログエントリを生成します。
+この関数は、上記の[`claim`](#claim)と非常に類似しています。 この関数はマークル証明も同様に確認し、ETHを最初に送金しようと試み、同じタイプのログエントリを生成します。
```python
-def unknown1e7df9d3(uint256 _param1, uint256 _param2, array _param3) payable:
- ...
- idx = 0
- s = 0
- while idx < _param3.length:
- if idx >= mem[96]:
- revert with 0, 50
- _55 = mem[(32 * idx) + 128]
- if s + sha3(mem[(32 * _param3.length) + 160 len mem[(32 * _param3.length) + 128]]) > mem[(32 * idx) + 128]:
- ...
- s = sha3(mem[_58 + 32 len mem[_58]])
- continue
- mem[mem[64] + 32] = s + sha3(mem[(32 * _param3.length) + 160 len mem[(32 * _param3.length) + 128]])
- ...
- if unknown2eb4a7ab != s:
- revert with 0, 'Invalid proof'
- ...
- call addr(_param1) with:
- value s wei
- gas 30000 wei
- if not return_data.size:
- if not ext_call.success:
- require ext_code.size(stor2)
- call stor2.deposit() with:
- value s wei
- gas gas_remaining wei
- ...
- log 0xdbd5389f: addr(_param1), s, bool(ext_call.success)
+def unknown1e7df9d3(uint256 _param1, uint256 _param2, array _param3) payable:\n ...\n idx = 0\n s = 0\n while idx < _param3.length:\n if idx >= mem[96]:\n revert with 0, 50\n _55 = mem[(32 * idx) + 128]\n if s + sha3(mem[(32 * _param3.length) + 160 len mem[(32 * _param3.length) + 128]]) > mem[(32 * idx) + 128]:\n ...\n s = sha3(mem[_58 + 32 len mem[_58]])\n continue\n mem[mem[64] + 32] = s + sha3(mem[(32 * _param3.length) + 160 len mem[(32 * _param3.length) + 128]])\n ...\n if unknown2eb4a7ab != s:\n revert with 0, '無効な証明です'\n ...\n call addr(_param1) with:\n value s wei\n gas 30000 wei\n if not return_data.size:\n if not ext_call.success:\n require ext_code.size(stor2)\n call stor2.deposit() with:\n value s wei\n gas gas_remaining wei\n ...\n log 0xdbd5389f: addr(_param1), s, bool(ext_call.success)
```
-主な違いは、最初のパラメータです。引き出しを行うためのウィンドウがありません。 代わりに、請求対象となるすべてのウィンドウについてのループがあります。
+主な違いは、最初のパラメータである引き出しを行うためのウィンドウがないことです。 代わりに、請求対象となるすべてのウィンドウについてのループがあります。
```python
- idx = 0
- s = 0
- while idx < currentWindow:
- ...
- if stor5[mem[0]]:
- if idx == -1:
- revert with 0, 17
- idx = idx + 1
- s = s
- continue
- ...
- stor5[idx][addr(_param1)] = 1
- if idx >= unknown81e580d3.length:
- revert with 0, 50
- mem[0] = 4
- if unknown81e580d3[idx] and _param2 > -1 / unknown81e580d3[idx]:
- revert with 0, 17
- if s > !(unknown81e580d3[idx] * _param2 / 100 * 10^6):
- revert with 0, 17
- if idx == -1:
- revert with 0, 17
- idx = idx + 1
- s = s + (unknown81e580d3[idx] * _param2 / 100 * 10^6)
- continue
+ idx = 0\n s = 0\n while idx < currentWindow:\n ...\n if stor5[mem[0]]:\n if idx == -1:\n revert with 0, 17\n idx = idx + 1\n s = s\n continue\n ...\n stor5[idx][addr(_param1)] = 1\n if idx >= unknown81e580d3.length:\n revert with 0, 50\n mem[0] = 4\n if unknown81e580d3[idx] and _param2 > -1 / unknown81e580d3[idx]:\n revert with 0, 17\n if s > !(unknown81e580d3[idx] * _param2 / 100 * 10^6):\n revert with 0, 17\n if idx == -1:\n revert with 0, 17\n idx = idx + 1\n s = s + (unknown81e580d3[idx] * _param2 / 100 * 10^6)\n continue
```
-そのため、すべてのウィンドウについて請求する`claim`を少し変えたもののように思われます。
+そのため、すべてのウィンドウについて請求する`claim`の変種のようです。
-## まとめ {#conclusion}
+## 結論 {#conclusion}
ここまでで、オペコードまたは(動作する場合は)デコンパイラを使用して、ソースコードが入手できないコントラクトを理解する方法を身に付けられたはずです。 この記事の長さが示しているように、コントラクトのリバースエンジニアリングは簡単ではありません。しかしながら、セキュリティが不可欠なシステムでは、コントラクトが想定した通りに動作しているかを検証できることは、非常に重要なスキルです。
+
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
diff --git a/public/content/translations/ja/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/ja/developers/tutorials/run-node-raspberry-pi/index.md
index e45b9dfffcb..f4d0dd0b0c1 100644
--- a/public/content/translations/ja/developers/tutorials/run-node-raspberry-pi/index.md
+++ b/public/content/translations/ja/developers/tutorials/run-node-raspberry-pi/index.md
@@ -1,12 +1,8 @@
---
-title: マイクロSDカードに書き込んでRaspberry Pi 4をノードにする方法
-description: Raspberry Pi 4に書き込み、イーサネットケーブル、SSDをそれぞれ接続してから電源を入れるとRaspberry Pi 4がフルイーサリアムノードとバリデータになります。
+title: "Raspberry Pi 4でイーサリアムノードを実行する"
+description: "Raspberry Pi 4に書き込み、イーサネットケーブル、SSDをそれぞれ接続してから電源を入れるとRaspberry Pi 4がフルイーサリアムノードとバリデータになります。"
author: "EthereumOnArm"
-tags:
- - "クライアント"
- - "実行レイヤ"
- - "コンセンサスレイヤー"
- - "ノード"
+tags: [ "クライアント", "実行レイヤー", "コンセンサスレイヤー", "ノード" ]
lang: ja
skill: intermediate
published: 2022-06-10
@@ -20,18 +16,18 @@ Ethereum on Armを使用してRaspberry Piをイーサリアムノードにす
- Raspberry 4 (モデル B 8 GB)、Odroid M1またはRock 5B (8 GB / 16 GB RAM)ボード
- マイクロSDカード(最小構成: 16 GB、クラス10)
-- 2 TB SSD最小USB 3.0ディスクまたはUSB-SATAケース付きSSD
+- 最低2TBのUSB 3.0 SSD、またはUSB-SATAケース付きSSD。
- 電源
- イーサネットケーブル
-- ポートフォワーディング機能(詳細はクライアントを参照してください)
+- ポートフォワーディング(詳細はクライアントを参照してください)
- ヒートシンクとファンが付属しているケース
- USBキーボード、モニター、HDMIケーブル(マイクロHDMI) (オプション)
-## Ethereum on Armを実行する理由 {#why-run-ethereum-on-arm}
+## ARM上でイーサリアムを実行する理由 {#why-run-ethereum-on-arm}
ARMボードは価格が非常に手頃で、柔軟性の高い、小型のコンピュータです。 このボードは、イーサリアムノードを実行するのに適しています。手ごろな価格で、ノードだけにリソースを使うように設定が可能であり、効率的で電力消費量が少なく、物理的にも小さいので家に置いても邪魔にならないからです。 また、ノードを立ち上げるのも簡単です。Raspberry PiのマイクロSDカードは、ビルド済みイメージを簡単に書き込めるので、ソフトウェアのダウンロードやビルドが不要です。
-## 動作方法 {#how-does-it-work}
+## 仕組み {#how-does-it-work}
ビルド済みイメージをRaspberry Piのメモリーカードに書き込みます。 このイメージには、イーサリアムノードを実行するために必要なすべてが含まれています。 この書き込まれたカードがあれば、ユーザーはRaspberry Piの電源を入れるだけで済みます。 ノードを実行するのに必要なすべてのプロセスは自動で開始します。 メモリーカードにLinuxベースのオペレーティングシステム(OS)が含まれており、その上でシステムレベルのプロセスが自動的に実行され、ARMボードがイーサリアムノードになります。
@@ -39,97 +35,97 @@ ARMボードは価格が非常に手頃で、柔軟性の高い、小型のコ
**このイメージは、必要なステップのすべてを行います**。環境のセットアップ、SSDディスクのフォーマット、イーサリアムソフトウェアのインストールと実行だけでなくブロックチェーンの同期も開始します。
-## 実行クライアントとコンセンサスクライアントに関する注意事項 {#note-on-execution-and-consensus-clients}
+## 実行クライアントとコンセンサスクライアントに関する注意 {#note-on-execution-and-consensus-clients}
-Ethereum on Armのイメージには、ビルド済みの実行クライアントとコンセンサスクライアントがサービスとして組み込まれています。 イーサリアムノードでは、両方のクライアントが同期されて実行される必要があります。 ここでユーザーがすべきことは、イメージをダウンロードして書き込んだ後、サービスを開始するだけです。 イメージには、次の実行クライアントが入っています。
+Ethereum on Armのイメージには、ビルド済みの実行クライアントとコンセンサスクライアントがサービスとして組み込まれています。 イーサリアムノードでは、両方のクライアントが同期されて実行される必要があります。 ユーザーがすべきことは、イメージをダウンロードして書き込んだ後、サービスを開始するだけです。 イメージには、次の実行クライアントが入っています。
- Geth
- Nethermind
- Besu
-コンセンサスクライアントは、次のものが入っています。
+そして、以下のコンセンサスクライアント:
-- ライトハウス
-- ニンバス
-- プリズム
-- テク
+- Lighthouse
+- Nimbus
+- Prysm
+- Teku
-使いたい実行クライアントとコンセンサスクライアントを各1つずつ選びます。すべての実行クライアントは、すべてのコンセンサスクライアントと連携可能です。 クライアントを選択しなかった場合、デフォルトでGethとライトハウスになります。ボードに電源を入れると、これらのクライアントが自動的に実行されます。 Gethがピアを見つけて接続できるように、ルーターで30303ポートを開く必要があります。
+使いたい実行クライアントとコンセンサスクライアントを各1つずつ選びます。すべての実行クライアントは、すべてのコンセンサスクライアントと連携可能です。 クライアントを明示的に選択しなかった場合、ノードはデフォルトのGethとLighthouseにフォールバックし、ボードに電源を入れると自動的に実行されます。 Gethがピアを見つけて接続できるように、ルーターで30303ポートを開く必要があります。
## イメージのダウンロード {#downloading-the-image}
Raspberry Pi 4のイーサリアムイメージは、「プラグ・アンド・プレイ」イメージです。実行クライアントとコンセンサスクライアントのインストールとセットアップが自動的に行われ、それらが互いに通信し、イーサリアムネットワークに接続するように設定されます。 ユーザーがすべきことは、単純なコマンドを使用してプロセスを開始するだけです。
-[Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1)からRaspberry Piイメージをダウンロードし、次のようにSHA256ハッシュを確認してください。
+[Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1)からRaspberry Piのイメージをダウンロードし、SHA256ハッシュを検証します:
```sh
-# From directory containing the downloaded image
+# ダウンロードしたイメージがあるディレクトリから
shasum -a 256 ethonarm_22.04.00.img.zip
-# Hash should output: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f
+# ハッシュ出力は次のようになります: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f
```
-Rock 5BとOdroid M1ボードのイメージは、Ethereum-on-Armの[ダウンロードページ](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/quick-guide/download-and-install.html)から入手可能です。
+Rock 5BおよびOdroid M1ボード用のイメージは、Ethereum-on-Armの[ダウンロードページ](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/quick-guide/download-and-install.html)で入手できます。
-## マイクロSDへの書き込み {#flashing-the-microsd}
+## MicroSDへの書き込み {#flashing-the-microsd}
Raspberry Piで使用するマイクロSDカードは、まずデスクトップパソコンかノートパソコンに挿入して書き込む必要があります。 以下のターミナルコマンドで、ダウンロードしたイメージをSDカードに書き込みます。
```shell
-# check the MicroSD card name
+# MicroSDカード名を確認
sudo fdisk -l
>> sdxxx
```
-SDカード名を正しく取得することは、非常に重要です。次に使うコマンドに`dd`があり、これはイメージを書き込む前にカードの内容を完全に削除するからです。 zipイメージがあるディレクトリに移動して続行します。
+次のコマンドには `dd` が含まれており、これはイメージを書き込む前にカードの既存のコンテンツを完全に消去するため、名前を正しく入力することが非常に重要です。 続行するには、zipイメージが含まれているディレクトリに移動します。
```shell
-# unzip and flash image
+# イメージを解凍して書き込み
unzip ethonarm_22.04.00.img.zip
sudo dd bs=1M if=ethonarm_22.04.00.img of=/dev/ conv=fdatasync status=progress
```
これでカードに書きこまれたので、Raspberry Piに挿入できます。
-## ノードの開始 {#start-the-node}
+## ノードの起動 {#start-the-node}
-SDカードを挿入したRaspberry Piに、SSDとイーサネットケーブルを接続し、電源を入れてください。 OSが起動し、クライアントソフトウェアのインストールやビルドなど、Raspberry Piをイーサリアムノードにする事前設定処理が自動的に開始します。 この処理には10~15分を要します。
+SDカードを挿入したRaspberry Piに、イーサネットケーブルとSSDを接続し、電源を入れてください。 OSが起動し、クライアントソフトウェアのインストールやビルドなど、Raspberry Piをイーサリアムノードにする事前設定処理が自動的に開始します。 この処理には10~15分を要します。
-自動インストールおよび設定が完了したら、モニターとキーボードがボードに接続されているならば直接ターミナルを使うか、SSH接続でデバイスへログインしてください。 `ethereum`アカウントを使用してログインします。このアカウントは、ノードの開始に必要なパーミッションを持っています。
+すべてがインストールおよび設定されたら、ssh接続でデバイスにログインするか、モニターとキーボードがボードに接続されている場合はターミナルを直接使用します。 ノードの開始に必要な権限を持つ `ethereum` アカウントを使用してログインします。
```shell
-User: ethereum
-Password: ethereum
+ユーザー: ethereum
+パスワード: ethereum
```
-デフォルトの実行クライアントであるGethが自動的に開始します。 次のターミナルコマンドを使用してログをチェックすることで、開始を確認できます。
+デフォルトの実行クライアントであるGethが自動的に開始します。 次のターミナルコマンドを使用してログをチェックすることで、これを確認できます。
```sh
sudo journalctl -u geth -f
```
-コンセンサスクライアントは、明示的に開始する必要があります。 開始するには、まずルーターの9000ポートを開き、ライトハウスがピアを見つけて接続できるようにします。 次にライトハウスサービスを有効にして開始します。
+コンセンサスクライアントは明示的に起動する必要があります。 これを行うには、まずルーターのポート9000を開き、Lighthouseがピアを見つけて接続できるようにします。 次にLighthouseサービスを有効にして開始します。
```sh
sudo systemctl enable lighthouse-beacon
sudo systemctl start lighthouse-beacon
```
-ログでクライアントの状態を確認してください。
+ログを使ってクライアントを確認してください。
```sh
sudo journalctl -u lighthouse-beacon
```
-チェックポイント同期を使用するため、コンセンサスクライアントは数分で同期されることに注意してください。 実行クライアントは、同期により時間がかかります。数時間かかる場合もあります。さらに、コンセンサスクライアントの同期が完了するまで、同期を開始しません(これは、実行クライアントが、同期されたコンセンサスクライアントが提供する同期先のターゲットを必要とするためです)。
+コンセンサスクライアントはチェックポイント同期を使用するため、数分で同期されることに注意してください。 実行クライアントは、同期により時間がかかります。数時間かかる場合もあります。さらに、コンセンサスクライアントの同期が完了するまで、同期を開始しません(これは、実行クライアントが、同期されたコンセンサスクライアントが提供する同期先のターゲットを必要とするためです)。
-Gethとライトハウスのサービスが開始し同期されると、Raspberry Piがイーサリアムノードになります。 イーサリアムネットワークとのやり取りを行うには、8545ポートでGethクライアントに接続し、GethのJavascriptコンソールを使うことが最も一般的な方法です。 また、Curlなどのリクエストツールを使用して、JSONオブジェクトとしてフォーマットされたコマンドを送信することもできます。 詳細は、[Gethのドキュメント](https://geth.ethereum.org/)をご覧ください。
+GethとLighthouseのサービスが開始し同期されると、Raspberry Piがイーサリアムノードになります。 イーサリアムネットワークとのやり取りを行うには、8545ポートでGethクライアントに接続し、GethのJavascriptコンソールを使うことが最も一般的な方法です。 また、Curlなどのリクエストツールを使用して、JSONオブジェクトとしてフォーマットされたコマンドを送信することもできます。 詳細は[Gethドキュメント](https://geth.ethereum.org/)をご覧ください。
-Gethは、ブラウザで表示できるGrafanaダッシュボードに、メトリクスをレポートするように事前設定されています。 この機能を使用してノードの健全性を監視したい上級ユーザーは、`ipaddress:3000`にアクセスして`user: admin`と`passwd: ethereum`を入力してください。
+Gethは、ブラウザで表示できるGrafanaダッシュボードに、メトリクスをレポートするように事前設定されています。 上級ユーザーは、この機能を使用して`ipaddress:3000`にアクセスし、`user: admin`と`passwd: ethereum`を渡してノードの状態を監視することができます。
## バリデータ {#validators}
-バリデータは、コンセンサスクライアントにオプションで追加することもできます。 バリデータソフトウェアを使用すると、ノードが積極的にコンセンサスに参加し、暗号経済のセキュリティをネットワークに提供できるようになります。 この作業の報酬としてETHを受け取れます。 バリデータを実行するには、まず32 ETHを持っている必要があり、これをデポジットコントラクトに預け入れる必要があります。 **長期的なコミットメントとなるため、このETHはまだ引き出すことはできません。** 預け入れは、[ランチパッド](https://launchpad.ethereum.org/)のステップバイステップガイドに従って行うことができます。 この作業は、デスクトップパソコンまたはノートパソコンで行いますが、キーは生成しないでください。キーはRaspberry Piで直接生成します。
+バリデータは、コンセンサスクライアントにオプションで追加することもできます。 バリデータソフトウェアを使用すると、ノードが積極的にコンセンサスに参加し、暗号経済のセキュリティをネットワークに提供できるようになります。 この作業の報酬としてETHを受け取れます。 バリデータを実行するには、まず32 ETHを持っている必要があり、これをデポジットコントラクトに預け入れる必要があります。 預け入れは、[Launchpad](https://launchpad.ethereum.org/)のステップバイステップガイドに従って行うことができます。 この作業はデスクトップ/ラップトップで行いますが、キーは生成しないでください — これはRaspberry Piで直接行うことができます。
Raspberry Piのターミナルを開き、以下のコマンドを実行して、デポジットキーを生成してください。
@@ -139,34 +135,37 @@ sudo apt-get install staking-deposit-cli
cd && deposit new-mnemonic --num_validators 1
```
-ニーモニックフレーズを安全に保管してください。 上記コマンドで、ノードのキーストアに2つのファイルが生成されました。これらは、バリデータキーとデポジットデータファイルです。 デポジットデータは、ランチパッドにアップロードする必要があるため、Raspberry Piからデスクトップパソコンまたはノートパソコンにコピーする必要があります。 これは、ssh接続や他のコピー/ペーストの手法を用いて行えます。
+(または、[staking-deposit-cli](https://github.com/ethereum/staking-deposit-cli)をダウンロードしてエアギャップマシンで実行し、`deposit new-mnemnonic`コマンドを実行します)
-ランチパッドを実行しているコンピューターでデポジットデータファイルが利用可能になったら、これをランチパッド画面の「`+`」にドラッグ・アンド・ドロップすることができます。 画面の指示に従って、デポジットコントラクトにトランザクションを送信してください。
+ニーモニックフレーズを安全に保管してください。 上記コマンドで、ノードのキーストアに2つのファイル(バリデータキーとデポジットデータファイル)が生成されました。 デポジットデータは、Launchpadにアップロードする必要があるため、Raspberry Piからデスクトップまたはラップトップにコピーする必要があります。 これは、ssh接続や他のコピー/ペーストの手法を用いて行えます。
-Raspberry Piに戻ると、バリデータが開始可能になります。 これには、バリデータキーのインポート、報酬を受け取るためのアドレスの設定、事前設定されたバリデータプロセスの開始が必要になります。 以下は、ライトハウス向けの例です。その他のコンセンサス クライアント向けの手順については、[Ethereum on Armのドキュメント](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/)を参照してください。
+Launchpadを実行しているコンピューターでデポジットデータファイルが利用可能になったら、これをLaunchpad画面の「+」にドラッグ・アンド・ドロップすることができます。 画面の指示に従って、デポジットコントラクトにトランザクションを送信してください。
+
+Raspberry Piに戻ると、バリデータが開始可能になります。 これには、バリデータキーのインポート、報酬を受け取るためのアドレスの設定、事前設定されたバリデータプロセスの開始が必要になります。 以下の例はLighthouseのものです。他のコンセンサスクライアント向けの手順は、[Ethereum on Armドキュメント](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/)で参照できます:
```shell
-# import the validator keys
+# バリデータキーのインポート
lighthouse account validator import --directory=/home/ethereum/validator_keys
-# set the reward address
+# 報酬受取アドレスの設定
sudo sed -i 's/' /etc/ethereum/lighthouse-validator.conf
-# start the validator
+# バリデータの開始
sudo systemctl start lighthouse-validator
```
おめでとうございます。これでフルイーサリアムノードとバリデータが、Raspberry Piで実行されました。
-## 詳細情報 {#more-details}
+## 詳細 {#more-details}
-このページでは、Raspberry Piを使用してGethおよびライトハウスのノードとバリデータを設定する方法の概要について説明しました。 さらに詳細な手順は、[Ethereum on Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html)のウェブサイトでご覧いただけます。
+このページでは、Raspberry Piを使用してGeth-Lighthouseノードとバリデータを設定する方法の概要について説明しました。 より詳細な手順は、[Ethereum-on-Armウェブサイト](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html)で入手できます。
-## フィードバックご協力のお願い {#feedback-appreciated}
+## フィードバックのお願い {#feedback-appreciated}
-Raspberry Piは多くのユーザーが利用しており、イーサリアムネットワークの健全性に非常に良い影響を与えてきました。 このチュートリアルを深く掘り下げていき、テストネットで実行してみてください。また、Ethereum on ArmのGitHubページの確認、フィードバックの提供、問題提起、プルリクエストの作成による、テクノロジーの進歩とドキュメント化推進へのご協力をお願いします。
+Raspberry Piには膨大なユーザーベースがあり、イーサリアムネットワークの健全性に非常に良い影響を与える可能性があります。
+このチュートリアルを深く掘り下げていき、テストネットで実行してみてください。また、Ethereum on ArmのGitHubページの確認、フィードバックの提供、問題提起、プルリクエストの作成による、テクノロジーの進歩とドキュメント化推進へのご協力をお願いします。
-## 参考文献 {#references}
+## 参考資料 {#references}
1. https://ubuntu.com/download/raspberry-pi
2. https://wikipedia.org/wiki/Port_forwarding
diff --git a/public/content/translations/ja/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/ja/developers/tutorials/scam-token-tricks/index.md
new file mode 100644
index 00000000000..adaeee17fa2
--- /dev/null
+++ b/public/content/translations/ja/developers/tutorials/scam-token-tricks/index.md
@@ -0,0 +1,470 @@
+---
+title: "詐欺トークンで使われる手口と、その見分け方"
+description: "このチュートリアルでは、詐欺トークンを分析し、詐欺師が使う手口、その実装方法、そしてそれを検出する方法を解説します。"
+author: Ori Pomerantz
+tags:
+ [
+ "詐欺",
+ "Solidity",
+ "ERC-20",
+ "JavaScript",
+ "TypeScript"
+ ]
+skill: intermediate
+published: 2023-09-15
+lang: ja
+---
+
+このチュートリアルでは、[ある詐欺トークン](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code)を分析し、詐欺師が使う手口やその実装方法について見ていきます。 このチュートリアルを終える頃には、ERC-20トークンコントラクト、その機能、そしてなぜ懐疑的な見方が必要なのかについて、より包括的な見解を得られるでしょう。 次に、その詐欺トークンが発行するイベントを見て、それが正当なものでないことを自動的に特定する方法を見ていきます。
+
+## 詐欺トークン - それは何であり、なぜ人々はそれを行い、どうすればそれを回避できるか {#scam-tokens}
+
+イーサリアムの最も一般的な用途の1つは、グループが取引可能なトークン、いわば独自の通貨を作ることです。 価値をもたらす正当なユースケースを提供するトークンがある一方、その価値をトークン発行元が独占するようなトークンも存在します。
+
+この件については、[ethereum.org の別の場所で](/guides/how-to-id-scam-tokens/)、ユーザーの視点から詳しく読むことができます。 このチュートリアルでは、詐欺トークンを分析し、それがどのように行われ、どのように検出できるかを見ていくことに焦点を当てます。
+
+### wARBが詐欺だとどうしてわかるのか? {#warb-scam}
+
+私たちが分析するトークンは[wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code)で、正当な[ARBトークン](https://etherscan.io/token/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1)と同等であるかのように装っています。
+
+どちらが正当なトークンであるかを知る最も簡単な方法は、発行元の組織である[Arbitrum](https://arbitrum.foundation/)を見ることです。 正当なアドレスは、[彼らのドキュメント](https://docs.arbitrum.foundation/deployment-addresses#token)に明記されています。
+
+### なぜソースコードは利用できるのですか? {#why-source}
+
+通常、他人を騙そうとする人々は秘密主義であると予想され、実際に多くの詐欺トークンはコードを公開していません(例えば、[これ](https://optimistic.etherscan.io/token/0x15992f382d8c46d667b10dc8456dc36651af1452#code)や[これ](https://optimistic.etherscan.io/token/0x026b623eb4aada7de37ef25256854f9235207178#code)など)。
+
+しかし、正当なトークンは通常ソースコードを公開するため、詐欺トークンの作者も正当に見せかけるために、同じことをすることがあります。 [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code)は、ソースコードが公開されているトークンの一つであり、そのため理解しやすくなっています。
+
+コントラクトのデプロイ者はソースコードを公開するかどうかを選択できますが、間違ったソースコードを公開することは_できません_。 ブロックエクスプローラーは提供されたソースコードを独自にコンパイルし、全く同じバイトコードが得られなければ、そのソースコードを拒否します。 [これについてはEtherscanのサイトで詳しく読むことができます](https://etherscan.io/verifyContract)。
+
+## 正当なERC-20トークンとの比較 {#compare-legit-erc20}
+
+このトークンを正当なERC-20トークンと比較します。 正当なERC-20トークンが通常どのように書かれているかについて詳しくない場合は、[このチュートリアル](/developers/tutorials/erc20-annotated-code/)をご覧ください。
+
+### 特権アドレスの定数 {#constants-for-privileged-addresses}
+
+コントラクトには、特権アドレスが必要な場合があります。 長期的な使用を目的として設計されたコントラクトでは、一部の特権アドレスがそれらのアドレスを変更することを許可します。例えば、新しいマルチシグコントラクトの使用を可能にするためです。 これにはいくつかの方法があります。
+
+[`HOP`トークンコントラクト](https://etherscan.io/address/0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc#code)は、[`Ownable`](https://docs.openzeppelin.com/contracts/2.x/access-control#ownership-and-ownable)パターンを使用しています。 特権アドレスは、`_owner`と呼ばれるフィールドのストレージに保持されます(3番目のファイル`Ownable.sol`を参照)。
+
+```solidity
+abstract contract Ownable is Context {
+ address private _owner;
+ .
+ .
+ .
+}
+```
+
+[`ARB`トークンコントラクト](https://etherscan.io/address/0xad0c361ef902a7d9851ca7dcc85535da2d3c6fc7#code)には、直接的な特権アドレスはありません。 しかし、それは必要ありません。 それは、[アドレス`0xb50721bcf8d664c30412cfbc6cf7a15145234ad1`](https://etherscan.io/address/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1#code)にある[`proxy`](https://docs.openzeppelin.com/contracts/5.x/api/proxy)の背後にあります。 そのコントラクトには、アップグレードに使用できる特権アドレスがあります(4番目のファイル、`ERC1967Upgrade.sol`を参照)。
+
+```solidity
+ /**
+ * @dev EIP1967の管理者スロットに新しいアドレスを格納します。
+ */
+ function _setAdmin(address newAdmin) private {
+ require(newAdmin != address(0), "ERC1967: 新しい管理者はゼロアドレスです");
+ StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
+ }
+```
+
+対照的に、`wARB`コントラクトにはハードコーディングされた`contract_owner`があります。
+
+```solidity
+contract WrappedArbitrum is Context, IERC20 {
+ .
+ .
+ .
+ address deployer = 0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1;
+ address public contract_owner = 0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33;
+ .
+ .
+ .
+}
+```
+
+このコントラクトオーナーは、異なる時点で異なるアカウントによって制御されうるコントラクトではなく、[外部所有アカウント](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs)です。 これは、価値を維持し続けるERC-20を管理するための長期的なソリューションとしてではなく、個人による短期的な使用のために設計されている可能性が高いことを意味します。
+
+そして実際にEtherscanを見ると、詐欺師がこのコントラクトを使用したのは2023年5月19日のわずか12時間([最初のトランザクション](https://etherscan.io/tx/0xf49136198c3f925fcb401870a669d43cecb537bde36eb8b41df77f06d5f6fbc2)から[最後のトランザクション](https://etherscan.io/tx/0xdfd6e717157354e64bbd5d6adf16761e5a5b3f914b1948d3545d39633244d47b)まで)だけであったことがわかります。
+
+### 偽の`_transfer`関数 {#the-fake-transfer-function}
+
+実際の送金は、[内部`_transfer`関数](/developers/tutorials/erc20-annotated-code/#the-_transfer-function-_transfer)を使用して行われるのが標準です。
+
+`wARB`では、この関数はほとんど正当に見えます:
+
+```solidity
+ function _transfer(address sender, address recipient, uint256 amount) internal virtual{
+ require(sender != address(0), "ERC20: ゼロアドレスからの送金");
+ require(recipient != address(0), "ERC20: ゼロアドレスへの送金");
+
+ _beforeTokenTransfer(sender, recipient, amount);
+
+ _balances[sender] = _balances[sender].sub(amount, "ERC20: 送金額が残高を超えています");
+ _balances[recipient] = _balances[recipient].add(amount);
+ if (sender == contract_owner){
+ sender = deployer;
+ }
+ emit Transfer(sender, recipient, amount);
+ }
+```
+
+疑わしい部分は次のとおりです:
+
+```solidity
+ if (sender == contract_owner){
+ sender = deployer;
+ }
+ emit Transfer(sender, recipient, amount);
+```
+
+コントラクトオーナーがトークンを送金した場合、なぜ`Transfer`イベントでは`deployer`から送金されたと表示されるのでしょうか?
+
+しかし、もっと重要な問題があります。 誰がこの`_transfer`関数を呼び出すのでしょうか? これは外部からは呼び出せず、`internal`とマークされています。 そして、私たちが持っているコードには`_transfer`への呼び出しは含まれていません。 明らかに、これはおとりとしてここにあります。
+
+```solidity
+ function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
+ _f_(_msgSender(), recipient, amount);
+ return true;
+ }
+
+ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
+ _f_(sender, recipient, amount);
+ _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: 送金額が許容量を超えています"));
+ return true;
+ }
+```
+
+トークンを転送するために呼び出される関数`transfer`と`transferFrom`を見ると、それらが全く異なる関数`_f_`を呼び出していることがわかります。
+
+### 本当の`_f_`関数 {#the-real-f-function}
+
+```solidity
+ function _f_(address sender, address recipient, uint256 amount) internal _mod_(sender,recipient,amount) virtual {
+ require(sender != address(0), "ERC20: ゼロアドレスからの送金");
+ require(recipient != address(0), "ERC20: ゼロアドレスへの送金");
+
+ _beforeTokenTransfer(sender, recipient, amount);
+
+ _balances[sender] = _balances[sender].sub(amount, "ERC20: 送金額が残高を超えています");
+ _balances[recipient] = _balances[recipient].add(amount);
+ if (sender == contract_owner){
+
+ sender = deployer;
+ }
+ emit Transfer(sender, recipient, amount);
+ }
+```
+
+この関数には2つの潜在的な危険信号があります。
+
+- [関数修飾子](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `_mod_`の使用。 しかし、ソースコードを調べてみると、`_mod_`は実際には無害であることがわかります。
+
+ ```solidity
+ modifier _mod_(address sender, address recipient, uint256 amount){
+ _;
+ }
+ ```
+
+- `_transfer`で見たのと同じ問題で、`contract_owner`がトークンを送金すると、それらが`deployer`から来たように見えることです。
+
+### 偽のイベント関数 `dropNewTokens` {#the-fake-events-function-dropNewTokens}
+
+ここで、実際の詐欺のように見えるものにたどり着きます。 読みやすくするために少し関数を編集しましたが、機能的には同等です。
+
+```solidity
+function dropNewTokens(address uPool,
+ address[] memory eReceiver,
+ uint256[] memory eAmounts) public auth()
+```
+
+この関数には`auth()`修飾子があり、これはコントラクトオーナーによってのみ呼び出されることを意味します。
+
+```solidity
+modifier auth() {
+ require(msg.sender == contract_owner, "対話は許可されていません");
+ _;
+}
+```
+
+この制限は完全に理にかなっています。なぜなら、私たちはランダムなアカウントがトークンを配布することを望まないからです。 しかし、関数の残りの部分は疑わしいです。
+
+```solidity
+{
+ for (uint256 i = 0; i < eReceiver.length; i++) {
+ emit Transfer(uPool, eReceiver[i], eAmounts[i]);
+ }
+}
+```
+
+プールアカウントから受信者の配列へ金額の配列を送金する関数は、完全に理にかなっています。 給与支払い、エアドロップなど、単一のソースから複数の宛先にトークンを配布したいユースケースはたくさんあります。 複数のトランザクションを発行したり、同じトランザクションの一部として別のコントラクトからERC-20を複数回呼び出したりする代わりに、単一のトランザクションで行う方が(ガス代が)安くなります。
+
+しかし、`dropNewTokens`はそれをしません。 これは[`Transfer`イベント](https://eips.ethereum.org/EIPS/eip-20#transfer-1)を発行しますが、実際にはトークンを転送しません。 実際には起こらなかった送金をオフチェーンアプリケーションに伝えることで混乱させる正当な理由はありません。
+
+### `Approve`関数を燃やす {#the-burning-approve-function}
+
+ERC-20コントラクトは、許容量のために[an `approve` function](/developers/tutorials/erc20-annotated-code/#approve)を持つことになっており、実際、私たちの詐欺トークンにはそのような関数があり、しかも正しいものです。 しかし、SolidityはC言語から派生しているため、大文字と小文字が区別されます。 「Approve」と「approve」は異なる文字列です。
+
+また、その機能は`approve`とは関係ありません。
+
+```solidity
+ function Approve(
+ address[] memory holders)
+```
+
+この関数は、トークン保有者のアドレスの配列で呼び出されます。
+
+```solidity
+ public approver() {
+```
+
+`approver()` 修飾子は、`contract_owner` だけがこの関数を呼び出すことを許可するようにします(下記参照)。
+
+```solidity
+ for (uint256 i = 0; i < holders.length; i++) {
+ uint256 amount = _balances[holders[i]];
+ _beforeTokenTransfer(holders[i], 0x0000000000000000000000000000000000000001, amount);
+ _balances[holders[i]] = _balances[holders[i]].sub(amount,
+ "ERC20: burn amount exceeds balance");
+ _balances[0x0000000000000000000000000000000000000001] =
+ _balances[0x0000000000000000000000000000000000000001].add(amount);
+ }
+ }
+
+```
+
+ホルダーアドレスごとに、この関数はホルダーの残高全体を`0x00...01`アドレスに移動させ、事実上それをバーン(焼却)します(標準の実際の`burn`は総供給量も変更し、トークンを`0x00...00`に送金します)。 これは、`contract_owner`がどのユーザーの資産でも削除できることを意味します。 これは、ガバナンストークンに求める機能とは思えません。
+
+### コード品質の問題 {#code-quality-issues}
+
+これらのコード品質の問題は、このコードが詐欺であると_証明する_ものではありませんが、疑わしいものに見せます。 Arbitrumのような組織化された企業は、通常このような質の悪いコードをリリースしません。
+
+#### `mount`関数 {#the-mount-function}
+
+[標準](https://eips.ethereum.org/EIPS/eip-20)には明記されていませんが、一般的に新しいトークンを作成する関数は[`mint`](https://ethereum.org/el/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn)と呼ばれます。
+
+`wARB`のコンストラクタを見ると、ミント関数が何らかの理由で`mount`に改名されており、効率化のために全額を一度にではなく、初期供給の5分の1で5回呼び出されていることがわかります。
+
+```solidity
+ constructor () public {
+
+ _name = "Wrapped Arbitrum";
+ _symbol = "wARB";
+ _decimals = 18;
+ uint256 initialSupply = 1000000000000;
+
+ mount(deployer, initialSupply*(10**18)/5);
+ mount(deployer, initialSupply*(10**18)/5);
+ mount(deployer, initialSupply*(10**18)/5);
+ mount(deployer, initialSupply*(10**18)/5);
+ mount(deployer, initialSupply*(10**18)/5);
+ }
+```
+
+`mount`関数自体も疑わしいです。
+
+```solidity
+ function mount(address account, uint256 amount) public {
+ require(msg.sender == contract_owner, "ERC20: mint to the zero address");
+```
+
+`require`を見ると、コントラクトオーナーだけがミントすることを許可されていることがわかります。 これは正当です。 しかし、エラーメッセージは_only owner is allowed to mint_(オーナーのみミント可能)などであるべきです。 代わりに、それは無関係な_ERC20: mint to the zero address_です。 ゼロアドレスへのミントを正しくテストするには `require(account != address(0), "<エラーメッセージ>")` としますが、コントラクトはこれをチェックする手間をかけていません。
+
+```solidity
+ _totalSupply = _totalSupply.add(amount);
+ _balances[contract_owner] = _balances[contract_owner].add(amount);
+ emit Transfer(address(0), account, amount);
+ }
+```
+
+さらに2つ、直接ミントに関連する疑わしい事実があります。
+
+- `account`パラメータがあり、これはミントされた量を受け取るべきアカウントであると推測されます。 しかし、実際に増加する残高は`contract_owner`のものです。
+
+- 増加した残高は`contract_owner`のものですが、発行されたイベントは`account`への送金を示しています。
+
+### なぜ `auth` と `approver` の両方があるのか? なぜ何もしない`mod`があるのか? {#why-both-autho-and-approver-why-the-mod-that-does-nothing}
+
+このコントラクトには `_mod_`、`auth`、`approver` の3つの修飾子が含まれています。
+
+```solidity
+ modifier _mod_(address sender, address recipient, uint256 amount){
+ _;
+ }
+```
+
+`_mod_`は3つのパラメータを取り、それらで何もしません。 なぜそれがあるのでしょうか?
+
+```solidity
+ modifier auth() {
+ require(msg.sender == contract_owner, "対話は許可されていません");
+ _;
+ }
+
+ modifier approver() {
+ require(msg.sender == contract_owner, "対話は許可されていません");
+ _;
+ }
+```
+
+`auth` と `approver` は、コントラクトが `contract_owner` によって呼び出されたことを確認するため、より理にかなっています。 ミントなどの特定の特権的なアクションは、そのアカウントに限定されることを期待します。 しかし、_全く同じこと_をする2つの別々の関数を持つことに何の意味があるのでしょうか?
+
+## 何を自動的に検出できるか? {#what-can-we-detect-automatically}
+
+Etherscanを見ることで、`wARB`が詐欺トークンであることがわかります。 しかし、それは中央集権的な解決策です。 理論的には、Etherscanは転覆されたりハッキングされたりする可能性があります。 トークンが正当なものかどうかを独自に判断できる方が良いです。
+
+発行するイベントを見ることで、ERC-20トークンが疑わしい(詐欺か、非常に плохоく書かれているか)ことを特定するためのいくつかのトリックがあります。
+
+## 疑わしい`Approval`イベント {#suspicious-approval-events}
+
+[`Approval`イベント](https://eips.ethereum.org/EIPS/eip-20#approval)は、直接のリクエストによってのみ発生すべきです(許容量の結果として発生する可能性のある[`Transfer`イベント](https://eips.ethereum.org/EIPS/eip-20#transfer-1)とは対照的です)。 この問題の詳細な説明と、なぜリクエストがコントラクトによって仲介されるのではなく直接である必要があるのかについては、[Solidityのドキュメント](https://docs.soliditylang.org/en/v0.8.20/security-considerations.html#tx-origin)を参照してください。
+
+これは、[外部所有アカウント](/developers/docs/accounts/#types-of-account)からの支出を承認する`Approval`イベントは、そのアカウントから発生し、宛先がERC-20コントラクトであるトランザクションからでなければならないことを意味します。 外部所有アカウントからのその他の種類の承認は疑わしいです。
+
+[viem](https://viem.sh/)と、型安全性を備えたJavaScriptの派生言語である[TypeScript](https://www.typescriptlang.org/docs/)を使用して、[この種のイベントを特定するプログラム](https://github.com/qbzzt/20230915-scam-token-detection)がここにあります。 実行方法:
+
+1. `.env.example` を `.env` にコピーします。
+2. `.env` を編集して、イーサリアムメインネットノードへのURLを提供します。
+3. `pnpm install` を実行して、必要なパッケージをインストールします。
+4. `pnpm susApproval` を実行して、疑わしい承認を検索します。
+
+以下に一行ずつの説明を示します:
+
+```typescript
+import {
+ Address,
+ TransactionReceipt,
+ createPublicClient,
+ http,
+ parseAbiItem,
+} from "viem"
+import { mainnet } from "viem/chains"
+```
+
+`viem`から型定義、関数、チェーン定義をインポートします。
+
+```typescript
+import { config } from "dotenv"
+config()
+```
+
+`.env`を読み込んでURLを取得します。
+
+```typescript
+const client = createPublicClient({
+ chain: mainnet,
+ transport: http(process.env.URL),
+})
+```
+
+Viemクライアントを作成します。 ブロックチェーンから読み取るだけなので、このクライアントには秘密鍵は必要ありません。
+
+```typescript
+const testedAddress = "0xb047c8032b99841713b8e3872f06cf32beb27b82"
+const fromBlock = 16859812n
+const toBlock = 16873372n
+```
+
+疑わしいERC-20コントラクトのアドレスと、イベントを検索するブロックの範囲です。 ノードプロバイダーは通常、帯域幅が高価になる可能性があるため、イベントを読み取る能力を制限します。 幸いなことに、`wARB`は18時間使用されていなかったので、すべてのイベント(合計でわずか13件)を調べることができます。
+
+```typescript
+const approvalEvents = await client.getLogs({
+ address: testedAddress,
+ fromBlock,
+ toBlock,
+ event: parseAbiItem(
+ "event Approval(address indexed _owner, address indexed _spender, uint256 _value)"
+ ),
+})
+```
+
+これはViemにイベント情報を要求する方法です。 フィールド名を含む正確なイベントシグネチャを提供すると、イベントが解析されます。
+
+```typescript
+const isContract = async (addr: Address): boolean =>
+ await client.getBytecode({ address: addr })
+```
+
+私たちのアルゴリズムは、外部所有アカウントにのみ適用されます。 `client.getBytecode`によってバイトコードが返された場合、それはこれがコントラクトであることを意味し、スキップすべきです。
+
+これまでにTypeScriptを使用したことがない場合、関数定義は少し奇妙に見えるかもしれません。 最初の(そして唯一の)パラメータが`addr`と呼ばれるだけでなく、それが`Address`型であることも伝えます。 同様に、`: boolean`の部分は、関数の戻り値がブール値であることをTypeScriptに伝えます。
+
+```typescript
+const getEventTxn = async (ev: Event): TransactionReceipt =>
+ await client.getTransactionReceipt({ hash: ev.transactionHash })
+```
+
+この関数は、イベントからトランザクションレシートを取得します。 トランザクションの宛先が何であったかを確認するために、レシートが必要です。
+
+```typescript
+const suspiciousApprovalEvent = async (ev : Event) : (Event | null) => {
+```
+
+これは最も重要な関数で、イベントが疑わしいかどうかを実際に判断するものです。 戻り値の型 `(Event | null)` は、この関数が `Event` または `null` のいずれかを返すことができることを TypeScript に伝えます。 イベントが疑わしくない場合は`null`を返します。
+
+```typescript
+const owner = ev.args._owner
+```
+
+Viemはフィールド名を持っているので、イベントを解析してくれました。 `_owner`は、使用されるトークンの所有者です。
+
+```typescript
+// コントラクトによる承認は疑わしくない
+if (await isContract(owner)) return null
+```
+
+所有者がコントラクトである場合、この承認は疑わしくないと仮定します。 コントラクトの承認が疑わしいかどうかを確認するには、トランザクションの完全な実行を追跡して、それが所有者コントラクトに到達したかどうか、そしてそのコントラクトがERC-20コントラクトを直接呼び出したかどうかを確認する必要があります。 それは、私たちが望むよりもはるかにリソースを消費します。
+
+```typescript
+const txn = await getEventTxn(ev)
+```
+
+承認が外部所有アカウントからのものである場合、それを引き起こしたトランザクションを取得します。
+
+```typescript
+// 承認は、トランザクションの`from`ではないEOA所有者からのものである場合、疑わしい
+if (owner.toLowerCase() != txn.from.toLowerCase()) return ev
+```
+
+アドレスは16進数なので文字が含まれているため、単純に文字列の等価性をチェックすることはできません。 例えば、`txn.from`では、それらの文字はすべて小文字です。 `ev.args._owner`のような他のケースでは、アドレスは[エラー識別のために大文字と小文字が混在しています](https://eips.ethereum.org/EIPS/eip-55)。
+
+しかし、トランザクションが所有者からのものではなく、その所有者が外部所有である場合、それは疑わしいトランザクションです。
+
+```typescript
+// トランザクションの宛先が調査中のERC-20コントラクトでない場合も
+// 疑わしいです
+if (txn.to.toLowerCase() != testedAddress) return ev
+```
+
+同様に、トランザクションの`to`アドレス、つまり最初に呼び出されたコントラクトが、調査対象のERC-20コントラクトでない場合も疑わしいです。
+
+```typescript
+ // 疑わしい理由がない場合は、nullを返します。
+ return null
+}
+```
+
+どちらの条件も真でない場合、`Approval`イベントは疑わしくありません。
+
+```typescript
+const testPromises = approvalEvents.map((ev) => suspiciousApprovalEvent(ev))
+const testResults = (await Promise.all(testPromises)).filter((x) => x != null)
+
+console.log(testResults)
+```
+
+[`async`関数](https://www.w3schools.com/js/js_async.asp)は`Promise`オブジェクトを返します。 一般的な構文 `await x()` を使用すると、その `Promise` が満たされるまで待ってから処理を続行します。 これはプログラムしやすく、追いやすいですが、非効率的でもあります。 特定のイベントの`Promise`が満たされるのを待っている間に、次のイベントの作業にすでに取りかかることができます。
+
+ここでは[`map`](https://www.w3schools.com/jsref/jsref_map.asp)を使用して`Promise`オブジェクトの配列を作成します。 次に、[`Promise.all`](https://www.javascripttutorial.net/es6/javascript-promise-all/)を使用して、それらのすべてのプロミスが解決されるのを待ちます。 その後、それらの結果を[`filter`](https://www.w3schools.com/jsref/jsref_filter.asp)して、疑わしくないイベントを削除します。
+
+### 疑わしい`Transfer`イベント {#suspicious-transfer-events}
+
+詐欺トークンを特定するもう一つの可能性のある方法は、疑わしい送金があるかどうかを確認することです。 例えば、それほど多くのトークンを持っていないアカウントからの送金などです。 [このテストの実装方法](https://github.com/qbzzt/20230915-scam-token-detection/blob/main/susTransfer.ts)を見ることができますが、`wARB`にはこの問題はありません。
+
+## 結論 {#conclusion}
+
+詐欺が完全に正常なERC-20トークンコントラクトを使用し、それが何も実体を表していないだけの場合があるため、ERC-20詐欺の自動検出は[偽陰性](https://en.wikipedia.org/wiki/False_positives_and_false_negatives#False_negative_error)に悩まされます。 したがって、常に_信頼できる情報源からトークンアドレスを取得する_ように努めるべきです。
+
+自動検出は、DeFiピースのような、多くのトークンがあり、それらを自動的に処理する必要がある特定のケースで役立ちます。 しかし、いつものように[caveat emptor](https://www.investopedia.com/terms/c/caveatemptor.asp)(買い手注意)、自分で調査し、ユーザーにも同様に行うよう奨励してください。
+
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
diff --git a/public/content/translations/ja/developers/tutorials/secret-state/index.md b/public/content/translations/ja/developers/tutorials/secret-state/index.md
new file mode 100644
index 00000000000..d878fac89c8
--- /dev/null
+++ b/public/content/translations/ja/developers/tutorials/secret-state/index.md
@@ -0,0 +1,741 @@
+---
+title: "秘密のステートにゼロ知識を使用する"
+description: "オンチェーンゲームは隠された情報を保持できないため、制限があります。 このチュートリアルを読むと、読者はゼロ知識証明とサーバーコンポーネントを組み合わせて、オフチェーンコンポーネントで秘密のステートを持つ検証可能なゲームを作成できるようになります。 これを行うための手法は、マインスイーパゲームを作成することで実証されます。"
+author: Ori Pomerantz
+tags:
+ [
+ "サーバー",
+ "オフチェーン",
+ "中央集権型",
+ "ゼロ知識",
+ "zokrates",
+ "mud"
+ ]
+skill: advanced
+lang: ja
+published: 2025-03-15
+---
+
+ブロックチェーンには秘密はありません。 ブロックチェーンに投稿されたものはすべて、誰でも読むことができます。 ブロックチェーンは誰でも検証できることに基づいているため、これが必要です。 しかし、ゲームはしばしば秘密のステートに依存します。 例えば、[マインスイーパ](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\))というゲームは、ブロックチェーンエクスプローラーでマップを見ることができれば、まったく意味がありません。
+
+最も簡単な解決策は、[サーバーコンポーネント](/developers/tutorials/server-components/)を使用して秘密のステートを保持することです。 しかし、私たちがブロックチェーンを使用する理由は、ゲームデベロッパーによる不正行為を防ぐためです。 サーバーコンポーネントの誠実性を確保する必要があります。 サーバーはステートのハッシュを提供し、[ゼロ知識証明](/zero-knowledge-proofs/#why-zero-knowledge-proofs-are-important)を使用して、動きの結果を計算するために使用されたステートが正しいものであることを証明できます。
+
+この記事を読んだ後、あなたはこの種の秘密のステートを保持するサーバー、ステートを表示するためのクライアント、そして両者間の通信のためのオンチェーンコンポーネントを作成する方法を知るでしょう。 使用する主なツールは次のとおりです。
+
+| ツール | 目的 | 検証済みバージョン |
+| --------------------------------------------- | --------------------------- | --------------------------------------: |
+| [Zokrates](https://zokrates.github.io/) | ゼロ知識証明とその検証 | 1.1.9 |
+| [Typescript](https://www.typescriptlang.org/) | サーバーとクライアントの両方のためのプログラミング言語 | 5.4.2 |
+| [Node](https://nodejs.org/en) | サーバーの実行 | 20.18.2 |
+| [Viem](https://viem.sh/) | ブロックチェーンとの通信 | 2.9.20 |
+| [MUD](https://mud.dev/) | オンチェーンデータ管理 | 2.0.12 |
+| [React](https://react.dev/) | クライアントのユーザーインターフェース | 18.2.0 |
+| [Vite](https://vitejs.dev/) | クライアントコードの提供 | 4.2.1 |
+
+## マインスイーパの例 {#minesweeper}
+
+[マインスイーパ](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\))は、地雷原のある秘密のマップを含むゲームです。 プレイヤーは特定の場所を掘ることを選択します。 その場所に地雷があれば、ゲームオーバーです。 そうでなければ、プレイヤーはその場所を囲む8つのマスにある地雷の数を取得します。
+
+このアプリケーションは、[key-valueデータベース](https://aws.amazon.com/nosql/key-value/)を使用してデータをオンチェーンに保存し、そのデータをオフチェーンコンポーネントと自動的に同期させるフレームワークである[MUD](https://mud.dev/)を使用して書かれています。 同期に加えて、MUDはアクセス制御を容易にし、他のユーザーが私たちのアプリケーションをパーミッションレスで[拡張](https://mud.dev/guides/extending-a-world)できるようにします。
+
+### マインスイーパの例の実行 {#running-minesweeper-example}
+
+マインスイーパの例を実行するには:
+
+1. [前提条件がインストールされている](https://mud.dev/quickstart#prerequisites)ことを確認してください:[Node](https://mud.dev/quickstart#prerequisites)、[Foundry](https://book.getfoundry.sh/getting-started/installation)、[`git`](https://git-scm.com/downloads)、[`pnpm`](https://git-scm.com/downloads)、そして[`mprocs`](https://github.com/pvolok/mprocs)。
+
+2. リポジトリをクローンします。
+
+ ```sh copy
+ git clone https://github.com/qbzzt/20240901-secret-state.git
+ ```
+
+3. パッケージをインストールします。
+
+ ```sh copy
+ cd 20240901-secret-state/
+ pnpm install
+ npm install -g mprocs
+ ```
+
+ `pnpm install`の一部としてFoundryがインストールされた場合は、コマンドラインシェルを再起動する必要があります。
+
+4. コントラクトをコンパイルする
+
+ ```sh copy
+ cd packages/contracts
+ forge build
+ cd ../..
+ ```
+
+5. プログラム([anvil](https://book.getfoundry.sh/anvil/)ブロックチェーンを含む)を起動し、待ちます。
+
+ ```sh copy
+ mprocs
+ ```
+
+ 起動には時間がかかることに注意してください。 進捗を確認するには、まず下矢印を使用して _contracts_ タブまでスクロールし、MUDコントラクトがデプロイされていることを確認します。 「_Waiting for file changes…_」というメッセージが表示されたら、コントラクトはデプロイされ、さらなる進捗は _server_ タブで行われます。 そこで、「_Verifier address: 0x...._」というメッセージが表示されるまで待ちます。
+
+ このステップが成功すると、`mprocs`画面が表示され、左側に異なるプロセス、右側に現在選択されているプロセスのコンソール出力が表示されます。
+
+ 
+
+ `mprocs`に問題がある場合は、4つのプロセスをそれぞれ独自のコマンドラインウィンドウで手動で実行できます:
+
+ - **Anvil**
+
+ ```sh
+ cd packages/contracts
+ anvil --base-fee 0 --block-time 2
+ ```
+
+ - **コントラクト**
+
+ ```sh
+ cd packages/contracts
+ pnpm mud dev-contracts --rpc http://127.0.0.1:8545
+ ```
+
+ - **サーバー**
+
+ ```sh
+ cd packages/server
+ pnpm start
+ ```
+
+ - **クライアント**
+
+ ```sh
+ cd packages/client
+ pnpm run dev
+ ```
+
+6. これで[クライアント](http://localhost:3000)にアクセスし、**New Game**をクリックしてプレイを開始できます。
+
+### テーブル {#tables}
+
+オンチェーンには[いくつかのテーブル](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts)が必要です。
+
+- `Configuration`: このテーブルはシングルトンであり、キーはなく、単一のレコードを持ちます。 ゲームの構成情報を保持するために使用されます:
+ - `height`:地雷原の高さ
+ - `width`:地雷原の幅
+ - `numberOfBombs`:各地雷原の爆弾の数
+
+- `VerifierAddress`: このテーブルもシングルトンです。 構成の一部である、検証者コントラクトのアドレス(`verifier`)を保持するために使用されます。 この情報を`Configuration`テーブルに入れることもできましたが、サーバーという別のコンポーネントによって設定されるため、別のテーブルに入れる方が簡単です。
+
+- `PlayerGame`: キーはプレイヤーのアドレスです。 データは次のとおりです:
+
+ - `gameId`:プレイヤーがプレイしているマップのハッシュである32バイトの値(ゲーム識別子)。
+ - `win`:プレイヤーがゲームに勝ったかどうかを示すブール値。
+ - `lose`:プレイヤーがゲームに負けたかどうかを示すブール値。
+ - `digNumber`:ゲームでの成功した採掘の数。
+
+- `GamePlayer`: このテーブルは、`gameId`からプレイヤーアドレスへの逆マッピングを保持します。
+
+- `Map`: キーは3つの値のタプルです:
+
+ - `gameId`:プレイヤーがプレイしているマップのハッシュである32バイトの値(ゲーム識別子)。
+ - `x` 座標
+ - `y` 座標
+
+ 値は単一の数値です。 爆弾が検出された場合は255です。 それ以外の場合は、その場所の周りの爆弾の数に1を加えたものです。 爆弾の数だけを使用することはできません。なぜなら、デフォルトではEVM内のすべてのストレージとMUD内のすべての行の値がゼロだからです。 「プレイヤーはまだここを掘っていない」と「プレイヤーはここを掘って、周りに爆弾がゼロであることを見つけた」とを区別する必要があります。
+
+さらに、クライアントとサーバー間の通信はオンチェーンコンポーネントを介して行われます。 これもテーブルを使用して実装されています。
+
+- `PendingGame`: 新しいゲームを開始するための未処理のリクエスト。
+- `PendingDig`: 特定のゲームの特定の場所で掘るための未処理のリクエスト。 これは[オフチェーンテーブル](https://mud.dev/store/tables#types-of-tables)であり、EVMストレージには書き込まれず、イベントを使用してオフチェーンでのみ読み取り可能です。
+
+### 実行とデータフロー {#execution-data-flows}
+
+これらのフローは、クライアント、オンチェーンコンポーネント、サーバー間の実行を調整します。
+
+#### 初期化 {#initialization-flow}
+
+`mprocs`を実行すると、次のステップが実行されます:
+
+1. [`mprocs`](https://github.com/pvolok/mprocs)は4つのコンポーネントを実行します:
+
+ - [Anvil](https://book.getfoundry.sh/anvil/)、ローカルブロックチェーンを実行します
+ - [Contracts](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/contracts)、MUDのコントラクトをコンパイル(必要に応じて)し、デプロイします
+ - [Client](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/client)、UIとクライアントコードをWebブラウザに提供するために[Vite](https://vitejs.dev/)を実行します。
+ - [Server](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/server)、サーバーアクションを実行します
+
+2. `contracts`パッケージはMUDコントラクトをデプロイし、その後[ `PostDeploy.s.sol` スクリプト](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol)を実行します。 このスクリプトは構成を設定します。 githubのコードは[10x5の地雷原に8つの地雷があること](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol#L23)を指定しています。
+
+3. [サーバー](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts)は[MUDの設定](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L6)から始まります。 とりわけ、これによりデータ同期が有効になり、関連するテーブルのコピーがサーバーのメモリに存在することになります。
+
+4. サーバーは、[`Configuration`テーブルが変更されたときに](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L23)実行される関数をサブスクライブします。 [この関数](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L24-L168)は、`PostDeploy.s.sol`が実行されてテーブルを変更した後に呼び出されます。
+
+5. サーバーの初期化関数が構成を取得すると、[サーバーのゼロ知識部分](#using-zokrates-from-typescript)を初期化するために[`zkFunctions`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L34-L35)を呼び出します。 ゼロ知識関数は地雷原の幅と高さを定数として持つ必要があるため、構成を取得するまでこれは実行できません。
+
+6. サーバーのゼロ知識部分が初期化された後、次のステップは[ゼロ知識検証コントラクトをブロックチェーンにデプロイ](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L42-L53)し、MUDで検証対象のアドレスを設定することです。
+
+7. 最後に、プレイヤーが[新しいゲームの開始](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71)または[既存のゲームでの採掘](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73-L108)をリクエストしたときに表示されるように、アップデートをサブスクライブします。
+
+#### 新しいゲーム {#new-game-flow}
+
+これはプレイヤーが新しいゲームをリクエストしたときに起こることです。
+
+1. このプレイヤーに進行中のゲームがない場合、またはゲームIDがゼロのゲームがある場合、クライアントは[新しいゲームボタン](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175)を表示します。 ユーザーがこのボタンを押すと、[Reactは`newGame`関数を実行します](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L96)。
+
+2. [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L43-L46)は`System`コールです。 MUDでは、すべての呼び出しは`World`コントラクトを経由し、ほとんどの場合、`__`を呼び出します。 この場合、呼び出しは`app__newGame`であり、MUDはそれを[`GameSystem`の`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L16-L22)にルーティングします。
+
+3. オンチェーン関数は、プレイヤーが進行中のゲームを持っていないことを確認し、持っていない場合は[`PendingGame`テーブルにリクエストを追加します](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L21)。
+
+4. サーバーは`PendingGame`の変更を検出し、[サブスクライブされた関数を実行します](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71)。 この関数は[`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L110-L114)を呼び出し、それがさらに[`createGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L116-L144)を呼び出します。
+
+5. `createGame`が最初に行うことは、[適切な数の地雷を持つランダムなマップを作成することです](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L120-L135)。 次に、Zokratesに必要な、空白の境界線を持つマップを作成するために[`makeMapBorders`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L147-L166)を呼び出します。 最後に、`createGame`は[`calculateMapHash`](#calculateMapHash)を呼び出して、ゲームIDとして使用されるマップのハッシュを取得します。
+
+6. `newGame`関数は新しいゲームを`gamesInProgress`に追加します。
+
+7. サーバーが最後に行うことは、オンチェーンにある[`app__newGameResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L38-L43)を呼び出すことです。 この関数は、アクセス制御を有効にするために、別の`System`、[`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol)にあります。 アクセス制御は、[MUD構成ファイル](https://mud.dev/config)、[`mud.config.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts#L67-L72)で定義されています。
+
+ アクセスリストは、単一のアドレスのみが`System`を呼び出すことを許可します。 これにより、サーバー関数へのアクセスが単一のアドレスに制限されるため、誰もサーバーになりすますことはできません。
+
+8. オンチェーンコンポーネントは関連するテーブルを更新します:
+
+ - `PlayerGame`でゲームを作成します。
+ - `GamePlayer`で逆マッピングを設定します。
+ - `PendingGame`からリクエストを削除します。
+
+9. サーバーは`PendingGame`の変更を識別しますが、[`wantsGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L58-L60)がfalseであるため、何もしません。
+
+10. クライアントでは、[`gameRecord`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L143-L148)はプレイヤーのアドレスの`PlayerGame`エントリに設定されます。 `PlayerGame`が変更されると、`gameRecord`も変更されます。
+
+11. `gameRecord`に値があり、ゲームが勝利または敗北していない場合、クライアントは[マップを表示します](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190)。
+
+#### 採掘 {#dig-flow}
+
+1. プレイヤーは[マップセルのボタンをクリックし](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L188)、[ `dig` 関数](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L33-L36)を呼び出します。 この関数は[オンチェーンで `dig` を呼び出します](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L24-L32)。
+
+2. オンチェーンコンポーネントは[いくつかのサニティチェックを実行し](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L25-L30)、成功した場合、採掘リクエストを[`PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L31)に追加します。
+
+3. サーバーは[`PendingDig`の変更を検出します](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73)。 [それが有効な場合](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L75-L84)、結果とそれが有効であることの証明の両方を生成するために[ゼロ知識コードを呼び出します](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L86-L95)(後述)。
+
+4. [サーバー](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L97-L107)はオンチェーンで[`digResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L45-L64)を呼び出します。
+
+5. `digResponse`は2つのことを行います。 まず、[ゼロ知識証明をチェックします](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L47-L61)。 次に、証明がチェックアウトされた場合、実際に結果を処理するために[`processDigResult`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L67-L86)を呼び出します。
+
+6. `processDigResult`は、ゲームが[負けた](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L76-L78)か[勝った](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L83-L86)かを確認し、[オンチェーンマップである`Map`を更新します](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L80)。
+
+7. クライアントはアップデートを自動的に取得し、[プレイヤーに表示されるマップを更新し](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190)、該当する場合は勝ちか負けかをプレイヤーに伝えます。
+
+## Zokratesの使用 {#using-zokrates}
+
+上記で説明したフローでは、ゼロ知識の部分をブラックボックスとして扱い、スキップしました。 では、それを開いて、そのコードがどのように書かれているかを見てみましょう。
+
+### マップのハッシュ化 {#hashing-map}
+
+使用するZokratesハッシュ関数である[Poseidon](https://www.poseidon-hash.info)を実装するために、[このJavaScriptコード](https://github.com/ZK-Plus/ICBC24_Tutorial_Compute-Offchain-Verify-onchain/tree/solutions/exercise)を使用できます。 しかし、これは高速ですが、Zokratesハッシュ関数を使用して行うよりも複雑になります。 これはチュートリアルなので、コードはパフォーマンスではなく、シンプルさのために最適化されています。 したがって、2つの異なるZokratesプログラムが必要です。1つはマップのハッシュを計算するためだけのもので(`hash`)、もう1つは実際にマップ上の場所での採掘結果のゼロ知識証明を作成するためのものです(`dig`)。
+
+### ハッシュ関数 {#hash-function}
+
+これはマップのハッシュを計算する関数です。 このコードを一行ずつ見ていきましょう。
+
+```
+import "hashes/poseidon/poseidon.zok" as poseidon;
+import "utils/pack/bool/pack128.zok" as pack128;
+```
+
+これら2行は、[Zokrates標準ライブラリ](https://zokrates.github.io/toolbox/stdlib.html)から2つの関数をインポートします。 [最初の関数](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/hashes/poseidon/poseidon.zok)は[Poseidonハッシュ](https://www.poseidon-hash.info/)です。 これは[`field`要素](https://zokrates.github.io/language/types.html#field)の配列を受け取り、`field`を返します。
+
+Zokratesのフィールド要素は通常256ビット未満ですが、それほど短くはありません。 コードを簡略化するために、マップを最大512ビットに制限し、4つのフィールドの配列をハッシュ化し、各フィールドでは128ビットのみを使用します。 [`pack128`関数](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/utils/pack/bool/pack128.zok)は、この目的のために128ビットの配列を`field`に変更します。
+
+```
+ def hashMap(bool[${width+2}][${height+2}] map) -> field {
+```
+
+この行は関数定義を開始します。 `hashMap`は、`map`という単一のパラメータ、2次元の`bool`(ean)配列を取得します。 マップのサイズは、[後で説明する](#why-map-border)理由により、`width+2` x `height+2`です。
+
+Zokratesプログラムはこのアプリケーションで[テンプレート文字列](https://www.w3schools.com/js/js_string_templates.asp)として保存されているため、`${width+2}`と`${height+2}`を使用できます。 `${`と`}`の間のコードはJavaScriptによって評価され、この方法でプログラムは異なるマップサイズに使用できます。 マップパラメータには、爆弾のない1つの場所幅の境界線が周囲にあり、これが幅と高さに2を加える必要がある理由です。
+
+戻り値はハッシュを含む`field`です。
+
+```
+ bool[512] mut map1d = [false; 512];
+```
+
+マップは2次元です。 しかし、`pack128`関数は2次元配列では機能しません。 そこで、まず`map1d`を使用してマップを512バイトの配列にフラット化します。 デフォルトではZokratesの変数は定数ですが、ループ内でこの配列に値を代入する必要があるため、[`mut`](https://zokrates.github.io/language/variables.html#mutability)として定義します。
+
+Zokratesには`undefined`がないため、配列を初期化する必要があります。 `[false; 512]`という式は、[512個の`false`値の配列](https://zokrates.github.io/language/types.html#declaration-and-initialization)を意味します。
+
+```
+ u32 mut counter = 0;
+```
+
+また、`map1d`に既に埋め込まれたビットとそうでないビットを区別するためにカウンターも必要です。
+
+```
+ for u32 x in 0..${width+2} {
+```
+
+これはZokratesで[`for`ループ](https://zokrates.github.io/language/control_flow.html#for-loops)を宣言する方法です。 Zokratesの`for`ループは固定の境界を持つ必要があります。なぜなら、ループのように見えますが、コンパイラは実際にはそれを「展開」するからです。 `width`はTypeScriptコードがコンパイラを呼び出す前に設定されるため、式`${width+2}`はコンパイル時定数です。
+
+```
+ for u32 y in 0..${height+2} {
+ map1d[counter] = map[x][y];
+ counter = counter+1;
+ }
+ }
+```
+
+マップ内のすべての場所について、その値を`map1d`配列に入れ、カウンターをインクリメントします。
+
+```
+ field[4] hashMe = [
+ pack128(map1d[0..128]),
+ pack128(map1d[128..256]),
+ pack128(map1d[256..384]),
+ pack128(map1d[384..512])
+ ];
+```
+
+`pack128`は`map1d`から4つの`field`値の配列を作成します。 Zokratesでは`array[a..b]`は`a`で始まり`b-1`で終わる配列のスライスを意味します。
+
+```
+ return poseidon(hashMe);
+}
+```
+
+`poseidon`を使用してこの配列をハッシュに変換します。
+
+### ハッシュプログラム {#hash-program}
+
+サーバーはゲーム識別子を作成するために`hashMap`を直接呼び出す必要があります。 しかし、Zokratesはプログラムを開始するために`main`関数しか呼び出せないため、ハッシュ関数を呼び出す`main`を持つプログラムを作成します。
+
+```
+${hashFragment}
+
+def main(bool[${width+2}][${height+2}] map) -> field {
+ return hashMap(map);
+}
+```
+
+### digプログラム {#dig-program}
+
+これはアプリケーションのゼロ知識部分の中心であり、採掘結果を検証するために使用される証明を生成します。
+
+```
+${hashFragment}
+
+// (x,y)の位置にある地雷の数
+def map2mineCount(bool[${width+2}][${height+2}] map, u32 x, u32 y) -> u8 {
+ return if map[x+1][y+1] { 1 } else { 0 };
+}
+```
+
+#### なぜマップの境界線が必要なのか {#why-map-border}
+
+ゼロ知識証明は、`if`文に簡単な同等のものがない[算術回路](https://medium.com/web3studio/simple-explanations-of-arithmetic-circuits-and-zero-knowledge-proofs-806e59a79785)を使用します。 代わりに、[条件演算子](https://en.wikipedia.org/wiki/Ternary_conditional_operator)の同等のものを使用します。 `a`がゼロか1のいずれかである場合、`if a { b } else { c }`は`ab+(1-a)c`として計算できます。
+
+このため、Zokratesの`if`文は常に両方の分岐を評価します。 たとえば、次のコードがあるとします。
+
+```
+bool[5] arr = [false; 5];
+u32 index=10;
+return if index>4 { 0 } else { arr[index] }
+```
+
+後でその値がゼロで乗算されるにもかかわらず、`arr[10]`を計算する必要があるため、エラーが発生します。
+
+これが、マップの周囲に1つの場所幅の境界線が必要な理由です。 場所の周りの地雷の総数を計算する必要があり、それは、採掘している場所の上下、左右の場所を見る必要があることを意味します。 つまり、これらの場所はZokratesに提供されるマップ配列に存在する必要があります。
+
+```
+def main(private bool[${width+2}][${height+2}] map, u32 x, u32 y) -> (field, u8) {
+```
+
+デフォルトでは、Zokratesの証明にはその入力が含まれています。 あるスポットの周りに5つの地雷があると知っていても、実際にどのスポットかがわからなければ意味がありません(また、自分のリクエストと照合するだけではダメです。なぜなら、証明者は異なる値を使用して、それについて教えない可能性があるからです)。 しかし、マップを秘密にしておく必要がありますが、Zokratesに提供する必要もあります。 解決策は、証明によって_明らかにされない_`private`パラメータを使用することです。
+
+これにより、別の悪用の機会が開かれます。 証明者は正しい座標を使用するかもしれませんが、場所の周りや場所自体に任意の数の地雷を持つマップを作成する可能性があります。 この悪用を防ぐために、ゼロ知識証明にゲーム識別子であるマップのハッシュを含めます。
+
+```
+ return (hashMap(map),
+```
+
+ここでの戻り値は、採掘結果だけでなく、マップのハッシュ配列も含むタプルです。
+
+```
+ if map2mineCount(map, x, y) > 0 { 0xFF } else {
+```
+
+場所自体に爆弾がある場合、特別な値として255を使用します。
+
+```
+ map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) +
+ map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) +
+ map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1)
+ }
+ );
+}
+```
+
+プレイヤーが地雷を踏んでいない場合、その場所の周りの地雷の数を合計して返します。
+
+### TypeScriptからZokratesを使用する {#using-zokrates-from-typescript}
+
+Zokratesにはコマンドラインインターフェースがありますが、このプログラムでは[TypeScriptコード](https://zokrates.github.io/toolbox/zokrates_js.html)で使用します。
+
+Zokratesの定義を含むライブラリは[`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts)と呼ばれます。
+
+```typescript
+import { initialize as zokratesInitialize } from "zokrates-js"
+```
+
+[Zokrates JavaScriptバインディング](https://zokrates.github.io/toolbox/zokrates_js.html)をインポートします。 Zokratesのすべての定義に解決されるプロミスを返すため、[`initialize`](https://zokrates.github.io/toolbox/zokrates_js.html#initialize)関数のみが必要です。
+
+```typescript
+export const zkFunctions = async (width: number, height: number) : Promise => {
+```
+
+Zokrates自体と同様に、1つの関数のみをエクスポートします。これも[非同期](https://www.w3schools.com/js/js_async.asp)です。 最終的に返されるとき、以下で見るようにいくつかの関数を提供します。
+
+```typescript
+const zokrates = await zokratesInitialize()
+```
+
+Zokratesを初期化し、ライブラリから必要なものをすべて取得します。
+
+```typescript
+const hashFragment = `
+ import "utils/pack/bool/pack128.zok" as pack128;
+ import "hashes/poseidon/poseidon.zok" as poseidon;
+ .
+ .
+ .
+ }
+ `
+
+const hashProgram = `
+ ${hashFragment}
+ .
+ .
+ .
+ `
+
+const digProgram = `
+ ${hashFragment}
+ .
+ .
+ .
+ `
+```
+
+次に、上記で見たハッシュ関数と2つのZokratesプログラムがあります。
+
+```typescript
+const digCompiled = zokrates.compile(digProgram)
+const hashCompiled = zokrates.compile(hashProgram)
+```
+
+ここでこれらのプログラムをコンパイルします。
+
+```typescript
+// ゼロ知識検証用のキーを作成します。
+// 本番システムでは、セットアップセレモニーを使用することをお勧めします。
+// (https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony)。
+const keySetupResults = zokrates.setup(digCompiled.program, "")
+const verifierKey = keySetupResults.vk
+const proverKey = keySetupResults.pk
+```
+
+本番システムでは、より複雑な[セットアップセレモニー](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony)を使用するかもしれませんが、デモンストレーションにはこれで十分です。 ユーザーが証明者キーを知っていても問題ありません。それが真実でない限り、それを使って物事を証明することはできません。 エントロピー(2番目のパラメータ、`""`)を指定しているため、結果は常に同じになります。
+
+**注:** Zokratesプログラムのコンパイルとキーの作成は遅いプロセスです。 毎回繰り返す必要はなく、マップサイズが変更されたときだけです。 本番システムでは、一度実行し、出力を保存します。 ここでそれをしていない唯一の理由は、単純さのためです。
+
+#### `calculateMapHash` {#calculateMapHash}
+
+```typescript
+const calculateMapHash = function (hashMe: boolean[][]): string {
+ return (
+ "0x" +
+ BigInt(zokrates.computeWitness(hashCompiled, [hashMe]).output.slice(1, -1))
+ .toString(16)
+ .padStart(64, "0")
+ )
+}
+```
+
+`computeWitness`関数(https://zokrates.github.io/toolbox/zokrates_js.html#computewitnessartifacts-args-options)は実際にZokratesプログラムを実行します。 これは2つのフィールドを持つ構造体を返します:JSON文字列としてのプログラムの出力である`output`、および結果のゼロ知識証明を作成するために必要な情報である`witness`です。 ここでは出力のみが必要です。
+
+出力は`"31337"`の形式の文字列で、引用符で囲まれた10進数です。 しかし、`viem`に必要な出力は`0x60A7`の形式の16進数です。 そこで、`.slice(1,-1)`を使用して引用符を削除し、次に`BigInt`を使用して残りの文字列(10進数)を[`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt)に変換します。 `.toString(16)`はこの`BigInt`を16進文字列に変換し、`"0x"+`は16進数のマーカーを追加します。
+
+```typescript
+// 採掘し、結果のゼロ知識証明を返します
+// (サーバーサイドコード)
+```
+
+ゼロ知識証明には、公開入力(`x`と`y`)と結果(マップのハッシュと爆弾の数)が含まれます。
+
+```typescript
+ const zkDig = function(map: boolean[][], x: number, y: number) : any {
+ if (x<0 || x>=width || y<0 || y>=height)
+ throw new Error("Trying to dig outside the map")
+```
+
+Zokratesでインデックスが範囲外かどうかを確認するのは問題なので、ここで行います。
+
+```typescript
+const runResults = zokrates.computeWitness(digCompiled, [map, `${x}`, `${y}`])
+```
+
+digプログラムを実行します。
+
+```typescript
+ const proof = zokrates.generateProof(
+ digCompiled.program,
+ runResults.witness,
+ proverKey)
+
+ return proof
+ }
+```
+
+[`generateProof`](https://zokrates.github.io/toolbox/zokrates_js.html#generateproofprogram-witness-provingkey-entropy)を使用して証明を返し、それを返します。
+
+```typescript
+const solidityVerifier = `
+ // マップサイズ: ${width} x ${height}
+ \n${zokrates.exportSolidityVerifier(verifierKey)}
+ `
+```
+
+Solidity検証者、ブロックチェーンにデプロイして`digCompiled.program`によって生成された証明を検証するために使用できるスマートコントラクト。
+
+```typescript
+ return {
+ zkDig,
+ calculateMapHash,
+ solidityVerifier,
+ }
+}
+```
+
+最後に、他のコードが必要とする可能性のあるすべてを返します。
+
+## セキュリティテスト {#security-tests}
+
+機能のバグはいずれ明らかになるため、セキュリティテストは重要です。 しかし、アプリケーションが安全でない場合、誰かが不正行為をして他人のリソースを手に入れてしまうまで、それが長期間隠されたままである可能性が高いです。
+
+### パーミッション {#permissions}
+
+このゲームには特権を持つエンティティが1つ、サーバーがあります。 これは、[`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol)の関数を呼び出すことを許可された唯一のユーザーです。 [`cast`](https://book.getfoundry.sh/cast/)を使用して、許可された関数への呼び出しがサーバーアカウントとしてのみ許可されていることを確認できます。
+
+[サーバーの秘密鍵は`setupNetwork.ts`にあります](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/mud/setupNetwork.ts#L52)。
+
+1. `anvil`(ブロックチェーン)を実行するコンピュータで、これらの環境変数を設定します。
+
+ ```sh copy
+ WORLD_ADDRESS=0x8d8b6b8414e1e3dcfd4168561b9be6bd3bf6ec4b
+ UNAUTHORIZED_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a
+ AUTHORIZED_KEY=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
+ ```
+
+2. `cast`を使用して、検証者アドレスを未承認のアドレスとして設定しようとします。
+
+ ```sh copy
+ cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $UNAUTHORIZED_KEY
+ ```
+
+ `cast`が失敗を報告するだけでなく、ブラウザのゲームで**MUD Dev Tools**を開き、**Tables**をクリックして、**app\_\_VerifierAddress**を選択することもできます。 アドレスがゼロでないことを確認してください。
+
+3. 検証者アドレスをサーバーのアドレスとして設定します。
+
+ ```sh copy
+ cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $AUTHORIZED_KEY
+ ```
+
+ **app\_\_VerifiedAddress**のアドレスはゼロになるはずです。
+
+同じ`System`内のすべてのMUD関数は同じアクセス制御を通過するため、このテストで十分だと考えます。 そうでない場合は、[`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol)の他の関数を確認できます。
+
+### ゼロ知識の悪用 {#zero-knowledge-abuses}
+
+Zokratesを検証するための数学は、このチュートリアル(そして私の能力)の範囲を超えています。 しかし、ゼロ知識コードに対してさまざまなチェックを実行して、正しく行われていない場合に失敗することを確認できます。 これらのテストはすべて、[`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts)を変更し、アプリケーション全体を再起動する必要があります。 サーバープロセスを再起動するだけでは不十分です。なぜなら、アプリケーションが不可能な状態になるからです(プレイヤーは進行中のゲームを持っていますが、そのゲームはサーバーにとって利用できなくなっています)。
+
+#### 間違った答え {#wrong-answer}
+
+最も単純な可能性は、ゼロ知識証明で間違った答えを提供することです。 そのためには、`zkDig`の内部に入り、[91行目を変更します](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L91):
+
+```ts
+proof.inputs[3] = "0x" + "1".padStart(64, "0")
+```
+
+これは、正しい答えに関係なく、常に1つの爆弾があると主張することを意味します。 このバージョンでプレイしてみてください。`pnpm dev`画面の**server**タブに次のエラーが表示されます:
+
+```
+ cause: {
+ code: 3,
+ message: 'execution reverted: revert: Zero knowledge verification fail',
+ data: '0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000
+000000000000000000000000000000000000000000000000205a65726f206b6e6f776c6564676520766572696669636174696f6
+e206661696c'
+ },
+```
+
+したがって、この種の不正行為は失敗します。
+
+#### 間違った証明 {#wrong-proof}
+
+正しい情報を提供するが、証明データが間違っている場合はどうなりますか? では、91行目を次のように置き換えます。
+
+```ts
+proof.proof = {
+ a: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")],
+ b: [
+ ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")],
+ ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")],
+ ],
+ c: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")],
+}
+```
+
+それでも失敗しますが、今回は検証者呼び出し中に発生するため、理由なしで失敗します。
+
+### ユーザーはどのようにしてゼロトラストコードを検証できますか? {#user-verify-zero-trust}
+
+スマートコントラクトは比較的簡単に検証できます。 通常、デベロッパーはソースコードをブロックエクスプローラーに公開し、ブロックエクスプローラーはソースコードが[コントラクトデプロイメントトランザクション](/developers/docs/smart-contracts/deploying/)のコードにコンパイルされることを確認します。 MUD `System`sの場合、これは[少し複雑です](https://mud.dev/cli/verify)が、それほどではありません。
+
+ゼロ知識ではこれはより困難です。 検証者はいくつかの定数を含み、それらに対していくつかの計算を実行します。 これは、何が証明されているかを教えてくれません。
+
+```solidity
+ function verifyingKey() pure internal returns (VerifyingKey memory vk) {
+ vk.alpha = Pairing.G1Point(uint256(0x0f43f4fe7b5c2326fed4ac6ed2f4003ab9ab4ea6f667c2bdd77afb068617ee16), uint256(0x25a77832283f9726935219b5f4678842cda465631e72dbb24708a97ba5d0ce6f));
+ vk.beta = Pairing.G2Point([uint256(0x2cebd0fbd21aca01910581537b21ae4fed46bc0e524c055059aa164ba0a6b62b), uint256(0x18fd4a7bc386cf03a95af7163d5359165acc4e7961cb46519e6d9ee4a1e2b7e9)], [uint256(0x11449dee0199ef6d8eebfe43b548e875c69e7ce37705ee9a00c81fe52f11a009), uint256(0x066d0c83b32800d3f335bb9e8ed5e2924cf00e77e6ec28178592eac9898e1a00)]);
+```
+
+解決策は、少なくともブロックエクスプローラーがユーザーインターフェースにZokrates検証を追加するまでは、アプリケーション開発者がZokratesプログラムを利用可能にし、少なくとも一部のユーザーが適切な検証キーを使用して自分でコンパイルすることです。
+
+そのためには:
+
+1. [Zokratesをインストールします](https://zokrates.github.io/gettingstarted.html)。
+
+2. Zokratesプログラムを含む`dig.zok`というファイルを作成します。 以下のコードは、元のマップサイズ10x5を維持していることを前提としています。
+
+ ```zokrates
+ import "utils/pack/bool/pack128.zok" as pack128;
+ import "hashes/poseidon/poseidon.zok" as poseidon;
+
+ def hashMap(bool[12][7] map) -> field {
+ bool[512] mut map1d = [false; 512];
+ u32 mut counter = 0;
+
+ for u32 x in 0..12 {
+ for u32 y in 0..7 {
+ map1d[counter] = map[x][y];
+ counter = counter+1;
+ }
+ }
+
+ field[4] hashMe = [
+ pack128(map1d[0..128]),
+ pack128(map1d[128..256]),
+ pack128(map1d[256..384]),
+ pack128(map1d[384..512])
+ ];
+
+ return poseidon(hashMe);
+ }
+
+
+ // (x,y)の位置にある地雷の数
+ def map2mineCount(bool[12][7] map, u32 x, u32 y) -> u8 {
+ return if map[x+1][y+1] { 1 } else { 0 };
+ }
+
+ def main(private bool[12][7] map, u32 x, u32 y) -> (field, u8) {
+ return (hashMap(map) ,
+ if map2mineCount(map, x, y) > 0 { 0xFF } else {
+ map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) +
+ map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) +
+ map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1)
+ }
+ );
+ }
+ ```
+
+3. Zokratesコードをコンパイルし、検証キーを作成します。 検証キーは、元のサーバーで使用されたのと同じエントロピーで作成する必要があります。[この場合は空の文字列です](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L67)。
+
+ ```sh copy
+ zokrates compile --input dig.zok
+ zokrates setup -e ""
+ ```
+
+4. 自分でSolidity検証者を作成し、ブロックチェーン上のものと機能的に同一であることを確認します(サーバーはコメントを追加しますが、それは重要ではありません)。
+
+ ```sh copy
+ zokrates export-verifier
+ diff verifier.sol ~/20240901-secret-state/packages/contracts/src/verifier.sol
+ ```
+
+## 設計上の決定 {#design}
+
+十分に複雑なアプリケーションでは、トレードオフを必要とする競合する設計目標があります。 いくつかのトレードオフと、現在の解決策が他の選択肢よりも好ましい理由を見てみましょう。
+
+### なぜゼロ知識なのか {#why-zero-knowledge}
+
+マインスイーパには、実際にはゼロ知識は必要ありません。 サーバーは常にマップを保持し、ゲームが終了したときにすべてを明らかにすることができます。 その後、ゲームの終わりに、スマートコントラクトはマップのハッシュを計算し、それが一致することを確認し、一致しない場合はサーバーにペナルティを課すか、ゲームを完全に無視することができます。
+
+このより単純な解決策を使用しなかったのは、明確な終了ステートを持つ短いゲームでのみ機能するためです。 ゲームが潜在的に無限である場合([自律的な世界](https://0xparc.org/blog/autonomous-worlds)の場合など)、ステートを明らかに_せずに_証明する解決策が必要です。
+
+チュートリアルとして、この記事は理解しやすい短いゲームを必要としていましたが、このテクニックはより長いゲームに最も役立ちます。
+
+### なぜZokratesなのか? {#why-zokrates}
+
+[Zokrates](https://zokrates.github.io/)は利用可能な唯一のゼロ知識ライブラリではありませんが、通常の[命令型](https://en.wikipedia.org/wiki/Imperative_programming)プログラミング言語に類似しており、ブール変数をサポートしています。
+
+あなたのアプリケーションでは、要件が異なるため、[Circum](https://docs.circom.io/getting-started/installation/)または[Cairo](https://www.cairo-lang.org/tutorials/getting-started-with-cairo/)を使用することを好むかもしれません。
+
+### Zokratesをいつコンパイルするか {#when-compile-zokrates}
+
+このプログラムでは、[サーバーが起動するたびに](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L60-L61)Zokratesプログラムをコンパイルします。 これは明らかにリソースの無駄ですが、これはチュートリアルであり、単純さのために最適化されています。
+
+本番レベルのアプリケーションを書いていたとしたら、この地雷原サイズのコンパイル済みZokratesプログラムのファイルがあるかどうかを確認し、もしあればそれを使用するでしょう。 オンチェーンで検証者コントラクトをデプロイする場合も同様です。
+
+### 検証者キーと証明者キーの作成 {#key-creation}
+
+[キーの作成](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L63-L69)は、特定の地雷原サイズに対して一度以上行う必要のない純粋な計算です。 繰り返しますが、単純さのために一度だけ行われます。
+
+さらに、[セットアップセレモニー](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony)を使用することもできます。 セットアップセレモニーの利点は、ゼロ知識証明で不正行為をするためには、各参加者からのエントロピーまたはいくつかの中間結果が必要であることです。 少なくとも1人のセレモニー参加者が正直で、その情報を削除すれば、ゼロ知識証明は特定の攻撃から安全です。 しかし、情報がどこからでも削除されたことを確認する_メカニズムはありません_。 ゼロ知識証明が非常に重要な場合は、セットアップセレモニーに参加することをお勧めします。
+
+ここでは、数十人の参加者がいた[perpetual powers of tau](https://github.com/privacy-scaling-explorations/perpetualpowersoftau)に依存しています。 おそらく十分に安全で、はるかに単純です。 また、キー作成中にエントロピーを追加しないため、ユーザーが[ゼロ知識構成を検証](#user-verify-zero-trust)しやすくなります。
+
+### どこで検証するか {#where-verification}
+
+ゼロ知識証明はオンチェーン(ガスがかかる)またはクライアント([`verify`](https://zokrates.github.io/toolbox/zokrates_js.html#verifyverificationkey-proof)を使用)で検証できます。 私が前者を選んだのは、これにより[検証者を一度検証](#user-verify-zero-trust)し、コントラクトアドレスが同じままである限り変更されないと信頼できるからです。 検証がクライアントで行われた場合、クライアントをダウンロードするたびに受け取るコードを検証する必要があります。
+
+また、このゲームはシングルプレイヤーですが、多くのブロックチェーンゲームはマルチプレイヤーです。 オンチェーン検証は、ゼロ知識証明を一度だけ検証することを意味します。 クライアントでそれを行うには、各クライアントが独立して検証する必要があります。
+
+### マップをTypeScriptまたはZokratesでフラット化するか? {#where-flatten}
+
+一般に、処理がTypeScriptまたはZokratesのいずれかで行える場合、はるかに高速で、ゼロ知識証明を必要としないTypeScriptで行う方が優れています。 これが、例えば、Zokratesにハッシュを提供して、それが正しいことを検証させない理由です。 ハッシュ化はZokrates内部で行う必要がありますが、返されたハッシュとオンチェーンのハッシュとの照合は外部で行うことができます。
+
+しかし、TypeScriptでできたにもかかわらず、私たちはまだ[Zokratesでマップをフラット化しています](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L15-L20)。 その理由は、私の意見では、他の選択肢がもっと悪いからです。
+
+- Zokratesコードに1次元のブール値配列を提供し、`x*(height+2)
+ +y`のような式を使用して2次元マップを取得します。 これにより[コード](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L44-L47)が多少複雑になるため、チュートリアルにはパフォーマンスの向上が価値がないと判断しました。
+
+- Zokratesに1次元配列と2次元配列の両方を送信します。 しかし、この解決策では何も得られません。 Zokratesコードは、提供された1次元配列が本当に2次元配列の正しい表現であることを検証する必要があります。 したがって、パフォーマンスの向上はありません。
+
+- Zokratesで2次元配列をフラット化します。 これが最も簡単な選択肢なので、私はそれを選びました。
+
+### マップの保存場所 {#where-store-maps}
+
+このアプリケーションでは、[`gamesInProgress`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L20)は単にメモリ内の変数です。 これは、サーバーがダウンして再起動する必要がある場合、保存されていたすべての情報が失われることを意味します。 プレイヤーはゲームを続行できないだけでなく、オンチェーンコンポーネントがまだゲームが進行中であると考えているため、新しいゲームを開始することさえできません。
+
+これは、この情報をデータベースに保存する本番システムにとっては明らかに悪い設計です。 ここで変数を使用した唯一の理由は、これがチュートリアルであり、単純さが主な考慮事項であるためです。
+
+## 結論:どのような条件下でこれが適切なテクニックですか? {#conclusion}
+
+これで、オンチェーンに属さない秘密のステートを保存するサーバーでゲームを書く方法がわかりました。 しかし、どのような場合にそれを行うべきでしょうか? 主な考慮事項は2つあります。
+
+- _長期間実行されるゲーム_:[上で述べたように](#why-zero-knowledge)、短いゲームでは、ゲームが終了したらステートを公開し、すべてを検証させることができます。 しかし、ゲームが長い時間または無期限にかかり、ステートを秘密にしておく必要がある場合、それは選択肢ではありません。
+
+- _ある程度の中央集権化が許容される_:ゼロ知識証明は、エンティティが結果を偽造していないという整合性を検証できます。 彼らができないことは、エンティティがまだ利用可能であり、メッセージに応答することを保証することです。 可用性も分散化する必要がある状況では、ゼロ知識証明は十分な解決策ではなく、[マルチパーティ計算](https://en.wikipedia.org/wiki/Secure_multi-party_computation)が必要です。
+
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
+
+### 謝辞 {#acknowledgements}
+
+- Alvaro Alonsoがこの記事の草稿を読み、Zokratesに関する私の誤解のいくつかを明らかにしてくれました。
+
+残りの誤りは私の責任です。
diff --git a/public/content/translations/ja/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/ja/developers/tutorials/secure-development-workflow/index.md
index a8c2f9e347f..e0d4d1c2b20 100644
--- a/public/content/translations/ja/developers/tutorials/secure-development-workflow/index.md
+++ b/public/content/translations/ja/developers/tutorials/secure-development-workflow/index.md
@@ -1,45 +1,42 @@
---
-title: スマートコントラクトのセキュリティ・チェックリスト
-description: セキュアなスマートコントラクトを作成するための推奨ワークフロー
+title: "スマートコントラクトのセキュリティ・チェックリスト"
+description: "セキュアなスマートコントラクトを作成するための推奨ワークフロー"
author: "Trailofbits"
-tags:
- - "スマートコントラクト"
- - "セキュリティ"
- - "Solidity"
+tags: [ "スマートコントラクト", "セキュリティ", "Solidity" ]
skill: intermediate
lang: ja
published: 2020-09-07
-source: セキュアなコントラクトの開発
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md
---
-## スマートコントラクトの開発チェックリスト {#smart-contract-development-checklist}
+## スマートコントラクト開発チェックリスト {#smart-contract-development-checklist}
スマートコントラクトを作成する際には、以下に挙げる大まかなプロセスに従って行うことをお勧めします。
既知のセキュリティ関連の問題点について確認します:
-- [Slither](https://github.com/crytic/slither)で、コントラクトをレビューする。 Slitherには、40種類以上のよくある脆弱性を対象とする検出機能が搭載されています。 新しいコードが追加されるたびにレビューを実行して、クリーンな報告になるようにします(特定の問題を無視する必要がある場合は、トリアージモードを使用します)。
-- [Crytic](https://crytic.io/)で、コントラクトをレビューする。 Cryticでは、Slitherでは検出できな50種類の問題点を確認できます。 さらに、GitHubのプルリクエストに含まれるセキュリティ関連の問題点を簡単に発見できるので、チーム内の問題把握に役立ちます。
+- [Slither](https://github.com/crytic/slither)でコントラクトをレビューする。 Slitherには、40種類以上のよくある脆弱性を対象とする検出機能が搭載されています。 新しいコードが追加されるたびにレビューを実行して、クリーンな報告になるようにします(特定の問題を無視する必要がある場合は、トリアージモードを使用します)。
+- [Crytic](https://crytic.io/)でコントラクトをレビューする。 Cryticでは、Slitherでは検出できな50種類の問題点を確認できます。 さらに、GitHubのプルリクエストに含まれるセキュリティ関連の問題点を簡単に発見できるので、チーム内の問題把握に役立ちます。
あなたのコントラクトに含まれる特別な機能について検討する:
-- コントラクトがアップグレード可能かどうか: [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks)または[Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/)を使って、アップグレード可能性に関するコードに欠陥がないか確認します。 当チームでは、アップグレードの失敗につながる17のケースを文書化しています。
-- コントラクトは、ERC準拠を謳っていますか? [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance)で確認してください。 このツールでは、6種類の一般的な仕様に準拠していない場合、ただちに指摘されます。
-- サードパーティのトークンと統合予定ですか? 外部コントラクトを利用する事前に、この[トークン統合チェックリスト](/developers/tutorials/token-integration-checklist/)でレビューしてください。
+- コントラクトがアップグレード可能かどうか: [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks)または[Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/)で、アップグレード可能性コードの欠陥をレビューする。 当チームでは、アップグレードの失敗につながる17のケースを文書化しています。
+- コントラクトは、ERC準拠を謳っていますか? [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance)でそれらをチェックする。 このツールでは、6種類の一般的な仕様に準拠していない場合、ただちに指摘されます。
+- サードパーティのトークンと統合予定ですか? 外部コントラクトに依存する前に、[トークン統合チェックリスト](/developers/tutorials/token-integration-checklist/)をレビューする。
コードにおける重要なセキュリティ関連の機能を、視覚的にチェックします。
-- Slitherの[inheritance-graph ](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph)プリンターをレビューします。 不注意によるシャドーイングやC3 linearizationにまつわる問題を回避してください。
-- Slitherで、[機能サマリー](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary)のプリンター(表示)をレビューします。 機能の可視性およびアクセス管理のレポートが作成されます。
-- Slitherの[vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization)プリンタをレビューします。 状態変数に対するアクセス管理のレポートが作成されます。
+- Slitherの[inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph)プリンターをレビューする。 不注意によるシャドーイングやC3 linearizationにまつわる問題を回避してください。
+- Slitherの[function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary)プリンターをレビューする。 機能の可視性およびアクセス管理のレポートが作成されます。
+- Slitherの[vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization)プリンターをレビューする。 状態変数に対するアクセス管理のレポートが作成されます。
セキュリティ関連の重要な属性を文書化し、自動化されたテスト生成機能を用いて評価します:
-- [コードにおけるセキュリティ属性を文書化する](/developers/tutorials/guide-to-smart-contract-security-tools/)方法について学びます。 最初は大変ですが、最良の結果を得る上で最も重要な作業です。 また、このチュートリアルのより高度なテクニックを活用する上でも、必須の作業です。
-- [Echidna](https://github.com/crytic/echidna)および[Manticore](https://manticore.readthedocs.io/en/latest/verifier.html)で使用するために、Solidityでセキュリティ関連の属性を定義します。 状態マシン、アクセス管理、算術演算、外部とのやりとり、および標準の遵守に焦点を当ててください。
-- [SlitherのPython API](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/)で、セキュリティ関連のプロパティを定義します。 継承、変数の依存関係、アクセス管理、およびその他の構造上の問題に焦点を当ててください。
-- [Crytic](https://crytic.io)を使用して、コミットごとにプロパティテストを実行します。 Cryticでは、セキュリティ属性に関するテストを実行、評価できるため、チーム全員がGitHubで合格したかどうか簡単に確認できます。 テストが不合格だった場合、コミットをブロックできます。
+- [コードのセキュリティプロパティを文書化する](/developers/tutorials/guide-to-smart-contract-security-tools/)方法を学ぶ。 最初は大変ですが、最良の結果を得る上で最も重要な作業です。 また、このチュートリアルのより高度なテクニックを活用する上でも、必須の作業です。
+- [Echidna](https://github.com/crytic/echidna)および[Manticore](https://manticore.readthedocs.io/en/latest/verifier.html)で使用するために、Solidityでセキュリティプロパティを定義する。 状態マシン、アクセス管理、算術演算、外部とのやりとり、および標準の遵守に焦点を当ててください。
+- [SlitherのPython API](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/)でセキュリティプロパティを定義する。 継承、変数の依存関係、アクセス管理、およびその他の構造上の問題に焦点を当ててください。
+- [Crytic](https://crytic.io)で、コミットごとにプロパティテストを実行する。 Cryticでは、セキュリティ属性に関するテストを実行、評価できるため、チーム全員がGitHubで合格したかどうか簡単に確認できます。 テストが不合格だった場合、コミットをブロックできます。
最後に、自動化ツールでは容易に特定できない以下のような問題についても注意してください:
@@ -48,8 +45,8 @@ sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/devel
- 秘匿化された操作
- 外部DeFiコンポーネントとの危険なやりとり
-## ヘルプを求めましょう {#ask-for-help}
+## ヘルプを求める {#ask-for-help}
-毎週火曜日の午後に、[イーサリアム・オフィス・アワー](https://calendly.com/dan-trailofbits/office-hours)が開かれています。 この1対1の1時間のセッションで、セキュリティに関する質問をしたり、ツールを使ってトラブルシューティングをしたり、現在のアプローチについて専門家からフィードバックを得ることができます。 私たちが、このガイドに基づいてサポートします。
+[イーサリアムオフィスアワー](https://calendly.com/dan-trailofbits/office-hours)は毎週火曜日の午後に開催されます。 この1対1の1時間のセッションで、セキュリティに関する質問をしたり、ツールを使ってトラブルシューティングをしたり、現在のアプローチについて専門家からフィードバックを得ることができます。 私たちが、このガイドに基づいてサポートします。
-ぜひ、私たちのスタックである[Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw)に参加してください。 質問があれば、いつでも#cryticチャンネルと#ethereumチャンネルにお問い合わせください。
+Slackに参加する:[Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw)。 質問があれば、いつでも#cryticチャンネルと#ethereumチャンネルにお問い合わせください。
diff --git a/public/content/translations/ja/developers/tutorials/send-token-etherjs/index.md b/public/content/translations/ja/developers/tutorials/send-token-etherjs/index.md
index c160a581043..8047ed3dae4 100644
--- a/public/content/translations/ja/developers/tutorials/send-token-etherjs/index.md
+++ b/public/content/translations/ja/developers/tutorials/send-token-etherjs/index.md
@@ -1,6 +1,6 @@
---
-title: ethers.jsを使用したトークンの送信
-description: ethers.jsを使用してトークンを送信するための初心者向けのガイド
+title: "ethers.jsを使用したトークンの送信"
+description: "ethers.jsを使用してトークンを送信するための初心者向けのガイド"
author: Kim YongJun
tags:
- "ETHERS.JS"
diff --git a/public/content/translations/ja/developers/tutorials/send-token-ethersjs/index.md b/public/content/translations/ja/developers/tutorials/send-token-ethersjs/index.md
index d55ad00cb25..66525f44a3d 100644
--- a/public/content/translations/ja/developers/tutorials/send-token-ethersjs/index.md
+++ b/public/content/translations/ja/developers/tutorials/send-token-ethersjs/index.md
@@ -1,11 +1,8 @@
---
-title: ethers.jsを使用したトークンの送信
-description: ethers.jsを使用してトークンを送信するための初心者向けのガイド
+title: "ethers.jsを使用してトークンを送信する"
+description: "ethers.jsを使用してトークンを送信するための初心者向けガイド。"
author: Kim YongJun
-tags:
- - "ETHERS.JS"
- - "ERC-20"
- - "トークン"
+tags: [ "ETHERS.JS", "ERC-20", "トークン" ]
skill: beginner
lang: ja
published: 2021-04-06
@@ -13,15 +10,16 @@ published: 2021-04-06
## ethers.js(5.0)を使用したトークンの送信 {#send-token}
-### このチュートリアルでは、次の処理を行う方法について学びます。 {#you-learn-about}
+### このチュートリアルで学ぶこと {#you-learn-about}
-- ethers.js のインポート
+- ethers.jsのインポート
- トークンの転送
- ネットワークの混雑状況に応じたガス代の設定
### はじめに {#to-get-started}
-まず、ethers.js というライブラリを javascript にインポートする必要があります。これには、ethers.js 5.0 も含まれます。
+始めるには、まずethers.jsライブラリをJavaScriptにインポートする必要があります。
+ethers.js(5.0)をインクルードします。
### インストール {#install-ethersjs}
@@ -29,16 +27,16 @@ published: 2021-04-06
/home/ricmoo> npm install --save ethers
```
-ブラウザで ES6 を使用するには次のようにします。
+ブラウザでES6を使用するには次のようにします。
```html
```
-ブラウザで ES3(UMD)を使用するには次のようにします。
+ブラウザでES3(UMD)を使用するには次のようにします。
```html
```
-バックエンドで使用するライブラリをインストールしたい場合や、ビルドが必要なフロントエンドのプロジェクトの場合は、 次のようにnpmを使用してインストールします。
+バックエンドやビルドを要するフロントエンドプロジェクトで使うためにライブラリをインストールする場合は、npmを使ってインストールできます:
```bash
npm install web3 --save
```
-次に、Node.jsのスクリプトやBrowserifyのフロントエンド・プロジェクトにWeb3.jsをインポートするには、以下のJavaScriptコードを使用します:
+次に、Node.jsのスクリプトやBrowserifyのフロントエンドプロジェクトにWeb3.jsをインポートするには、以下のJavaScriptの行を使用します:
```js
const Web3 = require("web3")
```
-プロジェクトにライブラリを追加したので、初期化する必要があります。 プロジェクトは、ブロックチェーンと通信できなければなりません。 イーサリアムのほとんどのライブラリは、リモートプロシージャーコール(RPC)を使って[ノード](/developers/docs/nodes-and-clients/)と通信します。 Web3プロバイダを開始するには、プロバイダのURLをコンストラクタとして橋渡しするWeb3のインスタンスを生成します。 お使いのコンピュータで、ノードあるいは[Ganacheインスタンス](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/)を実行中の場合は、以下のようになります:
+プロジェクトにライブラリを組み込んだので、次に初期化が必要です。 プロジェクトは、ブロックチェーンと通信できる必要があります。 ほとんどのイーサリアムライブラリは、RPCコールを介して[ノード](/developers/docs/nodes-and-clients/)と通信します。 Web3プロバイダーを初期化するには、プロバイダーのURLをコンストラクタに渡してWeb3インスタンスを生成します。 お使いのコンピュータでノードまたは[ganacheインスタンスを実行](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/)している場合は、次のようになります:
```js
const web3 = new Web3("http://localhost:8545")
```
-ホストされているノードに直接アクセスしたい場合は、[ノード・アズ・ア・サービス](/developers/docs/nodes-and-clients/nodes-as-a-service)の一覧から見つけることができます。
+ホストされているノードに直接アクセスしたい場合は、[サービスとしてのノード](/developers/docs/nodes-and-clients/nodes-as-a-service)でオプションを見つけることができます。
```js
const web3 = new Web3("https://cloudflare-eth.com")
```
-Web3インスタンスが正しく設定されたかをテストするために、 `getBlockNumber`関数を使用して、最新のブロック番号を取得してみましょう。 この関数は、コールバックをパラメータとして受け取り、ブロック番号を整数として返します。
+Web3インスタンスが正しく設定されたかテストするために、`getBlockNumber`関数を使って最新のブロック番号を取得してみましょう。 この関数は、コールバックをパラメータとして受け取り、ブロック番号を整数として返します。
```js
var Web3 = require("web3")
@@ -56,7 +54,7 @@ web3.eth.getBlockNumber(function (error, result) {
})
```
-このプログラムを実行すると、最新のブロック番号(ブロックチェーンの最上部) が表示されます。 また、`await/async`の関数呼び出しを使用することで、コードにおける入れ子状の呼び出しを回避することができます。
+このプログラムを実行すると、最新のブロック番号、つまりブロックチェーンの最上部が、シンプルに表示されます。 また、`await/async`関数呼び出しを使うと、コード内でのコールバックのネストを避けることができます:
```js
async function getBlockNumber() {
@@ -68,27 +66,27 @@ async function getBlockNumber() {
getBlockNumber()
```
-Web3インスタンス上で利用可能なすべての関数は、 [web3.jsの公式ドキュメンテーション](https://docs.web3js.org/)をご覧ください。
+Web3インスタンスで利用可能なすべての関数は、[web3.jsの公式ドキュメント](https://docs.web3js.org/)で確認できます。
-ほとんどのWeb3ライブラリでは、結果を送り返すノードに対してバックグラウンドでJSON RPCを呼び出すため、非同期で処理を行います。
+ほとんどのWeb3ライブラリは非同期です。これは、バックグラウンドでライブラリがノードにJSON-RPCコールを行い、ノードが結果を返すためです。
-ブラウザで作業している場合、一部のウォレットは、Web3インスタンスを直接注入します。トランザクションを行うためにユーザーのイーサリアムアドレスとやり取りを行う予定がある場合は特に、可能な限り`await/async`関数呼び出しを使用するようにしてください。
+ブラウザで作業している場合、一部のウォレットはWeb3インスタンスを直接インジェクトします。特にユーザーのイーサリアムアドレスとやり取りしてトランザクションを行う予定がある場合は、可能な限りそのインスタンスを使用するようにしてください。
-以下のコードスニペットは、MetaMaskウォレットが利用可能か確認し、利用できる場合は有効化するものです。 その後、あなたはユーザーの残高を確認できるようになり、各ユーザーは、あなたが彼らにイーサリアムブロックチェーン上で実行させたいトランザクションを各自で検証できるようになります:
+これは、MetaMaskウォレットが利用可能かどうかを検出し、利用可能であれば有効化を試みるスニペットです。 これにより、後でユーザーの残高を読み取ったり、イーサリアムブロックチェーン上で実行させたいトランザクションをユーザーが検証できるようになります:
```js
if (window.ethereum != null) {
state.web3 = new Web3(window.ethereum)
try {
- // Request account access if needed
+ // 必要に応じてアカウントへのアクセスを要求
await window.ethereum.enable()
- // Accounts now exposed
+ // アカウントが公開されました
} catch (error) {
- // User denied account access...
+ // ユーザーがアカウントアクセスを拒否しました...
}
}
```
-他にも[Ethers.js](https://docs.ethers.io/) など、 web3.js のようにイーサリアム・ブロックチェーンとやりとりするライブラリがあります。 次のチュートリアルでは、[ブロックチェーンに新たに追加されたブロックを簡単にリッスンし、その内容を確認する方法](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/)を紹介します。
+[Ethers.js](https://docs.ethers.io/)のようなweb3.jsの代替ライブラリも存在し、同様に広く使われています。 次のチュートリアルでは、[ブロックチェーン上で新たに着信するブロックを簡単にリッスンし、その内容を確認する方法](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/)を見ていきます。
diff --git a/public/content/translations/ja/developers/tutorials/short-abi/index.md b/public/content/translations/ja/developers/tutorials/short-abi/index.md
index fd9cb3f38ea..72540ab722b 100644
--- a/public/content/translations/ja/developers/tutorials/short-abi/index.md
+++ b/public/content/translations/ja/developers/tutorials/short-abi/index.md
@@ -1,85 +1,106 @@
---
title: "コールデータを最適化するための簡潔なABI"
-description: オプティミスティック・ロールアップのためのスマートコントラクトの最適化
+description: "オプティミスティック・ロールアップのためのスマートコントラクトの最適化"
author: Ori Pomerantz
lang: ja
-tags:
- - "レイヤー2"
+tags: [ "レイヤー2" ]
skill: intermediate
published: 2022-04-01
---
## はじめに {#introduction}
-この記事では、[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups)とは何か、オプティミスティック・ロールアップにおけるトランザクションコスト、および、様々なコスト構造に応じてイーサリアム・メインネット上の様々な事項をいかに最適化すべきかについて学びます。 さらに、この最適化の実装方法についても紹介します。
+この記事では、[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups)やそのトランザクションコスト、そしてその異なるコスト構造が、Ethereumメインネットとは異なるものの最適化をどのように要求するかについて学びます。
+また、この最適化を実装する方法についても学びます。
-### 開示情報 {#full-disclosure}
+### 完全な情報開示 {#full-disclosure}
-筆者は、[Optimism](https://www.optimism.io/)のフルタイム従業員であり、この記事に含まれる実例はすべてOptimismで実行されます。 ただし、紹介するテクニックは他のロールアップでも問題なく実行できます。
+筆者は[Optimism](https://www.optimism.io/)のフルタイム従業員であるため、この記事の例はOptimismで実行されます。
+ただし、ここで説明するテクニックは、他のロールアップでも同様に機能するはずです。
### 用語 {#terminology}
-ロールアップの議論において、「レイヤー1」は、イーサリアムネットワークの本番環境であるメインネットを指します。 「レイヤー2」(L2)という用語は、ロールアップまたはセキュリティのためにL1に依存しているが、そのほとんどをオフチェーンで処理する他のシステムに使用されます。
+ロールアップについて議論する際、「レイヤー1」(L1) という用語は、本番のEthereumネットワークであるメインネットを指すために使用されます。
+「レイヤー2」(L2) という用語は、ロールアップ、またはセキュリティをL1に依存しつつ、処理のほとんどをオフチェーンで行うその他のシステムに使用されます。
-## L2上のトランザクションコストをさらに引き下げる方法 {#how-can-we-further-reduce-the-cost-of-L2-transactions}
+## L2トランザクションのコストをさらに削減するには {#how-can-we-further-reduce-the-cost-of-L2-transactions}
-[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups)では、すべてのユーザーが過去のトランザクションを参照し、現在の状態が正しいことを検証できるように、過去のすべてのトランザクション記録を保存する必要があります。 イーサリアムメインネットにデータを書き込む最も安価な方法は、コールデータとして書き込む方法です。 [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-)と[Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups)はいずれも、コールデータのソリューションを採用しています。
+[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups)は、誰もがそれらを参照して現在の状態が正しいことを検証できるように、すべての過去のトランザクションの記録を保存する必要があります。
+Ethereumメインネットにデータを取り込む最も安価な方法は、コールデータとして書き込むことです。
+このソリューションは、[Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-)と[Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups)の両方で採用されました。
### L2トランザクションのコスト {#cost-of-l2-transactions}
-L2トランザクションのコストは、以下の2つの要素で構成されます:
+L2トランザクションのコストは、2つの要素で構成されています。
-1. L2上の処理コスト。通常、非常に安価です。
-2. L1上のストレージコスト。これは、メインネットのガス代と連動します。
+1. L2処理。通常は極めて安価です。
+2. L1ストレージ。メインネットのガス代に連動します。
-この記事の執筆時点のOptimismで、L2ガス代は、0.001[Gwei](/developers/docs/gas/#pre-london)です。 一方、L1のガス代は約40Gweiです。 リアルタイムの価格は[こちら](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m)で確認できます。
+これを書いている時点では、OptimismでのL2のガス代は0.001 [Gwei](/developers/docs/gas/#pre-london)です。
+一方、L1のガス代は、約40 gweiです。
+[現在の価格はこちらで確認できます](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m)。
-1バイトのコールデータのコストは、4ガス (0バイトの場合) または16ガス (それ以外) のいずれかです。 EVMで最も費用が高い操作のひとつは、ストレージへの書き込みです。 L2上で32バイトのワードを書き込む場合、最大コストは22100ガスです。 現在のレートでは、22.1 gweiになります。 したがって、1つのコールデータをゼロバイトに節約できれば、約200バイトをストレージに書き込むことができ、まだお釣りが来ます。
+コールデータの1バイトは、それがゼロの場合は4ガス、その他の値の場合は16ガスのコストがかかります。
+EVMで最も高価な操作の1つは、ストレージへの書き込みです。
+L2でストレージに32バイトのワードを書き込む最大コストは22100ガスです。 現在、これは22.1 gweiです。
+したがって、コールデータのゼロ値のバイトを1つでも節約できれば、ストレージに約200バイトを書き込んでも、まだ利益が出ます。
### ABI {#the-abi}
-大多数のトランザクションは、外部所有アカウントからコントラクトにアクセスします。 ほとんどのコントラクトはSolidityで書かれており、データフィールドは[アプリケーション・バイナリ・インターフェイス(ABI) ](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding)で解釈されます。
+大多数のトランザクションは、外部所有アカウントからコントラクトにアクセスします。
+ほとんどのコントラクトはSolidityで書かれており、[アプリケーションバイナリインターフェース(ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding)に従ってデータフィールドを解釈します。
-ただしABIは、1バイトのコールデータがほぼ4回の算術演算のコストと同じになるL1を念頭に置いて設計されていますが、L2では、1バイトのコールデータのコストで算術演算を1000回以上実行することができます。 例えば、[このERC-20の送信トランザクション](https://kovan-optimistic.etherscan.io/tx/0x7ce4c144ebfce157b4de99d8ad53a352ae91b57b3fa06d8a1c79439df6bfa998)を見てみましょう。 コールデータは、以下のように分割されます:
+しかし、ABIはL1向けに設計されており、そこではコールデータの1バイトのコストが約4回の算術演算に相当しますが、L2では1バイトのコストが1000回以上の算術演算に相当します。
+コールデータは次のように分割されます。
| セクション | 長さ | バイト | 浪費バイト | 浪費ガス | 必須バイト | 必須ガス |
-| ------- | --:| -----:| -----:| ----:| -----:| ----:|
-| 関数セレクタ | 4 | 0~3 | 3 | 48 | 1 | 16 |
-| ゼロ値 | 12 | 4~15 | 12 | 48 | 0 | 0 |
-| 送信先アドレス | 20 | 16~35 | 0 | 0 | 20 | 320 |
-| 金額 | 32 | 36~67 | 17 | 64 | 15 | 240 |
+| ------- | -: | ----: | ----: | ---: | ----: | ---: |
+| 関数セレクタ | 4 | 0-3 | 3 | 48 | 1 | 16 |
+| ゼロ | 12 | 4-15 | 12 | 48 | 0 | 0 |
+| 送信先アドレス | 20 | 16-35 | 0 | 0 | 20 | 320 |
+| 金額 | 32 | 36-67 | 17 | 64 | 15 | 240 |
| 合計 | 68 | | | 160 | | 576 |
-説明:
+説明:
-- **関数セレクター**: このコントラクトに含まれる関数は256未満であるため、1バイトで区別できます。 これらのバイトは通常0バイトではないので、[16ガス](https://eips.ethereum.org/EIPS/eip-2028)がかかります。
-- **0バイト **:これらのバイトは常にゼロです。と言うのも、20バイトのアドレスを保持するためには32バイトのワードを必要としないからです。 0バイトのコストは、4ガスです([イエローペーパー](https://ethereum.github.io/yellowpaper/paper.pdf)の27ページにあるAppendix Gで、`G``txdatazero`の値について確認してください)。
-- **金額**:このコントラクトの`decimals`が18(通常値)であり、送信できるトークンの上限が1018だとすると、金額の上限は1036になります。 25615 > 1036のため、必要なバイト数は15になります。
+- **関数セレクタ**:このコントラクトには256未満の関数しかないため、1バイトで区別できます。
+ これらのバイトは通常ゼロ以外であるため、[16ガスのコストがかかります](https://eips.ethereum.org/EIPS/eip-2028)。
+- **ゼロ**:20バイトのアドレスを保持するのに32バイトのワードは必要ないため、これらのバイトは常にゼロです。
+ ゼロを保持するバイトのコストは4ガスです([イエローペーパー](https://ethereum.github.io/yellowpaper/paper.pdf)の付録G、
+ 27ページの `G``txdatazero` の値参照)。
+- **金額**:このコントラクトで `decimals` が18 (通常値) であり、送金するトークンの最大量が1018であると仮定すると、最大量は1036になります。
+ 25615 > 1036なので、15バイトで十分です。
-通常、L1上で160ガスを浪費するのは無視できる範囲です。 1件のトランザクションには最低でも[21,000ガス](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed)が必要であるため、追加の0.8%はほとんど問題になりません。 しかし、L2では問題になります。 L2におけるほぼすべてのコストは、L1への書き込みで発生します。 トランザクションのコールデータに加えて、トランザクションのヘッダー(送信先アドレス、署名など)で109バイトが必要になります。 従って、L2おける総コストは`109*16+576+160=2480`となり、浪費分が全体の6.5%に達するのです。
+L1上での160ガスの浪費は、通常は無視できます。 トランザクションには少なくとも[21,000ガス](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed)がかかるため、0.8%の追加は問題になりません。
+しかし、L2では事情が異なります。 トランザクションのコストのほぼ全体が、L1への書き込みによるものです。
+トランザクションのコールデータに加えて、109バイトのトランザクションヘッダー (送信先アドレス、署名など) があります。
+したがって、総コストは `109*16+576+160=2480` となり、その約6.5%を浪費していることになります。
-## 送信先を限定しない場合のコスト削減方法 {#reducing-costs-when-you-dont-control-the-destination}
+## 送信先を制御できない場合のコスト削減 {#reducing-costs-when-you-dont-control-the-destination}
-送信先のコントラクトを制御できない場合でも、[こちら](https://github.com/qbzzt/ethereum.org-20220330-shortABI)のようなソリューションを活用できます。 関連するファイルを確認しておきましょう。
+送信先コントラクトを制御できない場合でも、[こちら](https://github.com/qbzzt/ethereum.org-20220330-shortABI)のようなソリューションを利用できます。
+関連ファイルを見ていきましょう。
### Token.sol {#token-sol}
-[これ](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol)は、送信先のコントラクトです。 標準的なERC-20コントラクトですが、機能が1つ追加されています。 `faucet`関数により、すべてのユーザーがトークンを取得できるようになっています。 本番環境のERC-20コントラクトでは使えませんが、テスト環境では有益でしょう。
+[こちらが送信先コントラクトです](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol)。
+これは標準的なERC-20コントラクトですが、1つ機能が追加されています。
+この `faucet` 関数により、どのユーザーも使用するためのトークンを取得できます。
+これにより、本番のERC-20コントラクトは役に立たなくなりますが、ERC-20がテストを容易にするためだけに存在する場合、作業が楽になります。
```solidity
/**
- * @dev Gives the caller 1000 tokens to play with
+ * @dev 呼び出し元に試用のための1000トークンを与えます
*/
function faucet() external {
_mint(msg.sender, 1000);
} // function faucet
```
-[こちら](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8)で、このコントラクトのデプロイ実例を確認できます。
-
### CalldataInterpreter.sol {#calldatainterpreter-sol}
-[これ](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol)は、より短いコールデータでトランザクションを呼び出すことが想定されているコントラクトです。 一行ずつ見ていきましょう。
+[これは、トランザクションがより短いコールデータで呼び出すことになっているコントラクトです](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol)。
+一行ずつ見ていきましょう。
```solidity
//SPDX-License-Identifier: Unlicense
@@ -89,7 +110,7 @@ pragma solidity ^0.8.0;
import { OrisUselessToken } from "./Token.sol";
```
-呼び出し方法を知るには、トークン関数が必要です。
+それを呼び出す方法を知るには、トークン関数が必要です。
```solidity
contract CalldataInterpreter {
@@ -100,10 +121,9 @@ contract CalldataInterpreter {
私たちがプロキシとなるトークンのアドレスです。
```solidity
-
/**
- * @dev Specify the token address
- * @param tokenAddr_ ERC-20 contract address
+ * @dev トークンアドレスを指定します
+ * @param tokenAddr_ ERC-20コントラクトアドレス
*/
constructor(
address tokenAddr_
@@ -131,7 +151,9 @@ contract CalldataInterpreter {
"calldataVal trying to read beyond calldatasize");
```
-32バイト(256ビット)を持つ1つのワードをメモリにロードして、必要なフィールドに含まれない部分のバイトを削除します。 このアルゴリズムは、32バイト以上の値に対しては機能せず、コールデータの末尾を越えたデータを読むこともできません。 L1では、ガスを節約するためにこれらのテストを省略すべきかもしれませんが、L2のガス代はとても安価なので、あらゆるサニティチェックを実行することができます。
+単一の32バイト (256ビット) ワードをメモリにロードし、目的のフィールドの一部でないバイトを削除します。
+このアルゴリズムは、32バイトより長い値には機能せず、もちろんコールデータの末尾を超えて読み取ることはできません。
+L1ではガスを節約するためにこれらのテストをスキップする必要があるかもしれませんが、L2ではガスが非常に安いため、考えられるあらゆるサニティチェックが可能です。
```solidity
assembly {
@@ -139,16 +161,18 @@ contract CalldataInterpreter {
}
```
-`fallback()`への呼び出しからデータをコピーしてもよいのですが(以下を参照) 、EVMのアセンブリ言語である[Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html)を使用する方が楽でしょう。
+`fallback()`への呼び出しからデータをコピーすることもできましたが (下記参照)、EVMのアセンブリ言語である[Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html)を使用する方が簡単です。
-ここでは、[CALLDATALOADのオペコード](https://www.evm.codes/#35)を使用して、`startByte`から `startByte+31`までのバイトをスタックへ読み込みます。 一般に、Yulのオペコードの構文は`(,...`となります。
+ここでは、[CALLDATALOADオペコード](https://www.evm.codes/#35)を使用して、`startByte`から`startByte+31`までのバイトをスタックに読み込みます。
+一般に、Yulでのオペコードの構文は`(,...)`です。
```solidity
_retVal = _retVal >> (256-length*8);
```
-このフィールドに含まれるのは最も重要な`length`のバイトだけなので、[右シフトクリック](https://en.wikipedia.org/wiki/Logical_shift)で他の値を削除します。 この方法は、値をフィールドの右側に移動するという追加の利点があるので、256xを掛けた値ではなく、値そのものになります。
+最上位の `length` バイトのみがフィールドの一部であるため、[右シフト](https://en.wikipedia.org/wiki/Logical_shift)して他の値を取り除きます。
+これには、値をフィールドの右側に移動させるという追加の利点があり、値自体が256somethingを掛けたものではなく、値そのものになります。
```solidity
@@ -159,7 +183,8 @@ contract CalldataInterpreter {
fallback() external {
```
-Solidityコントラクトへの呼び出しがどの関数の署名とも一致しない場合、 [`fallback()`関数](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function)を呼び出します(存在する場合)。 `CalldataInterpreter`の場合、他の`external`または`public`の関数がないため、すべての呼び出しがここに到達します。
+Solidityコントラクトへの呼び出しがどの関数シグネチャとも一致しない場合、[`fallback()`関数](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function)を呼び出します (存在する場合)。
+`CalldataInterpreter`の場合、他の`external`や`public`関数がないため、_どんな_呼び出しもここに到達します。
```solidity
uint _func;
@@ -167,23 +192,27 @@ Solidityコントラクトへの呼び出しがどの関数の署名とも一致
_func = calldataVal(0, 1);
```
-この関数を返すコールデータの最初の1バイトを読み取ります。 ここで関数が取得できないのには、2つの理由があります:
+コールデータの最初のバイトを読み取ります。これにより関数がわかります。
+ここで関数が利用できない理由は2つあります。
-1. `pure`または`view`の関数の場合。これらの関数は状態を変更しないため、ガスが発生しません(オフチェーンで呼び出す場合)。 ですから、ガス代を節約する必要がありません。
-2. [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties)に依存した関数。 `msg.sender`の値は、呼び出し元のアドレスではなく、`CalldataInterpreter`のアドレスになります。
+1. `pure`または`view`の関数は状態を変更せず、ガス代もかかりません (オフチェーンで呼び出された場合)。
+ これらのガス代を削減しようとしても意味がありません。
+2. [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties)に依存する関数。
+ `msg.sender`の値は、呼び出し元ではなく`CalldataInterpreter`のアドレスになります。
-残念ながら、[ERC-20の仕様](https://eips.ethereum.org/EIPS/eip-20)を確認すると、残りの関数は`transfer`のみです。 つまり、呼び出し可能な関数は、`transfer` (`transferFrom`を呼び出す)と、`faucet` (呼び出し元のアドレスにトークンを送信する)になります。
+残念ながら、[ERC-20の仕様](https://eips.ethereum.org/EIPS/eip-20)を見ると、残っている関数は`transfer`のみです。
+これにより、残る関数は`transfer` (`transferFrom`を呼び出せるため)と`faucet` (`transferFrom`を呼び出せるため)の2つだけになります。
```solidity
- // Call the state changing methods of token using
- // information from the calldata
+ // コールデータの情報を使用して
+ // トークンの状態変更メソッドを呼び出します
// faucet
if (_func == 1) {
```
-次は、パラメータを持たない`faucet()`を呼び出すコードです。
+パラメータのない`faucet()`の呼び出しです。
```solidity
token.faucet();
@@ -192,46 +221,49 @@ Solidityコントラクトへの呼び出しがどの関数の署名とも一致
}
```
-`token.faucet()`を呼び出すと、トークンを取得します。 しかし、プロキシのコントラクトにおいてトークンは**必要ありません**。 トークンが必要なのは、外部所有アカウント(EOA)あるいは呼び出し元のコントラクトです。 ですから、所有するトークンをすべて呼び出し元アドレスに送信します。
+`token.faucet()`を呼び出すと、トークンを取得します。 しかし、プロキシコントラクトとして、私たちはトークンを**必要**としません。
+私たちを呼び出したEOA (外部所有アカウント) やコントラクトは、それを必要とします。
+したがって、所有するすべてのトークンを、私たちを呼び出した誰にでも送金します。
```solidity
- // transfer (assume we have an allowance for it)
+ // transfer (そのためのアローワンスがあると仮定します)
if (_func == 2) {
```
-トークンを送信する場合、送信先アドレスと金額という2つのパラメータが必要です。
+トークンを送金するには、送信先アドレスと金額の2つのパラメータが必要です。
```solidity
token.transferFrom(
msg.sender,
```
-送信できるトークンは、呼び出し元が所有するトークンのみです。
+呼び出し元が所有するトークンの送金のみを許可します
```solidity
address(uint160(calldataVal(1, 20))),
```
-送信先アドレスは、#1のバイトから始まります(#0のバイトは、関数が使用します)。 アドレスの長さは、20バイトです。
+送信先アドレスはバイト#1から始まります (バイト#0は関数です)。
+アドレスとして、その長さは20バイトです。
```solidity
calldataVal(21, 2)
```
-このコントラクトでは、送信可能なトークンの最大数が2バイト以内(65536未満)に収まると想定します。
+この特定のコントラクトでは、誰もが送金したいと思うトークンの最大数は2バイト (65536未満) に収まると想定します。
```solidity
);
}
```
-1件の送信につき、35バイトのコールデータが発生します。
+全体として、1回の送金には35バイトのコールデータが必要です。
| セクション | 長さ | バイト |
-| ------- | --:| -----:|
+| ------- | -: | ----: |
| 関数セレクタ | 1 | 0 |
-| 送信先アドレス | 32 | 1~32 |
-| 金額 | 2 | 33~34 |
+| 送信先アドレス | 32 | 1-32 |
+| 金額 | 2 | 33-34 |
```solidity
} // fallback
@@ -241,7 +273,8 @@ Solidityコントラクトへの呼び出しがどの関数の署名とも一致
### test.js {#test-js}
-[このJavaScriptによる単体テスト](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js)では、このメカニズムを使用する方法(および、メカニズムが適切に動作していることをを確認する方法)を示します。 ここでは、[Chai](https://www.chaijs.com/)および[Ethers](https://docs.ethers.io/v5/)についてよく理解しているという前提に基づき、特にコントラクトに関連する部分のみを説明します。
+[このJavaScriptユニットテスト](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js)は、このメカニズムの使用方法 (およびそれが正しく機能することを確認する方法) を示しています。
+[chai](https://www.chaijs.com/)と[ethers](https://docs.ethers.io/v5/)を理解していることを前提とし、コントラクトに特に関連する部分のみを説明します。
```js
const { expect } = require("chai");
@@ -264,21 +297,24 @@ describe("CalldataInterpreter", function () {
まず、両方のコントラクトをデプロイします。
```javascript
- // Get tokens to play with
+ // 試用のためのトークンを取得
const faucetTx = {
```
-ここではABIを使用しないため、トランザクションを作成するために通常用いる高度な関数(`token.faucet()`など)を使用できません。 その代わりに、トランザクションをマニュアルで作成し、送信する必要があります。
+通常使用する高レベルの関数 (例: `token.faucet()`) は、ABIに従っていないため、トランザクションの作成には使用できません。
+代わりに、自分でトランザクションを作成してから送信する必要があります。
```javascript
to: cdi.address,
data: "0x01"
```
-トランザクションには、次の2つのパラメータが必要です:
+トランザクションには、次の2つのパラメータが必要です。
-1. `to`:送信先のアドレスです。 これは、コールデータのインタープリタのアドレスです。
-2. `data`:送信するコールデータです。 フォーセットを呼び出す場合、データは1バイト(`0x01`)です。
+1. `to`、送信先アドレスです。
+ これは、コールデータのインタープリタコントラクトです。
+2. `data`、送信するコールデータです。
+ フォーセットを呼び出す場合、データは1バイトの`0x01`です。
```javascript
@@ -286,26 +322,27 @@ describe("CalldataInterpreter", function () {
await (await signer.sendTransaction(faucetTx)).wait()
```
-すでに送信先(`faucetTx.to`)を指定しており、トランザクションに対して署名を得る必要があるため、[署名者の`sendTransaction`メソッド](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction)を呼び出します。
+送信先 (`faucetTx.to`) をすでに指定しており、トランザクションに署名が必要なため、[署名者の `sendTransaction` メソッド](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction)を呼び出します。
```javascript
-// Check the faucet provides the tokens correctly
+// フォーセットがトークンを正しく提供することを確認
expect(await token.balanceOf(signer.address)).to.equal(1000)
```
-ここでは、残高を確認します。 `view`関数ではガスを節約する必要がないので、単純に実行します。
+ここで残高を確認します。
+`view`関数ではガスを節約する必要がないので、通常どおり実行します。
```javascript
-// Give the CDI an allowance (approvals cannot be proxied)
+// CDIにアローワンスを与える (承認はプロキシできません)
const approveTX = await token.approve(cdi.address, 10000)
await approveTX.wait()
expect(await token.allowance(signer.address, cdi.address)).to.equal(10000)
```
-コールデータのインタープリタが送信できるように、アローワンスを設定します。
+コールデータのインタープリタに送金できるようにアローワンスを与えます。
```javascript
-// Transfer tokens
+// トークンを送金
const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d"
const transferTx = {
to: cdi.address,
@@ -313,53 +350,50 @@ const transferTx = {
}
```
-送信トランザクションを作成します。 最初のバイトは「0x02」で、次に送信先アドレスを置き、最後に金額(10進法で256である0x0100)を置きます。
+送金トランザクションを作成します。 最初のバイトは「0x02」で、次に送信先アドレス、最後に金額 (0x0100、10進数で256) が続きます。
```javascript
await (await signer.sendTransaction(transferTx)).wait()
- // Check that we have 256 tokens less
+ // 256トークン少なくなっていることを確認
expect (await token.balanceOf(signer.address)).to.equal(1000-256)
- // And that our destination got them
+ // そして、送信先がそれらを受け取ったことを確認
expect (await token.balanceOf(destAddr)).to.equal(256)
}) // it
}) // describe
```
-### 例 {#example}
-
-これらのファイルにつき、自ら実行せず、どのように動作するのか確認したい場合は、以下のリンクにアクセスしてください:
+## 送信先コントラクトを制御できる場合のコスト削減 {#reducing-the-cost-when-you-do-control-the-destination-contract}
-1. アドレス[`0x950c753c0edbde44a74d3793db738a318e9c8ce8`](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8)に対する[ `OrisUselessToken`](https://kovan-optimistic.etherscan.io/tx/1410744)のデプロイメント。
-2. アドレス[`0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55`](https://kovan-optimistic.etherscan.io/address/0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55)に対する[`CalldataInterpreter`](https://kovan-optimistic.etherscan.io/tx/1410745)のデプロイメント。
-3. [`faucet()`](https://kovan-optimistic.etherscan.io/tx/1410746)の呼び出し。
-4. [`OrisUselessToken.approve()`](https://kovan-optimistic.etherscan.io/tx/1410747)の呼び出し。 処理が`msg.sender`に依存しているため、この呼び出しは、直接トークンコントラクトで行う必要があります。
-5. [`transfer()`](https://kovan-optimistic.etherscan.io/tx/1410748)の呼び出し。
+送信先コントラクトを制御できる場合、コールデータのインタープリタを信頼するため、`msg.sender`チェックをバイパスする関数を作成できます。
+[`control-contract`ブランチで、これがどのように機能するかの例をこちらで確認できます](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract)。
-## 送信先コントラクトを制限する場合にコストを削減する方法 {#reducing-the-cost-when-you-do-control-the-destination-contract}
-
-送信先コントラクトを制限できる場合、コールデータのインタープリタが信頼されるため、`msg.sender`チェックを省略する関数を作成することができます。 [`control-contract`のブランチから、動作例を確認できます](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract)。
-
-コントラクトが外部のトランザクションのみに応答する場合、1つのコントラクトのみで対応することができます。 しかし、この方法では[コンポーザビリティ](/developers/docs/smart-contracts/composability/)が失われます。 通常のERC-20の呼び出しに応答するコントラクトと、短いコールデータを持つトランザクションに応答するコントラクトを共に用意する方が優れた方法だと言えます。
+コントラクトが外部トランザクションにのみ応答する場合、1つのコントラクトだけで済みます。
+しかし、それでは[構成可能性](/developers/docs/smart-contracts/composability/)が損なわれます。
+通常のERC-20の呼び出しに応答するコントラクトと、短いコールデータを持つトランザクションに応答する別のコントラクトを持つ方がはるかに優れています。
### Token.sol {#token-sol-2}
-この例では、`Token.sol`を修正します。 これにより、このプロキシだけが呼び出せる一連の関数を設定することができます。 以下は、追加の関数です:
+この例では、`Token.sol`を修正できます。
+これにより、プロキシだけが呼び出せる多数の関数を持つことができます。
+新しい部分は次のとおりです。
```solidity
- // The only address allowed to specify the CalldataInterpreter address
+ // CalldataInterpreterアドレスを指定できる唯一のアドレス
address owner;
- // The CalldataInterpreter address
+ // CalldataInterpreterアドレス
address proxy = address(0);
```
-ERC-20コントラクトは、許可されたプロキシの身元を知る必要があります。 しかし、この時点では値が不明なため、コンストラクタで変数を設定できません。 プロキシは、コンストラクタにおいてトークンのアドレスを要求するため、まずこのコントラクトのインスタンスが実行されます。
+ERC-20コントラクトは、承認されたプロキシのIDを知る必要があります。
+しかし、まだ値がわからないため、コンストラクタでこの変数を設定することはできません。
+このコントラクトは、プロキシがコンストラクタでトークンのアドレスを期待するため、最初にインスタンス化されます。
```solidity
/**
- * @dev Calls the ERC20 constructor.
+ * @dev ERC20コンストラクタを呼び出します。
*/
constructor(
) ERC20("Oris useless token-2", "OUT-2") {
@@ -367,12 +401,12 @@ ERC-20コントラクトは、許可されたプロキシの身元を知る必
}
```
-作成者(`オーナー`と呼ぶ)のアドレスは、プロキシを設定することが許可された唯一のアドレスであるため、ここに保存されます。
+作成者 (「owner」と呼ばれる) のアドレスは、プロキシを設定できる唯一のアドレスであるため、ここに保存されます。
```solidity
/**
- * @dev set the address for the proxy (the CalldataInterpreter).
- * Can only be called once by the owner
+ * @dev プロキシ (CalldataInterpreter) のアドレスを設定します。
+ * オーナーが1回だけ呼び出し可能
*/
function setProxy(address _proxy) external {
require(msg.sender == owner, "Can only be called by owner");
@@ -382,32 +416,35 @@ ERC-20コントラクトは、許可されたプロキシの身元を知る必
} // function setProxy
```
-プロキシは特権アクセスを持つため、セキュリティチェックが省略されます。 このプロキシが信頼できることを確認するには、`オーナー`に対し、1回のみこの関数を呼び出すことを許可します。 `proxy`が (ゼロではない)実際の値を持つと同時に、この値は変更不可となるため、オーナーが悪意のユーザーになった場合やそのニーモニックが明らかになった場合でも、安全性が維持されます。
+プロキシはセキュリティチェックをバイパスできるため、特権アクセスを持ちます。
+プロキシを信頼できることを確認するために、`owner`だけがこの関数を1回だけ呼び出せるようにします。
+一度 `proxy` が実際の値 (ゼロではない) を持つと、その値は変更できないため、オーナーが悪意を持ったり、そのニーモニックが漏洩したりしても、安全です。
```solidity
/**
- * @dev Some functions may only be called by the proxy.
+ * @dev 一部の関数はプロキシによってのみ呼び出し可能です。
*/
modifier onlyProxy {
```
-これは、他の関数の動作を修正する[`modifier`関数](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm)です。
+これは[`modifier`関数](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm)であり、他の関数の動作を変更します。
```solidity
require(msg.sender == proxy);
```
-まず、呼び出し元がプロキシであり、その他のユーザーではないことを確認します。 プロキシ以外から呼び出された場合は、 `revert`します。
+まず、プロキシによって呼び出され、他の誰にも呼び出されていないことを確認します。
+そうでなければ、`revert`します。
```solidity
_;
}
```
-プロキシからの呼び出しであれば、修正する関数を実行します。
+もしそうなら、修正する関数を実行します。
```solidity
- /* Functions that allow the proxy to actually proxy for accounts */
+ /* プロキシが実際にアカウントのプロキシとして機能できるようにする関数 */
function transferProxy(address from, address to, uint256 amount)
public virtual onlyProxy() returns (bool)
@@ -436,17 +473,18 @@ ERC-20コントラクトは、許可されたプロキシの身元を知る必
}
```
-以下は、トークンを送信する/アローワンスを承認するエンティティから直接メッセージを受信する際に通常必要となる3つの操作です。 ここでは、以下の特徴を持つプロキシバージョンを使います:
+これらは通常、トークンを送金したり、アローワンスを承認したりするエンティティから直接メッセージが送信される必要がある3つの操作です。
+ここでは、これらの操作のプロキシバージョンがあります。
-1. `onlyProxy()`で修正されており、他のユーザーが管理権限を持たない。
-2. 追加のパラメータとして、通常`msg.sender`であるアドレスを取得する。
+1. `onlyProxy()`によって変更されているため、他の誰もそれらを制御することはできません。
+2. 通常`msg.sender`であるアドレスを、追加パラメータとして取得します。
### CalldataInterpreter.sol {#calldatainterpreter-sol-2}
-コールデータのインタープリタは、送信先を限定しない場合とほぼ同一ですが、プロキシの関数では`msg.sender`パラメータを受け取るため、`transfer`のアローワンスが必要ない点が異なります。
+コールデータのインタープリタは、プロキシされた関数が`msg.sender`パラメータを受け取り、`transfer`にアローワンスが不要である点を除いて、上記のインタープリタとほぼ同じです。
```solidity
- // transfer (no need for allowance)
+ // transfer (アローワンスは不要)
if (_func == 2) {
token.transferProxy(
msg.sender,
@@ -477,7 +515,7 @@ ERC-20コントラクトは、許可されたプロキシの身元を知る必
### Test.js {#test-js-2}
-送信先を限定しない場合とは、いくつかの点が異なります。
+以前のテストコードとこのコードにはいくつかの変更点があります。
```js
const Cdi = await ethers.getContractFactory("CalldataInterpreter")
@@ -486,21 +524,22 @@ await cdi.deployed()
await token.setProxy(cdi.address)
```
-ERC-20コントラクトに対し、どのプロキシを信頼するかを伝える必要があります。
+ERC-20コントラクトに、どのプロキシを信頼するかを伝える必要があります。
```js
console.log("CalldataInterpreter addr:", cdi.address)
-// Need two signers to verify allowances
+// アローワンスを確認するには2つの署名者が必要
const signers = await ethers.getSigners()
const signer = signers[0]
const poorSigner = signers[1]
```
-`approve()`と`transferFrom()`を確認するには、第2の署名者が必要です。 第2の署名者は、トークンを受け取らないため(もちろん、ETHを所有する必要はあります)に`poorSigner`と呼びます。
+`approve()`と`transferFrom()`を確認するには、2人目の署名者が必要です。
+これは私たちのトークンを一切受け取らないため、`poorSigner`と呼びます (もちろん、ETHは持っている必要があります)。
```js
-// Transfer tokens
+// トークンを送金
const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d"
const transferTx = {
to: cdi.address,
@@ -509,10 +548,10 @@ const transferTx = {
await (await signer.sendTransaction(transferTx)).wait()
```
-ERC-20コントラクトは、プロキシ (`cdi`) を信頼するため、送信をリレーするためのアローワンスは必要ありません。
+ERC-20コントラクトはプロキシ (`cdi`) を信頼するため、送金を中継するためのアローワンスは必要ありません。
```js
-// approval and transferFrom
+// 承認とtransferFrom
const approveTx = {
to: cdi.address,
data: "0x03" + poorSigner.address.slice(2, 42) + "00FF",
@@ -527,28 +566,19 @@ const transferFromTx = {
}
await (await poorSigner.sendTransaction(transferFromTx)).wait()
-// Check the approve / transferFrom combo was done correctly
+// approve / transferFrom の組み合わせが正しく行われたことを確認
expect(await token.balanceOf(destAddr2)).to.equal(255)
-
-No key
-Text
-XPath: /pre[38]/code
```
-新たに追加した2つの関数をテストします。 `transferFromTx`のアドレスには、アローワンスの提供元と受領者という2つパラメータが要求される点に注意してください。
-
-### 実例 {#example-2}
+2つの新しい関数をテストします。
+`transferFromTx`には、アローワンスの提供者と受領者の2つのアドレスパラメータが必要であることに注意してください。
-これらのファイルにつき、自ら実行せず、どのように動作するのか確認したい場合は、以下のリンクにアクセスしてください:
+## 結論 {#conclusion}
-1. [`0xb47c1f550d8af70b339970c673bbdb2594011696`](https://kovan-optimistic.etherscan.io/address/0xb47c1f550d8af70b339970c673bbdb2594011696)のアドレスに対する[`OrisUselessToken-2`のデプロイメント](https://kovan-optimistic.etherscan.io/tx/1475397)。
-2. [`0x0dccfd03e3aaba2f8c4ea4008487fd0380815892`](https://kovan-optimistic.etherscan.io/address/0x0dccfd03e3aaba2f8c4ea4008487fd0380815892)のアドレスに対する[ `CalldataInterpreter`のデプロイメント](https://kovan-optimistic.etherscan.io/tx/1475400)。
-3. [`setProxy()`の呼び出し](https://kovan-optimistic.etherscan.io/tx/1475402)。
-4. [`faucet()`の呼び出し](https://kovan-optimistic.etherscan.io/tx/1475409)。
-5. [`transferProxy()`の呼び出し](https://kovan-optimistic.etherscan.io/tx/1475416)。
-6. [`approveProxy()`の呼び出し](https://kovan-optimistic.etherscan.io/tx/1475419)。
-7. [`transferFromProxy()`の呼び出し](https://kovan-optimistic.etherscan.io/tx/1475421)。 この呼び出しは、他のアドレスとは異なるアドレスからのものであることに注意してください (`signer`の代わりに`poorSigner`) 。
+[Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92)と[Arbitrum](https://developer.offchainlabs.com/docs/special_features)はどちらも、L1に書き込まれるコールデータのサイズ、ひいてはトランザクションのコストを削減する方法を模索しています。
+しかし、汎用的なソリューションを探しているインフラプロバイダーとして、私たちの能力には限界があります。
+dapp開発者であるあなたは、アプリケーション固有の知識を持っているため、汎用的なソリューションよりもはるかに優れた方法でコールデータを最適化できます。
+この記事が、あなたのニーズに合った理想的なソリューションを見つけるのに役立つことを願っています。
-## まとめ {#conclusion}
+[私の他の作品はこちらでご覧いただけます](https://cryptodocguy.pro/).
-[Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92)と[Arbitrum](https://developer.offchainlabs.com/docs/special_features)はどちらも、L1に書き込まれるコールデータのサイズを削減し、トランザクションコストを抑える方法を提供することを目指しています。 インフラプロバイダーが汎用性が高いソリューションを追求する一方で、デベロッパの能力には限界があります。 Dappのデベロッパーは、開発するアプリケーションについて具体的な知識を持つため、汎用性のソリューションよりも効率的にコールデータの最適化を実現できるのです。 この記事が、皆さんのニーズに合わせた理想的なソリューションを見出す上で役立つことを願っています。
diff --git a/public/content/translations/ja/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/ja/developers/tutorials/smart-contract-security-guidelines/index.md
index 81636f3cf98..9f8ae3bbe94 100644
--- a/public/content/translations/ja/developers/tutorials/smart-contract-security-guidelines/index.md
+++ b/public/content/translations/ja/developers/tutorials/smart-contract-security-guidelines/index.md
@@ -1,15 +1,12 @@
---
-title: スマートコントラクトに対するセキュリティ・ガイドライン
-description: Dapp開発時に参照すべきセキュリティ・ガイドラインのチェックリスト
+title: "スマートコントラクトに対するセキュリティ・ガイドライン"
+description: "Dapp開発時に参照すべきセキュリティ・ガイドラインのチェックリスト"
author: "Trailofbits"
-tags:
- - "Solidity"
- - "スマートコントラクト"
- - "セキュリティ"
+tags: [ "Solidity", "スマートコントラクト", "セキュリティ" ]
skill: intermediate
lang: ja
published: 2020-09-06
-source: セキュアなコントラクトの構築
+source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md
---
@@ -19,76 +16,76 @@ sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/devel
まず、コードを書く前に、コントラクトの設計について十分に議論を深める必要があります。
-### ドキュメンテーションおよび使用 {#documentation-and-specifications}
+### ドキュメントと仕様 {#documentation-and-specifications}
ドキュメンテーションは様々な水準で作成でき、コントラクトの実装時に内容を修正する必要があります。
-- **平易な英語で書かれたシステムの説明**では、コントラクトが実行する内容を説明し、コードベースの前提条件を記述します。
-- **スキーマとアーキテクチャのダイアグラム**では、コントラクトで実行されるやりとりや、システムの状態マシンについて記述します。 [Slitherのプリンター機能](https://github.com/crytic/slither/wiki/Printer-documentation)は、スキーマを生成する上で有益です。
-- **コード内容を徹底的に文書化する。** Solidityの場合、[Natspecフォーマット](https://solidity.readthedocs.io/en/develop/natspec-format.html)を使用できます。
+- **システムの平易な英語による説明**。コントラクトが何を行い、コードベースにどのような前提条件があるかを記述します。
+- **スキーマとアーキテクチャ図**。コントラクト間の相互作用やシステムの状態マシンを含みます。 [Slitherプリンター](https://github.com/crytic/slither/wiki/Printer-documentation)は、これらのスキーマの生成に役立ちます。
+- **徹底的なコードドキュメント**。Solidityでは[Natspec形式](https://docs.soliditylang.org/en/develop/natspec-format.html)が使用できます。
-### オンチェーン処理とオフチェーン処理の比較 {#on-chain-vs-off-chain-computation}
+### オンチェーン計算とオフチェーン計算 {#onchain-vs-offchain-computation}
-- **できるだけ多くのコードを、オフチェーンで処理するようにします。**オンチェーンのレイヤーに含まれるコードは、小規模になるようにしてください。 オンチェーンでの検証がシンプルに実行できるように、オフチェーンのコードでデータを前処理します。 順序付きリストが必要か確認します。 必要な場合は、オフチェーンでリストをソートしてから、オンチェーンでは順序のみをチェックするようにします。
+- **できるだけ多くのコードをオフチェーンに置いてください。**オンチェーンレイヤーは小さく保ちます。 オンチェーンでの検証がシンプルになるように、オフチェーンのコードでデータを前処理します。 順序付きリストが必要か確認します。 必要な場合は、オフチェーンでリストをソートしてから、オンチェーンでは順序のみをチェックするようにします。
### アップグレード可能性 {#upgradeability}
-アップグレードに関する様々なソリューションについては、[こちらのブログ投稿](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/)で検討しています。 コード開発を開始する事前に、アップグレードに対応するか否かをはっきり決定してください。 この決定により、どのような構造のコードを開発するべきかが変わってきます。 一般論として、以下を推奨します:
+[私たちのブログ投稿](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/)で、さまざまなアップグレード可能性のソリューションについて説明しました。 コード開発を開始する事前に、アップグレードに対応するか否かをはっきり決定してください。 この決定により、どのような構造のコードを開発するべきかが変わってきます。 一般論として、以下を推奨します:
-- **アップグレード可能性よりも、[コントラクトのマイグレーション](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/)を優先すること**。システムのマイグレーションは、アップグレード可能性が提供する利点の多くを有し、アップグレード可能性の欠点がありません。
-- **委任呼び出しプロキシのパターンよりも、データ分離のパターンを使用すること**。あなたのプロジェクトに明確な抽象化による分離が含まれる場合、データ分離をわずかに修正するだけでアップグレードが可能になります。 委任呼び出しのプロキシ は、EVMの知識が必要であり、エラー発生の頻度が高まります。
-- **デプロイする前に、マイグレーション/アップグレードの手順を文書化すること**。ガイドラインが設定されていない場合、ストレスを受けながら作業する必要があるため、ミスを犯しやすくなります。 遵守すべき手順を前もって策定しておきましょう。 具体的には、以下を定めます:
+- **アップグレード可能性よりも[コントラクトのマイグレーション](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/)を優先すること。**マイグレーションシステムはアップグレード可能なシステムと同じ利点の多くを持ちながら、その欠点はありません。
+- **delegatecallproxyパターンよりもデータ分離パターンを使用すること。** プロジェクトに明確な抽象化分離がある場合、データ分離を使用したアップグレードは、わずかな調整しか必要ありません。 委任呼び出しのプロキシ は、EVMの知識が必要であり、エラー発生の頻度が高まります。
+- **デプロイ前に、移行/アップグレードの手順を文書化すること。** ガイドラインがない状態でストレス下で対応しなければならない場合、ミスを犯すでしょう。 遵守すべき手順を前もって策定しておきましょう。 具体的には、以下を定めます:
- 新たなコントラクトを開始する呼び出し。
- キーの保存場所と、アクセス方法。
- デプロイの確認方法。 デプロイ後のスクリプトを開発、テストしておきます。
-## 実装に関するガイドライン {#implementation-guidelines}
+## 実装ガイドライン {#implementation-guidelines}
-**シンプルさを追求する**。常に、目的を達成する上で最もシンプルなソリューションを使用してください。 あなたのソリューションは、チーム全員が理解できるものでなければなりません。
+**シンプルさを追求すること。**常に目的に合った最もシンプルなソリューションを使用してください。 あなたのソリューションは、チーム全員が理解できるものでなければなりません。
### 関数の構成 {#function-composition}
コードベースのアーキテクチャは、レビューしやすいものでなければなりません。 コードの正確性を判定しにくくするようなアーキテクチャ関連の決定は避けてください。
-- **システムのロジックを分割する**。複数のコントラクトに分割するか、類似の関数(認証、算術塩酸など)をグループ化しましょう。
-- **明確な目的を持つ小規模の関数を書く**。レビュー作業が容易になり、コンポーネントごとのテストが可能になります。
+- **システムのロジックを分割すること。**複数のコントラクトに分けるか、類似した関数(例: 認証、算術演算など)をグループ化します。
+- **明確な目的を持つ小さな関数を書くこと。** これにより、レビューが容易になり、個々のコンポーネントのテストが可能になります。
### 継承 {#inheritance}
-- **継承を管理可能な水準に抑える**。ロジックを分割するために継承を活用すべきですが、プロジェクト全体における継承ツリーの深さと広さをなるべく小さくするように努めてください。
-- **Slitherの[継承プリンター](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph)でコントラクトの階層を確認する**。継承プリンターは、階層の規模を確認する上で役立ちます。
+- **継承を管理可能なものに保つこと。**継承はロジックを分割するために使用すべきですが、プロジェクトでは継承ツリーの深さと幅を最小限に抑えることを目指すべきです。
+- **Slitherの[継承プリンター](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph)を使用してコントラクトの階層を確認してください。** 継承プリンターは、階層のサイズを確認するのに役立ちます。
### イベント {#events}
-- **すべての重要操作をロギングする**。イベントログは、開発時におけるコントラクトのデバッグやデプロイ後の監視に役立ちます。
+- **すべての重要な操作をログに記録してください。** イベントは、開発中のコントラクトのデバッグやデプロイ後の監視に役立ちます。
-### 既知の落とし穴を回避する {#avoid-known-pitfalls}
+### 既知の落とし穴を避ける {#avoid-known-pitfalls}
-- **最も一般的なセキュリティの問題に注意します**。よくある問題点については、[Ethernaut CTF](https://ethernaut.openzeppelin.com/)、[Capture the Ether](https://capturetheether.com/)、[Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/)などの様々なオンラインリソースを活用してください。
-- **[Solidityドキュメント](https://solidity.readthedocs.io/en/latest/)の警告セクションに注意する**。警告セクションを通じて、言語における把握しにくい振る舞いを把握することができます。
+- **最も一般的なセキュリティ問題に注意してください。** [Ethernaut CTF](https://ethernaut.openzeppelin.com/)、[Capture the Ether](https://capturetheether.com/)、[Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/)など、一般的な問題について学ぶためのオンラインリソースはたくさんあります。
+- **[Solidityドキュメント](https://docs.soliditylang.org/en/latest/)の警告セクションに注意してください。** 警告セクションは、言語の自明でない挙動について知らせてくれます。
### 依存関係 {#dependencies}
-- **実証済みのライブラリを使用する**。実証済みのライブラリからコードをインポートすることで、バグが多いコードを書く可能性が低くなります。 ERC-20コントラクトを作成する場合は、 [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20)を使用してください。
-- **依存性マネージャーを使用し、コードのコピーアンドペーストを避ける**。外部ソースに依存する場合は、元ソースに基づき最新状態を保つ必要があります。
+- **十分にテストされたライブラリを使用すること。** 十分にテストされたライブラリからコードをインポートすることで、バグの多いコードを書く可能性が低くなります。 ERC20コントラクトを書きたい場合は、[OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20)を使用してください。
+- **依存関係マネージャーを使用し、コードのコピー&ペーストは避けてください。** 外部ソースに依存する場合は、元のソースに合わせて最新の状態に保つ必要があります。
### テストと検証 {#testing-and-verification}
-- **完全な単体テストを作成する**。質の高いソフトウェアを開発するには、包括的なテスト一式が不可欠です。
-- **[Slither](https://github.com/crytic/slither)、[Echidna](https://github.com/crytic/echidna)、および[Manticore](https://github.com/trailofbits/manticore)用のカスタムチェックとプロパティを作成する**。自動化ツールを通じて、コントラクトのセキュリティを高めることができます。 効率的なチェックおよびプロパティを作成するには、本ガイドの該当記事を参照してください。
-- **[crytic.io](https://crytic.io/)を使用する**。Cryticは、GitHubと統合されており、Slitherのプライベート検出器にアクセスできる他、Echidnaからカスタムのプロパティチェックを実行することができます。
+- **徹底的な単体テストを書くこと。** 広範なテストスイートは、高品質なソフトウェアを構築するために不可欠です。
+- **[Slither](https://github.com/crytic/slither)、[Echidna](https://github.com/crytic/echidna)、[Manticore](https://github.com/trailofbits/manticore)のカスタムチェックとプロパティを記述すること。** 自動化ツールは、コントラクトの安全性を確保するのに役立ちます。 効率的なチェックおよびプロパティを作成するには、本ガイドの該当記事を参照してください。
+- **[crytic.io](https://crytic.io/)を使用してください。**CryticはGitHubと統合されており、プライベートなSlither検出器へのアクセスを提供し、Echidnaからカスタムプロパティチェックを実行します。
### Solidity {#solidity}
-- **Solidityのバージョンは、0.4や0.6ではなく0.5を使用する**。現在のところ、Solidity 0.5が最もセキュアなバージョンであり、0.4よりもビルトインプラクティスが優れています。 一方、0.6は現時点において本番環境の使用に耐えうる安定性を持たず、さらなるアップデートが必要な状態です。
-- **安定したバージョンでコンパイルし、最新リリースで警告をチェックする。**最新バージョンのコンパイラを使って、コードの問題が報告されないことを確認してください。 ただし、Solidityはリリース間隔が短く、過去においてもコンパイラにバグが含まれていた場合が多いため、デプロイに最新バージョンを用いることは推奨しません(Slitherの[推奨solcバージョン](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33)を参照)。
-- **インラインアセンブラを使用しない**。アセンブラを使用するには、EVMの専門知識が必要です。 イエローペーパーを_マスターしていない場合_、EVMコードを書かないでください。
+- **Solidityは0.4や0.6よりも0.5を優先すること。** 私たちの意見では、Solidity 0.5は0.4よりも安全で、より優れた組み込みプラクティスを備えています。 一方、0.6は現時点において本番環境の使用に耐えうる安定性を持たず、さらなるアップデートが必要な状態です。
+- **コンパイルには安定版リリースを使用し、警告のチェックには最新リリースを使用すること。** 最新のコンパイラバージョンでコードに問題が報告されないことを確認してください。 しかし、Solidityはリリースサイクルが速く、コンパイラのバグの履歴があるため、デプロイに最新バージョンを使用することはお勧めしません(Slitherの[solcバージョン推奨](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33)を参照)。
+- **インラインアセンブリは使用しないこと。** アセンブリにはEVMの専門知識が必要です。 イエローペーパーを_マスター_していない場合は、EVMコードを書かないでください。
-## デプロイに関するガイドライン {#deployment-guidelines}
+## デプロイガイドライン {#deployment-guidelines}
コントラクトの開発が完了し、デプロイしたら、以下を確認します:
-- **コントラクトの動作を監視する**。ログを監視し、コントラクトやウォレットが不正利用された場合はただちに対応できる状態を保ってください。
-- **あなたの連絡先情報を[blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts)に追加する**。このリストに登録することで、プロジェクトにおけるセキュリティ上の欠陥が発見された場合に、サードパーティから連絡を受けやすくなります。
-- **特権ユーザーのウォレットを保護する**。キーをハードウェアウォレットに保管する場合は、この[ベストプラクティス](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/)に従ってください。
-- **事故対応計画を策定する**。スマートコントラクトは、不正利用される可能性があります。 開発したコントラクトにバグが含まれていない場合でも、攻撃者はコントラクト所有者の鍵を悪用しようとする可能性があります。
+- **コントラクトを監視してください。** ログを監視し、コントラクトやウォレットが不正利用された場合に備えて、対応できるようにしておきましょう。
+- **連絡先情報を[blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts)に追加してください。** このリストは、セキュリティ上の欠陥が発見された場合に第三者があなたに連絡するのに役立ちます。
+- **権限のあるユーザーのウォレットを保護すること。** ハードウェアウォレットにキーを保管する場合は、[私たちのベストプラクティス](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/)に従ってください。
+- **インシデント対応計画を準備しておくこと。** スマートコントラクトが侵害される可能性があることを考慮してください。 開発したコントラクトにバグが含まれていない場合でも、攻撃者はコントラクト所有者の鍵を悪用しようとする可能性があります。
diff --git a/public/content/translations/ja/developers/tutorials/stealth-addr/index.md b/public/content/translations/ja/developers/tutorials/stealth-addr/index.md
new file mode 100644
index 00000000000..921742bd41d
--- /dev/null
+++ b/public/content/translations/ja/developers/tutorials/stealth-addr/index.md
@@ -0,0 +1,436 @@
+---
+title: "ステルスアドレスの使用"
+description: "ステルスアドレスを使用すると、ユーザーは匿名で資産を送金できます。 この記事を読むと、ステルスアドレスとは何か、またその仕組みを説明し、匿名性を保つ方法でステルスアドレスを使用する方法を理解し、ステルスアドレスを使用するウェブベースのアプリケーションを作成できるようになります。"
+author: Ori Pomerantz
+tags: [ "ステルスアドレス", "プライバシー", "暗号技術", "Rust", "wasm" ]
+skill: intermediate
+published: 2025-11-30
+lang: ja
+sidebarDepth: 3
+---
+
+あなたはBillです。 理由は省きますが、あなたは「世界女王アリス」キャンペーンに寄付をして、アリスに寄付したことを知らせ、彼女が勝った場合に報酬を得たいと考えています。 残念ながら、彼女の勝利は保証されていません。 「太陽系女帝キャロル」という競合キャンペーンがあります。 もしキャロルが勝ち、あなたがアリスに寄付したことを彼女が知ったら、あなたは面倒なことになります。 そのため、自分のアカウントからアリスのアカウントに200 ETHを単純に送金することはできません。
+
+[ERC-5564](https://eips.ethereum.org/EIPS/eip-5564)がその解決策です。 このERCは、匿名での送金に[ステルスアドレス](https://nerolation.github.io/stealth-utils)を使用する方法を説明しています。
+
+**警告**: ステルスアドレスの背後にある暗号技術は、私たちが知る限り、健全です。 しかし、潜在的なサイドチャネル攻撃が存在します。 [以下](#go-wrong)では、このリスクを軽減するために何ができるかを見ていきます。
+
+## ステルスアドレスの仕組み {#how}
+
+この記事では、ステルスアドレスを2つの方法で説明します。 1つ目は[その使用方法](#how-use)です。 この記事の残りの部分を理解するには、このパートで十分です。 次に、[その背後にある数学的な説明](#how-math)があります。 暗号技術に興味がある場合は、この部分もお読みください。
+
+### 簡易版 (ステルスアドレスの使い方) {#how-use}
+
+アリスは2つの秘密鍵を作成し、対応する公開鍵を公開します (これらを組み合わせて単一の倍長のメタアドレスにすることができます)。 ビルも秘密鍵を作成し、対応する公開鍵を公開します。
+
+一方の当事者の公開鍵と他方の秘密鍵を使用することで、アリスとビルだけが知っている共有シークレットを導き出すことができます (公開鍵だけからは導き出すことはできません)。 この共有シークレットを使用して、ビルはステルスアドレスを取得し、そこに資産を送ることができます。
+
+アリスも共有シークレットからアドレスを取得しますが、公開した公開鍵の秘密鍵を知っているため、そのアドレスから引き出すことができる秘密鍵も取得できます。
+
+### 数学的な仕組み (なぜステルスアドレスがこのように機能するのか) {#how-math}
+
+標準的なステルスアドレスでは、[楕円曲線暗号 (ECC)](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/#elliptic-curves-building-blocks-of-a-better-trapdoor) を使用して、より少ない鍵ビットでより優れたパフォーマンスを得ながら、同じレベルのセキュリティを維持します。 しかし、ほとんどの場合、それを無視して通常の算術を使用していると見なすことができます。
+
+誰もが知っている数字、_G_ があります。 _G_ を掛けることができます。 しかし、ECCの性質上、_G_ で割ることは事実上不可能です。 イーサリアムにおける公開鍵暗号技術の一般的な仕組みは、秘密鍵 _Ppriv_ を使用してトランザクションに署名し、それが公開鍵 _Ppub = GPpriv_ によって検証されるというものです。
+
+アリスは2つの秘密鍵、_Kpriv_ と _Vpriv_ を作成します。 _Kpriv_ はステルスアドレスから資金を使用するために、_Vpriv_ はアリスに属するアドレスを表示するために使用されます。 アリスは次に公開鍵 _Kpub = GKpriv_ と _Vpub = GVpriv_ を公開します。
+
+ビルは3番目の秘密鍵 _Rpriv_ を作成し、_Rpub = GRpriv_ を中央レジストリに公開します (ビルはアリスに送ることもできましたが、ここではキャロルが聞き耳を立てていると仮定します)。
+
+ビルは _RprivVpub = GRprivVpriv_ を計算し、アリスもこれを知っていると期待します (下記で説明)。 この値は _S_ (共有シークレット) と呼ばれます。 これにより、ビルは公開鍵 _Ppub = Kpub+G\*hash(S)_ を得ます。 この公開鍵から、彼はアドレスを計算し、好きなリソースをそこに送ることができます。 将来、アリスが勝った場合、ビルは彼女に _Rpriv_ を伝えて、リソースが自分からのものであることを証明できます。
+
+アリスは _RpubVpriv = GRprivVpriv_ を計算します。 これにより、彼女も同じ共有シークレット _S_ を得ます。 彼女は秘密鍵 _Kpriv_ を知っているので、_Ppriv = Kpriv+hash(S)_ を計算できます。 この鍵により、彼女は _Ppub = GPpriv = GKpriv+G\*hash(S) = Kpub+G\*hash(S)_ から得られるアドレスの資産にアクセスできます。
+
+アリスがDaveの「世界征服キャンペーンサービス」に業務を委託できるように、別の閲覧用鍵があります。 アリスは、デイブに公開アドレスを知らせて、より多くの資金が利用可能になったときに通知してもらうことには前向きですが、デイブにキャンペーン資金を使われることは望んでいません。
+
+閲覧と使用は別の鍵を使うため、アリスはデイブに _Vpriv_ を渡すことができます。 するとデイブは _S = RpubVpriv = GRprivVpriv_ を計算でき、それによって公開鍵 (_Ppub = Kpub+G\*hash(S)_) を得ることができます。 しかし、_Kpriv_ がなければ、デイブは秘密鍵を取得できません。
+
+まとめると、これらが異なる参加者によって知られている値です。
+
+| アリス | 公開済み | ビル | デイブ | |
+| ------------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------- |
+| G | G | G | G | |
+| _Kpriv_ | - | - | - | |
+| _Vpriv_ | - | - | _Vpriv_ | |
+| _Kpub = GKpriv_ | _Kpub_ | _Kpub_ | _Kpub_ | |
+| _Vpub = GVpriv_ | _Vpub_ | _Vpub_ | _Vpub_ | |
+| - | - | _Rpriv_ | - | |
+| _Rpub_ | _Rpub_ | _Rpub = GRpriv_ | _Rpub_ | |
+| _S = RpubVpriv = GRprivVpriv_ | - | _S = RprivVpub = GRprivVpriv_ | _S = _RpubVpriv_ = GRprivVpriv_ | |
+| _Ppub = Kpub+G\*hash(S)_ | - | _Ppub = Kpub+G\*hash(S)_ | _Ppub = Kpub+G\*hash(S)_ | |
+| _Address=f(Ppub)_ | - | _Address=f(Ppub)_ | _Address=f(Ppub)_ | _Address=f(Ppub)_ |
+| _Ppriv = Kpriv+hash(S)_ | - | - | - | |
+
+## ステルスアドレスがうまくいかない場合 {#go-wrong}
+
+_ブロックチェーン上に秘密はありません_。 ステルスアドレスはプライバシーを提供できますが、そのプライバシーはトラフィック分析に対して脆弱です。 簡単な例を挙げると、ビルがあるアドレスに資金を供給し、すぐにトランザクションを送信して _Rpub_ 値を公開するとします。 アリスの _Vpriv_ がなければ、これがステルスアドレスであると確信することはできませんが、そうである可能性が高いです。 次に、そのアドレスからアリスのキャンペーン資金アドレスにすべてのETHを送金する別のトランザクションが見られます。 証明はできないかもしれませんが、ビルがアリスのキャンペーンに寄付した可能性が高いです。 キャロルは間違いなくそう思うでしょう。
+
+ビルにとって、_Rpub_ の公開とステルスアドレスへの資金供給を分離することは簡単です (異なる時間に、異なるアドレスから行います)。 しかし、それだけでは不十分です。 キャロルが探すパターンは、ビルがあるアドレスに資金を提供し、その後アリスのキャンペーン資金がそこから引き出すというものです。
+
+1つの解決策は、アリスのキャンペーンが直接資金を引き出すのではなく、第三者への支払いに使用することです。 アリスのキャンペーンがデイブの世界征服キャンペーンサービスに10 ETHを送金した場合、キャロルはビルがデイブの顧客の1人に寄付したことしか知りません。 デイブに十分な顧客がいれば、キャロルはビルが彼女と競合するアリスに寄付したのか、それともキャロルが気にしていないアダム、アルバート、アビゲイルに寄付したのかを知ることはできません。 アリスは支払いにハッシュ化された値を含め、その後デイブにプリイメージを提供することで、それが自分の寄付であることを証明できます。 あるいは、前述のように、アリスがデイブに彼女の _Vpriv_ を渡せば、彼はすでに支払いが誰からのものかを知っています。
+
+この解決策の主な問題は、その秘密がビルに利益をもたらす場合に、アリスが秘密を守ることを気にしなければならないという点です。 アリスは、ビルの友人であるボブも彼女に寄付するように、自分の評判を維持したいかもしれません。 しかし、彼女がビルを暴露することを気にしない可能性もあります。なぜなら、そうすれば彼はキャロルが勝った場合に何が起こるかを恐れるからです。 ビルは結果的にアリスをさらに支援することになるかもしれません。
+
+### 複数のステルスレイヤーの使用 {#multi-layer}
+
+ビルのプライバシーを保護するためにアリスに頼る代わりに、ビル自身がそれを行うことができます。 彼は架空の人物、ボブとベラのために複数のメタアドレスを生成できます。 ビルは次にETHをボブに送り、「ボブ」(実際にはビル) がそれをベラに送ります。 「ベラ」(これもビル) がそれをアリスに送ります。
+
+キャロルは依然としてトラフィック分析を行い、ビルからボブ、ベラ、アリスへのパイプラインを見ることができます。 しかし、「ボブ」と「ベラ」が他の目的でETHを使用している場合、アリスがステルスアドレスから既知のキャンペーンアドレスにすぐに引き出したとしても、ビルがアリスに何かを転送したようには見えません。
+
+## ステルスアドレスアプリケーションの作成 {#write-app}
+
+この記事では、[GitHub](https://github.com/qbzzt/251022-stealth-addresses.git) で入手可能なステルスアドレスアプリケーションについて説明します。
+
+### ツール {#tools}
+
+使用できる[TypeScriptのステルスアドレスライブラリ](https://github.com/ScopeLift/stealth-address-sdk)があります。 しかし、暗号操作はCPUを集中的に使用することがあります。 私はそれらを[Rust](https://rust-lang.org/)のようなコンパイル言語で実装し、[WASM](https://webassembly.org/)を使用してブラウザでコードを実行することを好みます。
+
+[Vite](https://vite.dev/)と[React](https://react.dev/)を使用します。 これらは業界標準のツールです。もし馴染みがない場合は、[このチュートリアル](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/)を使用できます。 Viteを使用するには、Nodeが必要です。
+
+### ステルスアドレスの動作を見る {#in-action}
+
+1. 必要なツールをインストールします: [Rust](https://rust-lang.org/tools/install/) と [Node](https://nodejs.org/en/download)。
+
+2. GitHubリポジトリをクローンします。
+
+ ```sh
+ git clone https://github.com/qbzzt/251022-stealth-addresses.git
+ cd 251022-stealth-addresses
+ ```
+
+3. 前提条件をインストールし、Rustコードをコンパイルします。
+
+ ```sh
+ cd src/rust-wasm
+ rustup target add wasm32-unknown-unknown
+ cargo install wasm-pack
+ wasm-pack build --target web
+ ```
+
+4. Webサーバーを起動します。
+
+ ```sh
+ cd ../..
+ npm install
+ npm run dev
+ ```
+
+5. [アプリケーション](http://localhost:5173/)にアクセスします。 このアプリケーションページには2つのフレームがあります。1つはアリスのユーザーインターフェース用、もう1つはビルのユーザーインターフェース用です。 2つのフレームは通信しません。便宜上、同じページにあるだけです。
+
+6. アリスとして、**ステルス・メタアドレスを生成**をクリックします。 これにより、新しいステルスアドレスと対応する秘密鍵が表示されます。 ステルス・メタアドレスをクリップボードにコピーします。
+
+7. ビルとして、新しいステルス・メタアドレスを貼り付け、**アドレスを生成**をクリックします。 これにより、アリスに資金を送るためのアドレスが表示されます。
+
+8. アドレスとビルの公開鍵をコピーし、アリスのユーザーインターフェースの「ビルによって生成されたアドレスの秘密鍵」エリアに貼り付けます。 これらのフィールドに入力すると、そのアドレスの資産にアクセスするための秘密鍵が表示されます。
+
+9. [オンライン計算機](https://iancoleman.net/ethereum-private-key-to-address/)を使用して、秘密鍵がアドレスに対応していることを確認できます。
+
+### プログラムの仕組み {#how-the-program-works}
+
+#### WASMコンポーネント {#wasm}
+
+WASMにコンパイルされるソースコードは[Rust](https://rust-lang.org/)で書かれています。 [`src/rust_wasm/src/lib.rs`](https://github.com/qbzzt/251022-stealth-addresses/blob/main/src/rust-wasm/src/lib.rs)で確認できます。 このコードは主に、JavaScriptコードと[`eth-stealth-addresses`ライブラリ](https://github.com/kassandraoftroy/eth-stealth-addresses)間のインターフェースです。
+
+**`Cargo.toml`**
+
+Rustにおける[`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html)は、JavaScriptの[`package.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json)に類似しています。 パッケージ情報、依存関係の宣言などが含まれています。
+
+```toml
+[package]
+name = "rust-wasm"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+eth-stealth-addresses = "0.1.0"
+hex = "0.4.3"
+wasm-bindgen = "0.2.104"
+getrandom = { version = "0.2", features = ["js"] }
+```
+
+[`getrandom`](https://docs.rs/getrandom/latest/getrandom/)パッケージは、乱数を生成する必要があります。 それは純粋なアルゴリズム的手法では実行できません。エントロピーの源として物理的なプロセスへのアクセスが必要です。 この定義は、実行中のブラウザに問い合わせることで、そのエントロピーを取得することを指定します。
+
+```toml
+console_error_panic_hook = "0.1.7"
+```
+
+[このライブラリ](https://docs.rs/console_error_panic_hook/latest/console_error_panic_hook/)は、WASMコードがパニックを起こして続行できなくなったときに、より意味のあるエラーメッセージを提供します。
+
+```toml
+[lib]
+crate-type = ["cdylib", "rlib"]
+```
+
+WASMコードを生成するために必要な出力タイプです。
+
+**`lib.rs`**
+
+これが実際のRustコードです。
+
+```rust
+use wasm_bindgen::prelude::*;
+```
+
+RustからWASMパッケージを作成するための定義です。 それらは[ここ](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/index.html)で文書化されています。
+
+```rust
+use eth_stealth_addresses::{
+ generate_stealth_meta_address,
+ generate_stealth_address,
+ compute_stealth_key
+};
+```
+
+[`eth-stealth-addresses` ライブラリ](https://github.com/kassandraoftroy/eth-stealth-addresses)から必要な関数です。
+
+```rust
+use hex::{decode,encode};
+```
+
+Rustは通常、値にバイト[配列](https://doc.rust-lang.org/std/primitive.array.html) (`[u8; ]`) を使用します。 しかし、JavaScriptでは、通常16進数文字列を使用します。 [`hex`ライブラリ](https://docs.rs/hex/latest/hex/)は、ある表現から別の表現へと変換してくれます。
+
+```rust
+#[wasm_bindgen]
+```
+
+JavaScriptからこの関数を呼び出すことができるように、WASMバインディングを生成します。
+
+```rust
+pub fn wasm_generate_stealth_meta_address() -> String {
+```
+
+複数のフィールドを持つオブジェクトを返す最も簡単な方法は、JSON文字列を返すことです。
+
+```rust
+ let (address, spend_private_key, view_private_key) =
+ generate_stealth_meta_address();
+```
+
+[`generate_stealth_meta_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_meta_address.html)は3つのフィールドを返します:
+
+- メタアドレス(_Kpub_ と _Vpub_)
+- 閲覧用秘密鍵(_Vpriv_)
+- 支払い用秘密鍵(_Kpriv_)
+
+[タプル](https://doc.rust-lang.org/std/primitive.tuple.html)構文を使用すると、これらの値を再度分離できます。
+
+```rust
+ format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}",
+ encode(address),
+ encode(view_private_key),
+ encode(spend_private_key)
+ )
+}
+```
+
+[`format!`](https://doc.rust-lang.org/std/fmt/index.html)マクロを使用して、JSONエンコードされた文字列を生成します。 [`hex::encode`](https://docs.rs/hex/latest/hex/fn.encode.html)を使用して、配列を16進数文字列に変更します。
+
+```rust
+fn str_to_array(s: &str) -> Option<[u8; N]> {
+```
+
+この関数は、(JavaScriptから提供された) 16進数文字列をバイト配列に変換します。 JavaScriptコードから提供された値を解析するために使用します。 この関数は、Rustが配列とベクターをどのように扱うかによって複雑になっています。
+
+``という式は[ジェネリック](https://doc.rust-lang.org/book/ch10-01-syntax.html)と呼ばれます。 `N` は返される配列の長さを制御するパラメータです。 この関数は実際には`str_to_array::`として呼び出され、`n`は配列の長さです。
+
+戻り値は `Option<[u8; N]>` であり、これは返される配列が[オプショナル](https://doc.rust-lang.org/std/option/)であることを意味します。 これは、失敗する可能性のある関数に対するRustの典型的なパターンです。
+
+例えば、`str_to_array::10("bad060a7")`を呼び出すと、関数は10個の値を持つ配列を返すはずですが、入力は4バイトしかありません。 関数は失敗する必要があり、`None`を返すことでそれを行います。 `str_to_array::4("bad060a7")`の戻り値は `Some<[0xba, 0xd0, 0x60, 0xa7]>` になります。
+
+```rust
+ // decodeはResult, _>を返す
+ let vec = decode(s).ok()?;
+```
+
+[`hex::decode`](https://docs.rs/hex/latest/hex/fn.decode.html)関数は`Result, FromHexError>`を返します。 [`Result`](https://doc.rust-lang.org/std/result/)型には、成功した結果 (`Ok(value)`) またはエラー (`Err(error)`) のいずれかが含まれます。
+
+`.ok()`メソッドは`Result`を`Option`に変換し、その値は成功した場合は`Ok()`の値、そうでなければ`None`になります。 最後に、[疑問符演算子](https://doc.rust-lang.org/std/option/#the-question-mark-operator-)は、`Option`が空の場合に現在の関数を中止し、`None`を返します。 そうでなければ、値をアンラップしてそれを返します (この場合、`vec`に値を割り当てます)。
+
+これは奇妙で複雑なエラー処理方法に見えるかもしれませんが、`Result`と`Option`は、すべてのエラーが何らかの方法で処理されることを保証します。
+
+```rust
+ if vec.len() != N { return None; }
+```
+
+バイト数が正しくない場合は失敗であり、`None`を返します。
+
+```rust
+ // try_intoはvecを消費し、[u8; N]を作成しようと試みる
+ let array: [u8; N] = vec.try_into().ok()?;
+```
+
+Rustには2つの配列型があります。 [配列](https://doc.rust-lang.org/std/primitive.array.html)は固定サイズです。 [ベクター](https://doc.rust-lang.org/std/vec/index.html)は大きくなったり小さくなったりできます。 `hex::decode`はベクターを返しますが、`eth_stealth_addresses`ライブラリは配列を受け取ることを期待しています。 [`.try_into()`](https://doc.rust-lang.org/std/convert/trait.TryInto.html#required-methods)は、値を別の型、たとえばベクターを配列に変換します。
+
+```rust
+ Some(array)
+}
+```
+
+Rustでは、関数の最後で値を返す際に[`return`](https://doc.rust-lang.org/std/keyword.return.html)キーワードを使用する必要はありません。
+
+```rust
+#[wasm_bindgen]
+pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option {
+```
+
+この関数は、_Vpub_ と _Kpub_ の両方を含む公開メタアドレスを受け取ります。 これは、ステルスアドレス、公開する公開鍵 (_Rpub_)、および公開されたアドレスのうちどれがアリスに属する可能性があるかを特定する速度を上げる1バイトのスキャン値を返します。
+
+スキャン値は共有シークレット (_S = GRprivVpriv_) の一部です。 この値はアリスが利用でき、これを確認する方が _f(Kpub+G\*hash(S))_ が公開されたアドレスと等しいかどうかを確認するよりもはるかに高速です。
+
+```rust
+ let (address, r_pub, scan) =
+ generate_stealth_address(&str_to_array::<66>(stealth_address)?);
+```
+
+ライブラリの[`generate_stealth_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_address.html)を使用します。
+
+```rust
+ format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}",
+ encode(address),
+ encode(r_pub),
+ encode(&[scan])
+ ).into()
+}
+```
+
+JSONエンコードされた出力文字列を準備します。
+
+```rust
+#[wasm_bindgen]
+pub fn wasm_compute_stealth_key(
+ address: &str,
+ bill_pub_key: &str,
+ view_private_key: &str,
+ spend_private_key: &str
+) -> Option {
+ .
+ .
+ .
+}
+```
+
+この関数は、ライブラリの[`compute_stealth_key`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.compute_stealth_key.html)を使用して、アドレスから引き出すための秘密鍵(_Rpriv_)を計算します。 この計算には以下の値が必要です:
+
+- アドレス (_Address=f(Ppub)_)
+- ビルによって生成された公開鍵(_Rpub_)
+- 閲覧用秘密鍵(_Vpriv_)
+- 支払い用秘密鍵(_Kpriv_)
+
+```rust
+#[wasm_bindgen(start)]
+```
+
+[`#[wasm_bindgen(start)]`](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-rust-exports/start.html)は、WASMコードが初期化されるときに関数が実行されることを指定します。
+
+```rust
+pub fn main() {
+ console_error_panic_hook::set_once();
+}
+```
+
+このコードは、パニック出力をJavaScriptコンソールに送信することを指定します。 動作を確認するには、アプリケーションを使用し、ビルに無効なメタアドレスを与えます (16進数の1桁を変更するだけ)。 JavaScriptコンソールに次のエラーが表示されます:
+
+```
+rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/subtle-2.6.1/src/lib.rs:701:9:
+assertion `left == right` failed
+ left: 0
+ right: 1
+```
+
+続いてスタックトレースが表示されます。 次に、ビルに有効なメタアドレスを与え、アリスには無効なアドレスまたは無効な公開鍵のいずれかを与えます。 次のエラーが表示されます:
+
+```
+rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/eth-stealth-addresses-0.1.0/src/lib.rs:78:9:
+keys do not generate stealth address
+```
+
+再び、スタックトレースが続きます。
+
+#### ユーザーインターフェース {#ui}
+
+ユーザーインターフェースは[React](https://react.dev/)を使用して書かれ、[Vite](https://vite.dev/)によって提供されます。 これらについては、[このチュートリアル](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/)で学ぶことができます。 ここでは、ブロックチェーンやウォレットと直接対話しないため、[WAGMI](https://wagmi.sh/)は必要ありません。
+
+ユーザーインターフェースで唯一自明でない部分は、WASMの接続性です。 その仕組みは次のとおりです。
+
+**`vite.config.js`**
+
+このファイルには[Viteの設定](https://vite.dev/config/)が含まれています。
+
+```js
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+import wasm from "vite-plugin-wasm";
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react(), wasm()],
+})
+```
+
+2つのViteプラグインが必要です: [react](https://www.npmjs.com/package/@vitejs/plugin-react)と[wasm](https://github.com/Menci/vite-plugin-wasm#readme)。
+
+**`App.jsx`**
+
+このファイルは、アプリケーションのメインコンポーネントです。 これは、`Alice`と`Bill`という2つのコンポーネントを含むコンテナで、これらのユーザーのユーザーインターフェースです。 WASMに関連する部分は初期化コードです。
+
+```jsx
+import init from './rust-wasm/pkg/rust_wasm.js'
+```
+
+[`wasm-pack`](https://rustwasm.github.io/docs/wasm-pack/)を使用すると、ここで使用する2つのファイルが作成されます。1つは実際のコードを含むwasmファイル (ここでは`src/rust-wasm/pkg/rust_wasm_bg.wasm`)、もう1つはそれを使用するための定義を含むJavaScriptファイル (ここでは`src/rust_wasm/pkg/rust_wasm.js`)です。 そのJavaScriptファイルのデフォルトエクスポートは、WASMを初期化するために実行する必要があるコードです。
+
+```jsx
+function App() {
+ .
+ .
+ .
+ useEffect(() => {
+ const loadWasm = async () => {
+ try {
+ await init();
+ setWasmReady(true)
+ } catch (err) {
+ console.error('Error loading wasm:', err)
+ alert("Wasm error: " + err)
+ }
+ }
+
+ loadWasm()
+ }, []
+ )
+```
+
+[`useEffect`フック](https://react.dev/reference/react/useEffect)を使用すると、状態変数が変更されたときに実行される関数を指定できます。 ここでは、状態変数のリストが空 (`[]`) なので、この関数はページが読み込まれたときに一度だけ実行されます。
+
+エフェクト関数はすぐに戻る必要があります。 WASM `init` (これは`.wasm`ファイルをロードする必要があるため時間がかかります) のような非同期コードを使用するために、内部で[`async`](https://en.wikipedia.org/wiki/Async/await)関数を定義し、`await`なしで実行します。
+
+**`Bill.jsx`**
+
+これはビルのユーザーインターフェースです。 アリスから提供されたステルス・メタアドレスに基づいてアドレスを作成するという単一のアクションがあります。
+
+```jsx
+import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js'
+```
+
+デフォルトのエクスポートに加えて、`wasm-pack`によって生成されたJavaScriptコードは、WASMコードのすべての関数に対応する関数をエクスポートします。
+
+```jsx
+