Eth転送

ETH トランザクションは一般的に転送トランザクションとして理解されていますが、この理解は比較的狭いものです。ここでいう取引は広義の取引です。

トランザクションの開始者: 主に 2 つのタイプ

  1. ノードはサービスを提供し、コントロールも取得します。
  2. ノード サービスの呼び出しとは、主に、geth がウォレットなどの RPC インターフェイスを提供するクライアントを指します。

取引区分:主に2種類

  1. ETH送金取引
  2. ERC20トークンに限定されない送金取引を含むその他の取引。

トランザクション関連の RPC インターフェイス: eth_sendTransaction および eth_sendRawTransaction

これら 2 つの関数は、呼び出し元が最終パラメーターに手動で署名する必要があるかどうかによって区別されます。

  1. eth_sendTransaction: この関数は ETH 転送にのみ使用されます. パラメータの最終署名は呼び出し元が手動で実行する必要はありません. 現在のノードのイニシエータの ETH アドレスのロック解除された秘密鍵を使用して署名します.関数が ETH 転送を実行するときは、最初に送信元アドレスのロックを解除する必要があります。
  2. eth_sendRawTransaction: 呼び出し元がパラメーター データに署名するために from の秘密鍵を使用する必要があるトランザクション関数. 現在の ERC20 トークン転送トランザクションは、この関数を使用します. この機能は ETH の転送にも使用できますが、ETH の転送は主にパラメータによって制御されます。

トランザクションとスマートコントラクトの関係

はじめに、スマートコントラクトのトランザクション(譲渡)を指す狭義のトランザクションの理解があります.
では、一般化されたトランザクションと狭義のトランザクションの関係は何ですか?
まず、転送トランザクションは、最初に RPC インターフェイス eth_sendRawTransaction を呼び出し、転送トランザクションで必要なパラメータをノードに渡します.ノードはデータを取得した後、eth_sendRawTransaction のデータ パラメータを含む各データ フィールドとデータを抽出します。は16 進数の文字列で、その内容には伝達関数の名前付き値に対応するmethodId が含まれます
次に、to パラメータに基づいてスマート コントラクトを見つけ、データの methodId に基づいてそれを参照する関数を見つけ、最後に誰に、どのくらい転送するかなどのデータのパラメータに従って関数を実行します。移行。
関数が実行されると、実行の成功または失敗に関係なく、トランザクション ハッシュ値 (正式名称は「Transaction Hash」、略して txHash) が返されます。
ここに画像の説明を挿入

トランザクションパラメータの説明

1. From は
、トランザクションが開始されたアドレスを表します. トランザクションの to がコントラクト アドレスのみである場合、コントラクト コードの msg.sender 変数は、このアドレスの from アドレスを表します.
2.to は、
現在のトランザクションの受信アドレスを表します。to の値には次の 3 つの状況があるため、受信アドレスを受信アドレスとして理解できないことに注意してください。

  1. スマートコントラクトのアドレス
    現在送信されているトランザクションは、処理のために対応するスマートコントラクトに引き渡されます。原則は ERC20 転送と同じです。したがって、ERC20 トークンを転送する場合、to はスマート コントラクトのアドレスである必要があります。
  2. 通常の ETH ユーザーのウォレット アドレスは
    通常の ETH 転送であり、to は受信アドレスです。
  3. 値が空の場合、現在のトランザクションはスマート コントラクトを作成するトランザクションです。
    これは、現在のトランザクションがスマート コントラクトをチェーンにデプロイするトランザクションであることを意味します。

3.value: 転送値
(1) eth_sendRawTransaction を使用して ERC20 Token を転送する場合、値は 0 であること
(2) ERC20 Token を転送する場合、転送する値は data パラメータで定義
(3) In eth_sendRawTransaction を使用する場合送金するには、値に値が必要です。この値は1 0 18 10^{18}です。1 02 などの1 8の形式の大きな値は2 ∗ 1 0 18 2*10^{18}21 018. ETH 転送トランザクションに eth_sendRawTransaction を使用する場合、注意すべき点が 3 つあります

  1. to は受信ウォレットのアドレスでなければなりません
  2. value は、0 ではなく ETH の値に対応します。
  3. データ パラメータは空の文字列です。

4. ガス
このガスはgasLimitですが、トランザクションが成功したときにGasUserが使用されます。トランザクションが成功すると、余分なガス料金が返され、返される部分は (gasLimit - GasUser)*gasPrice です。

5. GasPrice
は単価で、単位は wei であり、動的な値です。

6.ノンス
トランザクションシーケンス番号は、二重支出を防ぐものです。

7.data
これは比較的重要なパラメータで、トランザクション インターフェイスだけでなく、eth_call でも使用されます。
データ形式は次の要件を満たす必要があります。

  1. 16 進形式
0xa9059cbb0000000000000000000000007198ef99ac39c713ea1e333db4dc46c8b4413bf100000000000000000000000000000000000000000000000000000002cb417800
  1. 上記のように、0x を含む最初の 10 文字が methodId であり、その生成方法はより複雑で、コントラクト関数の名前に署名し、特定のバイト数を Keccak256 で暗号化し、16 進数に変換することによって取得されます。以下は、ETH バージョン標準に従って methodId を生成するためのコードです。
func (method Method) Id() []bety{
    
    
	return crypto.Keccak256([]byte(mothod.Sig()))[:4]
}

一般的な関数に対応する 2 つの methodId があります。

  • クエリ残高: balanceOf は 0x70a08231 です
  • 転送: 転送は 0xa9059cbb です
  1. 最初の10文字以降が以下の条件を満たしている
  • スマート コントラクトの関数のパラメーターを表します
  • 並べ替え方法は、コントラクト パラメーターの順序で配置されます。
  • 16 進形式で
  • 0x は使用できません。つまり、最初に 16 進数形式に変換してから 0x 文字を削除します。
  • 0x を削除すると、各パラメーターの文字数は 64 文字になります。
举个栗子:
onMethod(arg1,arg2,....)
data的格式应该是
methodId + hex64(arg1) + hex64(arg2) + hex64(arg3) + ....
eth_sendTransaction({
    
    from:"0x...", to:"0x...",value=某数值)
最少三个参数

sendTransaction は ETH によってカプセル化されています. ETH を転送するためにのみ使用できます. 基本的には sendRawTranscation と同じです. カプセル化された sendTransaction については, このときのデータがトランザクションを開始するための補助情報として設定されます.

トランザクションの状態 (ライフサイクル)

合計4州

  1. Unkonw (不明な状態): txPool ETH トランザクション プールに入れられていません. 現時点では、txHash によると、ブロック ブラウザーを使用してクエリする情報はありません。
  2. 保留中 (待機中または保留状態): この時点で、txHash に従って、ブロック ブラウザーを使用してクエリを実行でき、トランザクション情報の一部をクエリできます。
  3. 成功 (成功ステータス): トランザクションは成功し、txHash に従ってブロック ブラウザーを使用してトランザクションに関する情報を照会できます。
  4. Failed (失敗ステータス): トランザクションが失敗し、txHash に従ってブロック ブラウザーにクエリを実行して、失敗情報と失敗の理由が見つかりました。

ETH プールのサイズの影響により、一部の注文はトランザクション プールにのみ配置され、まだ取引されていない状態であり、この状態は Unkwon (ポジション状態) と呼ばれます。
これは、取引プール内のミンターの取引注文のソート アルゴリズムが GasPrice の影響を受けるためです. GasPrice の高い注文は、GasPrice の低い注文を締め出し、注文が常に保留状態になる可能性があります。数日間、あるいはそれ以上保留にします。(この状況に遭遇しました)

ここに画像の説明を挿入

トランザクションのパッケージ化

ここに画像の説明を挿入
ヒント: ミンターがトランザクションをパッケージ化する場合、「トランザクションの再検証」のステップには、内部にトランザクション ガス料金の計算ステップと、EVM ガス計算のプロセスがあります。

おすすめ

転載: blog.csdn.net/wjl__ai__/article/details/125175110