交易字段
In order to encode a Core Space transaction, the following fields are required:
from
- the address of the sender, that will be signing the transaction. This will be an externally-owned account as contract accounts cannot send transactions.to
- the receiving address (if an externally-owned account, the transaction will transfer value. If a contract account, the transaction will execute the contract code)value
– amount of CFX to transfer from sender to recipient (denominated in Drip, where 1CFX equals 1e+18Drip)nonce
- a sequentially incrementing counter which indicates the transaction number from the accountdata
optional field to include arbitrary datagas
– the maximum amount of gas units that can be consumed by the transaction. The EVM specifies the units of gas required by each computational stepgasPrice
- the price of the consumed gas to be included as a tip to the validatorstorageLimit
- the maximum amount of storage space that can be consumed by the transaction.chainId
- the id of the blockchain, which is used to prevent replay attacksepochHeight
- the epoch number of the blockchain, which is used to sets an expiration time for the transactionsignature
(r,s,v) – the identifier of the sender. This is generated when the sender's private key signs the transaction and confirms the sender has authorized this transaction
基本字段
The from
, to
, and value
are the basic fields of a transaction. These fields correspond to the address of sender account, address of the receiver account and the amount to be transferred, respectively.
from
The from
field identifies the sender of the transaction. Essentially, the from
field tells you who is initiating the transaction and who is paying for the transaction. And in the Signing phase, the transaction will be signed with the private key of the from
account, so you cannot specify arbitary address as the sender.
It is also important to remember that the account must have a sufficient balance to cover both the transfer amount (value
field) and the transaction fee, otherwise the RPC will reject the transaction and it will not be sent.
It's worth mentioning that in some specific cases, Conflux Core Space's sponsor mechanism can allow for other accounts to pay the transaction fee, allowing accounts with 0 balance to send transactions.
In fact, the
from
field is not directly included in an encoded transaction. Generally speaking, tools such as SDKs will remove thefrom
field from transaction before encoding and sign the transaction using corresponding private key. 其他人可以从交易的签名中恢复出发送者。
to
The to
field indicates the recipient account of the transaction.
- If you are making a simple CFX transfer, this field should be set to the CFX recipient's account.
- If you are modifying the state of a contract, the to field should be set to the address of the contract.
- If you are deploying a new contract, the
to
field is left empty.
value
The value
field represents the amount of CFX to be transferred and must be set as an integer in the unit of Drip (10**-18 CFX).
nonce
The nonce
is the execution sequence number of transactions sent from an account. Normally you can get it by calling the cfx_getNextNonce
RPC method.
If you want to expedite transaction processing, you may want to explore the nonce management mechanism further.
data
The data field of the transaction can be left blank or set to a hex-encoded bytes. 这大致可以分为三种情况:
- Regular CFX transfer transaction: The
data
field is usually blank, but hex-encoded data can be set as a transaction remark or postscript. - Contract deployment transaction:
data
needs to be set as the contract's bytecode and the parameters of the constructor (if any) - Contract call transaction: The
data
field is used to store the input data for the contract to call. The data is usually the contract method and data after parameter abi encoding.
智能合约通常用高级合约开发语言(Solidity,vyper)编写。 你可以用编译器获得字节码和 abi。 SDK 会提供 abi 编码方法,用于合约方法调用的编码(编码方法名和参数)。
Fee-Related Fields
There are several fields in the transaction information related to fees, each serving a different purpose.
gas
During the execution of a transaction in the EVM, each operation consumes a certain amount of gas. To prevent excessive consumption of network computing resources or being charged excessively, it is necessary to limit the gas consumption during transaction execution. The gas field in transaction information is used to specify the upper limit of gas consumption for transaction execution. If the actual total gas consumed during transaction execution exceeds this limit, the transaction will fail.
The actual amount of gas consumed during transaction execution is related to the complexity of the transaction. A standard CFX transfer transaction (without data) typically consumes 21,000 gas, while contract deployment or interaction may consume more.
The cfx_estimateGasAndCollateral
method can be used to estimate the required amount of gas for transaction execution, which returns the gasUsed
, gasLimit
and storageCollaterized
fields. It is recommended to use gasLimit
as the gas
field.
The gas estimated by the cfx_estimateGasAndCollateral
method may not always be accurate and could be conservative. Therefore, when setting the transaction gas, it is common to multiply the value returned by this method by a factor, such as 1.3, for added safety.
有关 gas 的使用、估算和收费的更多信息,请参考 Gas 简介。
gasPrice
The gasPrice is used to set the amount of CFX that the sender is willing to pay for one unit of gas (in Drip). The total gas fee for the transaction is gasCharged * gasPrice. Miners use the gasPrice to determine the order in which transactions are included in a block. Generally, higher gasPrice results in faster transaction inclusion.
The cfx_gasPrice
method can be used to obtain an appropriate gas price. During periods of network congestion, it may be necessary to manually set a higher price; details can be found in How to Set Prices.
storageLimit
In Conflux Core Space, transaction execution not only consumes computing resources but also occupies storage resources. Therefore, transactions are charged for storage usage. The storageLimit field in a transaction is similar to the gas field and is used to specify the upper limit of storage space that a transaction can occupy. If this limit is exceeded, the transaction will fail.
The cfx_estimateGasAndCollateral
method also estimates the storage size that a transaction execution will occupy.
其他字段
chainId
The chainId
field in transactions is used to identify the specific chain. For example, the current chainId of the Core Space is 1029 and that of the Core Space testnet is 1. 这个字段主要是为了防止重放攻击而包含在交易中。
It's generally not necessary to fill in this field manually, as the SDK will automatically obtain the chainId through the cfx_getStatus
method.
epochHeight
The epochHeight
field is used to specify the target epoch range for a transaction. 交易只会在 [epochHeight - 100000, epochHeight + 100000] 的范围内执行。 如果当前链的 epoch 超过了这个范围,交易将被丢弃。
The SDK will also automatically set this field to the current epoch obtained by the cfx_epochNumber
method.
Signature Fields
The transaction signature is generated by the sender of the transaction to prove the sender's authorization of the transaction. The transaction signature consists of three fields: r, s, and v. Among them, r and s are two 256-bit integers, and v is an 8-bit integer. The process of generating a transaction signature is as follows:
- Encode the basic information of the transaction using RLP, resulting in the encoded data.
- Perform a Keccak256 hash operation on the encoded data to obtain a 256-bit hash value.
- Use the hash value and the sender's private key as parameters to invoke the ECDSA signature algorithm, obtaining the signature's r, s, and v fields.
For specific generation details, refer to Transaction Encoding and Signature.
参考资料
- Core Space transactions follow the definition of Conflux Protocol
- eSpace transactions follow the EIP-155 specification
常见问题解答
What's max value of transaction gas limit?
It's half of the block gas limit, whereas 30 million gas * 0.5 (15000000).
What's minimum value of Core Space transaction gasPrice?
1 GDrip (10**9 Drip).
What's the max size of transaction data?
It's about 200k bytes.
What Parameters are Required for Sending Transactions via SDK?
When using the JS-SDK for basic CFX transfers, three parameters are essential: from
(the originating account), to
(the recipient account), and value
(the amount to be transferred, measured in Drip). Other fields can be automatically populated by SDK.