美文网首页
以太坊交易类型

以太坊交易类型

作者: 雪落无留痕 | 来源:发表于2021-04-28 00:36 被阅读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 提交到网络上。

    相关参数为:

    • from: 20字节,发送方地址;

    • to: 20字节,接收方地址,当为空时,为创建合约交易;

    • gas: 可选项,默认为90000;

    • gasPrice: 可选项;

    • value: 可选项,交易金额;

    • data: 编译的合约代码 或者是调用函数的签名和编码的参数;

    • nonce: 可选项, 可以覆盖同一nonce的pending交易。

    返回值:

    • 签名名的交易对象。

    示例:

    // 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域中包含代码的时候,为合约创建的交易。

    相关参数为:

    • from: 20字节,发送方地址;

    • to: 20字节,接收方地址,当为空时,为创建合约交易;

    • gas: 可选项,默认为90000;

    • gasPrice: 可选项;

    • value: 可选项,交易金额;

    • data: 编译的合约代码 或者是调用函数的签名和编码的参数;

    • nonce: 可选项, 可以覆盖同一nonce的pending交易。

    返回值:

    • 交易的Hash值。

    示例:

    // 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

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

    参数:

    • DATA: 签名的交易数据

    返回值:

    • DATA: 32字节,交易的hash值。
    // 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

    相关文章

      网友评论

          本文标题:以太坊交易类型

          本文链接:https://www.haomeiwen.com/subject/osymrltx.html