イーサリアム取引の作成と署名
この記事の著者はJose Aguinagaで、翻訳と校正は閔敏と阿剣が行いました。
私たちの以前の記事では、秘密鍵を作成する目的とその方法について説明しました。具体的には、第一部では鍵が単なる大きなランダム数であることを理解し、第二部ではその大きなランダム数を使用して資産を保有できるEthereumウォレットを作成する方法を学びました。この最後の部分では、そのようなランダム数を使用して、自分の仮想資産に署名し、操作する方法を学びます。
一. 取引 ------ 古いものが出て、新しいものが入る
ブロックチェーンの取引は、銀行取引と特に大きな違いはありません。今日では、ほとんどの銀行がデジタル手段でほとんどの操作を完了することをサポートしています:他人への送金、自分の貯蓄口座への入金、さらには借入などです。インターネット技術により、私たちはほとんどの操作を自分で行うことなく完了できます。
これらの操作はあなたにとって簡単ですが、銀行にとっては簡単でも安くもありません。裏では、あなたの銀行操作の決済、検証、確認に複数の第三者が関与しています。これだけでは不十分で、銀行業界の規制に従うために、金融機関はあなた(操作を開始する人)があなたの口座を操作する権限を持っていることを確認するために煩雑な手続きを実行しなければなりません。
これらすべての側面は重いコストを生じさせます。これが、Visaやマスターカードのようなゲートウェイがサービスを提供するたびに料金を請求する理由であり、通常は送金額に基づいて請求されます。そしてもちろん、あなたが開始した操作はいつでも凍結され、取り消される可能性があります。

2017年、EUは金融機関にPayment Services Directive 2(Directive 2015/2366)を実施するよう求めました。つまり、銀行はSCA(強力な認証)を含む安全規則を実施しなければなりませんでした。PSD2+SCAのコストのため、2019年3月には、59%のヨーロッパの銀行が規制要件を満たすことに成功し、最終通告の期限がさらに1年延長されました。
二. ブロックチェーン取引のルールは異なる
パブリックチェーンの分散型と無許可の特性により、誰でもネットワーク内で取引に署名し、放送できます。ブロックチェーンの特性に基づいて、あなたは取引が「マイニング」されるために一部の資金を手数料として確保する必要があります(つまり、あるマイナーによってブロックチェーンにパッケージ化されることを意味します)が、手数料の高低はユーザーのブロックチェーンの使用に対する需要に依存し、価値の移転の量とは関係ありません。
例えば、Ethereumアカウントから別のアカウントに1ドルを送金する場合と100万ドルを送金する場合、支払う手数料は同じです。手数料が同じであれば、これら二つの取引はマイナーにとって同等であり、どちらも有効なブロックにパッケージ化され、全ネットワークに伝播されます。

ブロックには一連の取引が含まれており、ブロックは一つずつ増加していきます。新しいブロックの一部のデータは前のブロックから来ているため、これらの「ブロック」は一つずつ順序付けられた鎖を形成します。これが「ブロックチェーン」という名前の由来です。
ブロックチェーンは、処理と検証が容易なデータ構造「マークルツリー」を使用しています。これが、ブロックチェーン上の特定の取引やブロックを偽造することがほぼ不可能な理由の一部です。非常に簡単に識別できるからです。
さらに、ブロックチェーン取引には、いかなる権威ある団体の検証も必要ありません。有効な取引を発行するには、対応するブロックチェーンシステムのデジタル署名アルゴリズム(DSA)の秘密鍵を使用して取引に署名を生成するだけです。EthereumとBitcoinのブロックチェーンはECDSAアルゴリズムを使用し、CardanoとPolkadotはEdDSAアルゴリズムを使用しています。
これら二つのアルゴリズムは楕円曲線暗号学に依存していますが、後者は結びついたエドワーズ曲線を使用しており、一般的なデジタル署名の向上を図っています。任意のアカウントは秘密鍵を使用して取引を開始するために署名できますが、残高が十分なアドレスからの取引のみが成功裏に実行されます。

楕円曲線署名アルゴリズムは「離散対数問題」に基づいており、その古典的な形式は、整数kが与えられたとき、a^k ≡ b (mod p)を求めることです。ここでpは素数です。他の公開鍵暗号アルゴリズム(例えばRSA)が大きな指数の因数分解問題に基づいているのとは異なり(これは最近、格子ベースの暗号学の攻撃対象となっています)。
今日、kを計算する効率的な方法は発見されていません(楕円曲線上の与えられた点PとQとして説明できます)。これが、異なるブロックチェーンが異なる曲線と署名アルゴリズムを使用しているにもかかわらず、すべてが楕円曲線に基づいている理由です。
一度取引に署名がされ、署名がネットワークに送信され、成功裏にマイニングされたブロックにパッケージ化されると、その取引は取り消すことができません。銀行操作とは異なり、成功裏にブロックチェーンにパッケージ化された取引は取り消すことも、未実行の状態に戻すこともできません。ほとんどのパブリックチェーンは取引の内容を完全に可視化しているため、これらの取引が使用するブロックチェーンはこれらの資産の究極の真実の源です。
三. Ethereum取引の構造
私たちはブロックチェーン取引の特性を完全に理解したので、Ethereum取引を作成する準備が整いました。最初はシンプルな送金取引から始めます:
アドレス0x17A98d2b11Dfb784e63337d2170e21cf5DD04631に0.1 ETHを送金します。
取引はJavaScript Object Notation(JSON)形式で表現できます。この取引を作成する際、MyEtherWalletでこれらの情報を見ることができます(ログイン後にsend offlineを使用):

(編者注:MyEtherWalletの最大の用途はEthereumアカウントを生成することですが、直接それを使用して取引を送信することは、自分の秘密鍵やリカバリーフレーズを暴露する可能性があり、非常に安全ではない方法であるため、強く推奨されません。MyEtherWalletを使用したい場合は、彼らのブラウザプラグインやモバイルウォレットと併用してください。)
ここですぐにいくつかの値が表示されます:nonce、gasLimit、gasPrice、data、chainId。取引の内容に関するものは一つもありませんが、取引の実行方法に関するものです。これは、Ethereum上で取引を送信するためには、マイナーに取引を処理する方法を伝えるために、いくつかの追加のパラメータを事前に定義する必要があるためです。
取引の二つのパラメータは「ガス」に関連しています。ガス自体は、取引の計算負担を測定するための単位であり、Ethereumマイナーに支払うための基準です。一つのパラメータはgasPriceで、ユーザーが各ガス単位に対して支払う意向のある単価を示し、Gwei単位(GweiはETHの1/10^9)で表されます;
もう一つはgasLimitで、ユーザーが自分の取引に使用できる最大ガス量を指定します。これらのパラメータはEthereumノードを使用して合理的な数値を見積もることができ、一般的にはウォレットサービスプロバイダーが自動的に入力します。

Ethereumの価値は通常wei単位で表されます。weiはEthereumブロックチェーン上で最小の価値単位で、ETHの1/10^18です。Gas Priceは通常giga wei(略してGwei)単位で表されます。
Gas PriceはEthereumネットワーク上で複雑な問題であり、頻繁に変動します。EIP-1559は最近通過したネットワーク変更で、今年の終わりに導入される可能性があり、Gas Priceの激しい変動を緩和するかもしれません。weiやGweiの他にも、価値を表すための他の単位があります。これらの単位についてはeth-converter.comを訪れてください。
(編者注:著者はこの記事を2021年4月に出版しました。Ethereumのコア開発者は、2021年8月の「ロンドン」アップグレードに1559を含めることを決定しました。1559はユーザー体験において、ユーザーが直接Gas Priceを指定するのではなく、代わりに二つの値を指定することを反映しています:MaxFeePerGasとMaxPriorityFeePerGas。前者はユーザーが単位ガスに対して支払う最大価格を示し、後者はユーザーが単位ガスに対してマイナーに支払う最大価格を示します;
実際にあなたがGasに支払う単価はmin(MaxFeePerGas, MaxPriorityFeePerGas + BaseFee)(つまり二つのうち小さい方)であり、BaseFeeはネットワークの前のブロックの満載率に応じて自動的に変動する数値です。マイナーが受け取る単価はあなたのGas単価からBaseFeeを引いたものであり、BaseFeeの部分は焼却されます。
注目すべきは、予見可能な未来において、ユーザーは依然として従来の取引形式を使用して取引を送信できますが、この形式は最終的にプロトコル層で廃止される可能性があるということです。つまり、この記事で説明したEthereum取引の形式は、いつか時代遅れになる可能性があります。)
ガスパラメータの他に、どのネットワークでこの取引を実行するかを指定する必要があります。Ethereumネットワークには、chainIdが1のメインネットだけでなく、他のテストネット(testnet)も含まれます。テストネットでも取引を送信でき、金銭を失うことはありません。なぜなら、テストネットのETHは無料で取得できるからです。
一般的に、dAppを展開する場合、最初のステップはローカルネットワークでデバッグし、次にテストネットに展開し、最後にメインネットに展開することです。
最後に、dataとnonceも重要です。取引に追加のデータを追加したい場合、dataフィールドを使用する必要があります。スマートコントラクトと対話する際、dataフィールドにはコントラクトに対する指示が含まれることがあります。
nonce(「一度だけ使用される数字」)は、Ethereumネットワークがあなたのアカウントの状態を追跡し、二重支払いとリプレイ攻撃を防ぐための数値です(シリアル番号として理解できます)。
あなたの取引がガス料金が低すぎて一時的にパッケージ化できない場合、同じnonceを使用してより高いgas priceを指定することで、あなたの詰まった取引を「置き換える」ことができます。一度この「より早い」取引がブロックチェーンにパッケージ化されると、元の署名された取引(同じnonceを使用しているため)はEthereumのノードによって破棄されます。
四. Ethereum取引に署名する
上記のJSONエンコードが形成されたら、次のステップに進み、署名プロセスを開始できます。前述のように、このプロセスではECDSAアルゴリズムを使用します。ここでは、一般的なライブラリであるethers.jsを使用します。このコードライブラリには、secp256k1曲線上でECDSAアルゴリズムを使用して署名を生成するために必要な楕円曲線が封装されています。

このコードをRunkitでオンラインテストし、MyEtherWalletの結果と比較できます。ここで使用される秘密鍵は:
0x616E6769652E6A6A706572657A616775696E6167612E6574682E6C696E6B0D0A
(編者注:ここでは教育目的で秘密鍵を明示的に公開しています。どんな時でも、秘密鍵を公開することは非常に危険な行為であり、あなたのアカウント内のすべての資産を失う可能性があります!秘密鍵やリカバリーフレーズを公開しないようにしてください。)
結果は:
0xf86b80843b9aca008252089417a98d2b11dfb784e63337d2170e21cf5dd0463188016345785d8a00008025a02e47aa4c37e7003af4d3b7d20265691b6c03baba509c0556d21acaca82876cb4a01b5711b8c801584c7875370ed2e9b60260b390cdb63cf57fa6d77899102279a0 。
これは、あなたが署名した取引がEthereumネットワークに送信できることを示しています。MEWやAlchemyのオンラインツールComposerを使用して、あなたの署名取引をEthereumネットワークに送信できます。具体的な原理は、eth_sendRawTransactionというRPCメソッドを使用してEthereumノードと対話することです。
五. 今署名して、後で送信する
上記の署名プロセスは「オフライン署名」と呼ぶことができます。なぜなら、私たちは最初に署名を作成し、その後それを放送する方法を見つけるからです。しかし、多くのオンラインウォレットは署名と放送を一緒に行います(例えばMetamaskやPortisなど)、署名後すぐに放送されます。しかし、オフライン署名は多くのアプリケーション(例えばステートチャネル)にとって非常に便利です。
ステートチャネルとは、二者のアカウントを監視するスマートコントラクトであり、これら二つのアカウントが提出した署名取引に基づいて、双方の間で資金の決済を行います。オフライン署名は分散型取引所でも一般的な実践です:買い注文と売り注文はオフチェーンに保存され、マッチングが成功したときにのみ二つの取引がオンチェーンで決済されます。Layer2ソリューションのzkRollupやOptimistic Rollupでも重要な役割を果たします。
Portisを使用すると、署名取引をGas Station Network(GSN)と対話させることができます。PortisはGSNに一連のリレーターをサブスクライブしており、彼らはあなたの取引のガス料金を支払う手助けをしてくれます。
これらのリレーターは分散型の契約(例えばRopstenテストネット上のもの)に関連付けられており、Portisは彼らにあなたの取引を中継するよう要求できます。あなたは依然として取引に署名する必要がありますが、Portisが他のすべてを手伝ってくれるため、たとえ新しいウォレットを使用していても、ガス料金を支払うための残高がなくても、スマートコントラクトと対話することができます。私たちのcryptopuppersアプリで試してみてください!
詳細を知りたい場合は、ここにGSN(EIP-1613)の仕様があります。また、TabooKeyチームとPortisの愛するcryptopuppersアプリの連携デモも見ることができます。
署名プロセスについて説明したので、私たちの秘密鍵に関するシリーズはここでお別れです。もしあなたが一つも見逃さなければ、Ethereumアカウントがどのように作られ、Ethereumの取引がどのように行われるかを理解できるはずです。
原文リンク:https://medium.com/portis/part-three-creating-and-signing-ethereum-transactions-e9cca44d7e2d














