以太坊交易类型
交易(Transaction)是指由一个外部账户转移一定资产给某个账户, 或者发出一个消息指令到某个智能合约。
在以太坊网络中,交易执行属于一个事务,具有原子性、一致性、隔离性、持久性特点。
交易数据结构
外部账户可以创建交易,用自己的私钥进行签名之发送消息给另一个外部账户或合约账户。两个外部账户之间传送的消息即为转账操作。从外部账户到合约账户的消息会激活合约账户的代码,执行各种操作,也就是我们常说的调用智能合约。可以通过向0地址发起交易来创建合约账户。交易包含以下主要字段:
- Type:交易的类型,ContractCreation(创建合约)还是MessageCall(调用合约或转账)
- nonce: 发送地址的交易计数
- gasPrice:为交易付出的Gas价格
- gas:为交易付出的gas
- to:接受方地址, 若to为空,表示创建合约
- value: 向目标账户发送的金额
- Input:交易的附加数据
- 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://learnblockchain.cn/books/geth/part1/transaction.html
https://learnblockchain.cn/books/geth/part3/sign-and-valid.html