以太坊交易类型

2021-04-28  本文已影响0人  雪落无留痕

交易(Transaction)是指由一个外部账户转移一定资产给某个账户, 或者发出一个消息指令到某个智能合约。

在以太坊网络中,交易执行属于一个事务,具有原子性、一致性、隔离性、持久性特点。

交易数据结构

外部账户可以创建交易,用自己的私钥进行签名之发送消息给另一个外部账户或合约账户。两个外部账户之间传送的消息即为转账操作。从外部账户到合约账户的消息会激活合约账户的代码,执行各种操作,也就是我们常说的调用智能合约。可以通过向0地址发起交易来创建合约账户。交易包含以下主要字段:

  1. Type:交易的类型,ContractCreation(创建合约)还是MessageCall(调用合约或转账)
  2. nonce: 发送地址的交易计数
  3. gasPrice:为交易付出的Gas价格
  4. gas:为交易付出的gas
  5. to:接受方地址, 若to为空,表示创建合约
  6. value: 向目标账户发送的金额
  7. Input:交易的附加数据
  8. R, S, V:交易签名结构体

代码实现

// core/types/transaction.go:38
type Transaction struct {
    data txdata
    // caches
    hash atomic.Value
    size atomic.Value
    from atomic.Value
}

type txdata struct {
    AccountNonce uint64     
    Price        *big.Int  
    GasLimit     uint64     
    Recipient    *common.Address 
    Amount       *big.Int
    Payload      []byte

    // Signature values
    V *big.Int
    R *big.Int
    S *big.Int

    // This is only used when marshaling to JSON.
    Hash *common.Hash `json:"hash" rlp:"-"`
}

JSON格式化

   {
    "nonce": "0x16",
    "gasPrice": "0x2",
    "gas": "0x1",
    "to": "0x0100000000000000000000000000000000000000",
    "value": "0x0",
    "input": "0x616263646566",
    "v": "0x25",
    "r": "0x3c46a1ff9d0dd2129a7f8fbc3e45256d85890d9d63919b42dac1eb8dfa443a32",
    "s": "0x6b2be3f225ae31f7ca18efc08fa403eb73b848359a63cd9fdeb61e1b83407690",
    "hash": "0xb848eb905affc383b4f431f8f9d3676733ea96bcae65638c0ada6e45038fb3a6"
   }

EIP155签名

采用secp256k1对交易进行签名:

交易接口

eth_signTransaction

对交易进行签名,随后用 eth_sendRawTransaction 提交到网络上。

相关参数为:

返回值:

示例:

// Request
curl -X POST --data '{
    "id": 1,
    "jsonrpc": "2.0",
    "method": "eth_signTransaction",
    "params": [{
        "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675",
        "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
        "gas": "0x76c0",
        "gasPrice": "0x9184e72a000",
        "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
        "value": "0x9184e72a"
    }]
}'

// Result
{
    "id": 1,
    "jsonrpc": "2.0",
    "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
}

eth_sendTransaction

创建消息调用交易,或者data域中包含代码的时候,为合约创建的交易。

相关参数为:

返回值:

示例:

// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":
[{
  "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
  "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
  "gas": "0x76c0", // 30400
  "gasPrice": "0x9184e72a000", // 10000000000000
  "value": "0x9184e72a", // 2441406250
  "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}],
"id":1}'

// Result
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}

eth_sendRawTransaction

创建消息调用的交易或者合约创建的已经签名的交易。

参数:

返回值:

// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":
["0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"],
"id":1}'

// Result
{
  "id":1,
  "jsonrpc": "2.0",
  "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}

参考

https://eth.wiki/json-rpc/API

https://learnblockchain.cn/books/geth/part1/transaction.html

https://learnblockchain.cn/books/geth/part3/sign-and-valid.html

上一篇下一篇

猜你喜欢

热点阅读