FAQs

Conflux FAQs

Common FAQs

如何判断交易执行成功

通过 cfx_getTransactionByHash 获取 transaction 信息,只有 status = 0 一种情况表示交易被成功执行了。

Invalid parameters: request, data: "network prefix unexpected: ours cfx, got cfxtest"

调用 cfx_call 方法时,如果调用合约地址的网络,跟节点的网络不一致,会返回此错误

如何在智能合约里面保证线程安全, 或者有没有方法锁之类的修饰 ?

合约是单线程执行的,没有线程安全问题

Conflux 目前 Oracle 服务有哪些

有没有 API 可以查询某个合约的所有交易记录?

ConfluxScan 提供 OPENAPI 支持查询某账户最多 1W 调交易记录。

为什么同一笔交易会出现在多个区块当中?

Conflux 的账本结构为树图结构,区块并行产生,因此会导致一笔交易被多个区块打包的情况;但最终账本全排序之后,只有交易所在的第一个区块中的交易是有效交易。

去重方式参看 Next One

Conflux (树图账本)如何扫块获取所有交易?

Conflux 账本有一个 epoch 编号,epoch 从 0 开始自增。每个 epoch 中可能有多个区块,区块中包含交易。因此扫描交易可按照 epoch 一次获取其中的所有区块,以及区块中所有的交易。

  1. cfx_getBlocksByEpoch 获取某 epoch 的所有区块hash
  2. cfx_getBlockByHash 获取区块内的交易

另外树图结构账本,有交易被多个区块重复打包的情况,可采用如下方式之一去重:

  1. 同时验证区块中交易的 blockHash 是否与区块的 hash 相同,不同则需要过滤掉
  2. 判断 tx.status 若值为 0x0 或 0x1 为有效交易,为 null 或者 0x2 则需要过滤掉

采用以上两种方式之一均可。

Note: 另外还需要注意 latest_confirm 到 latest_state 之间的交易,可能由于 pivot chain switch 而发生变化.

Pending TX

Pending TX FAQs

Pending TX

What is Pending TX?

大家在使用 Fluent 钱包发送交易的时候可能会遇到交易迟迟无法上链执行,一直处于 Pending 状态的情况。

Screen Shot 2022-06-04 at 11.50.17.png

Screen Shot 2022-06-04 at 11.50.32.png

或者使用 SDK 发送交易后一直无法查询到交易的 Receipt 遇到了超时。

这种交易在 ConfluxScan 中查看的话,它们的状态会显示为待处理状态.

pending.png

因为交易还未打包所以其区块信息均为空,包括:

交易 Pending 是一个什么状态?

交易从发出到最终执行确认会经历多个阶段:

交易被发送后首先会进入节点的待打包交易池中,并会被广播到全网。矿工节点会不断从交易池中选择满足打包条件的交易,打包进最新生成的区块中。如果交易一直无法满足打包交易条件就会一直待在交易池中。

如果交易池中交易过多,这样的交易还有可能被 GC 掉,此时在浏览器中搜索交易 hash,就会显示为 not found. Screen Shot 2022-06-11 at 17.23.20.png

Pending TX

如何确认交易Pending的原因

交易 Pending 后,导致转账迟迟无法完成,用户通常会比较茫然,不知所措。此时我们首先需要判断出 Pending 的具体原因,然后才能分情况处理 Pending 的交易。

交易为什么会 Pending ?

Conflux 网络正常情况一秒钟出两个块,一笔交易被成功发出之后应该在几秒到十几秒内,会被打包并执行。 如果交易迟迟不被打包,那大概率是交易在交易池中 Pending 了,需要发送者进行手动干预。

交易被 Pending 在交易池中,根本原因是没有满足交易打包的条件,主要有三种情况:

  1. 交易使用了非连续的 nonce
  2. 交易发送账号的余额不足以支持交易执行
  3. 网络比较拥堵,此时矿工会优先打包 gasPrice 较高的交易,如果某交易的 gasPrice 比其他交易都低,也比新产生的交易低,此时就会一直等待直到网络不繁忙。

非连续的 nonce

Conflux 同以太坊一样,每个账户都有一个 nonce 值, 为该账户发送交易的序列号,或者说 nonce 决定了交易的执行顺序。一个账户发送交易时需要指定 nonce,并且该 nonce 需要从 0 开始递增。交易也是按照 nonce 递增的顺序执行。

举个例子:

此时下一笔可执行交易的 nonce 应为 11,但如果此时发送的交易 nonce 为 15, 那这笔交易会一直 pending 在交易池里,直到 nonce 11-14 的交易被执行

余额不够

在区块链世界,交易是用来进行数字货币转账的,而且发送交易还需要给矿工支付手续费,这样才会有人愿意打包并执行你的交易。所以一个账户想要发送一笔交易,那么该账户的余额需要足够支付交易本身的金额加手续费。如果不足以支付则交易就会一直 Pending 在交易池中,直到账户获得足够的余额。

在 Conflux 中,除了支付手续费之外,还需要为存储空间的使用支付费用,具体收费规则为每占用 1k 空间,支付 1CFX。

所以一笔交易所花费的金额计算方式为:value + gasPrice * gas + storageLimit / 1024

如果交易的 to 地址是一个合约,且合约设置了 Sponsor,这时如果交易满足代付条件的话,则交易发送账号余额仅需要足够支付 value 即可。

gasPrice 过低

目前共有区块链的性能都不是很高,在网络比较拥堵的情况下,交易池中会有大量的交易等待被打包,超过矿工的打包速度,这种情况,矿工是按照 gasPrice 从高到底的优先级选取交易并打包。简单来说 gasPrice 越高,打包速度越快

如果一笔交易的 gasPrice 设置的比较低的话,这笔交易就会一直等待其它交易被打包,而 Pending 在交易池中。

目前在 Conflux 主网和测试网建议 gasPrice 为 1GDrip

备注:1GDrip = 1e9 Drip

cfx_getAccountPendingTransactions 方法

Conflux node 有一个 RPC 方法 cfx_getAccountPendingTransactions 可用户获取某账户在交易池中 Pending 的交易列表,数量,及第一笔 Pending 交易的 Pending 原因。

// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"cfx_getAccountPendingTransactions","params":["cfx:aan02vpwvz8crpa1n10j17ufceefptdc2yzkagxk5u"],"id":1}' -H "Content-Type: application/json" localhost:12539

// Response
{
    "jsonrpc": "2.0",
    "result": {
        "firstTxStatus": {
            "pending": "futureNonce"
        },
        "pendingCount": "0x1",
        // Reference transaction example
        "pendingTransactions": [
            {
                "...": "..."
            }
        ]
    },
    "id": "15922956697249514502"
}

firstTxStatus 字段即是第一笔 Pending 交易的 Pending 原因,有三种可能:

说明:该方法只能返回访问的 RPC 节点交易池中的 Pending 交易,由于交易广播延迟的原因,可能发送了交易,且迟迟没有执行,但通过该方法获取不到 Pending 交易。另外交易池本身有 GC 机制,在交易池满之后,会把一些不满足执行条件的交易 GC 掉,此时通过该方法也获取不到 Pending 交易。

如果通过 cfx_getAccountPendingTransactions 方法获取不到 Pending 交易,或通过 cfx_getTransactionByHash 也获取不到交易,这种情况可直接尝试重新发送交易。

使用 ConfluxScan 查看 Pending 交易

ConfluxScan 的账户详情页,有一个 tab 可用于查看该用户的 Pending 交易列表

scan-pending-entry.jpeg

点击之后,如果账户有 Pending 交易,可看到 Pending 列表及第一条 Pending 的原因:

scan-pending-tx-list.jpeg

页面显示原因有三种(同上一节三种一一对应):

Scan 该页面其实是通过 cfx_getAccountPendingTransactions 方法获取的 Pending 信息。

使用 Pending 小工具查看原因

Conflux 社区用户也开发一个 Pending TX 查看小工具,可用于查看某账户的 Pending 交易信息

Screen Shot 2022-06-15 at 10.59.02.png

该工具会给出 Pending 的数量,第一笔 Pending 交易的原因及 hash,另外还给出了可能的解决建议

自行分析 Pending 原因

由于交易广播延迟,或发送交易的 RPC 节点与 Scan 所使用 RPC 节点不同原因,可能在 Scan 的账户 Pending 页面,查看不到 Pending 交易列表。此时可自行使用交易 hash 调用 getTransactionByHash 方法查询交易信息,如果能获取到交易,且交易处于 pending 状态(无 blockHash)此时可根据交易的信息(value, gas, gasPrice, storageLimit)以及账户的状态(balance, nonce)判断交易 Pending 的具体原因。

如果 getTransactionByHash 获取不到交易信息,可直接重新发送交易.

Pending TX

如何解决Pending交易

遇到 Pending 交易的问题,首先需要判断 Pending 的具体原因,然后不同的原因可采用不同的方式来处理。

futureNonce

如果交易因为使用跳跃的 nonce 而 Pending 在交易池中,这种情况需要使用正确的 nonce 重新发送交易。

注意:Pending 的那笔交易通常等其前边的交易执行后会自动执行。

notEnoughCash

如果是因为发送账号余额不足而导致的交易 Pending,此时只需给交易 from 账户转足够的 CFX 即可。

如果是一笔合约交互的交易,且合约设置了代付,大概率是因为该笔交易不满足合约代付的条件。大概率是一下两种可能:

gasPrice 过低

如果交易 nonce 正确,且发送账户有足够的余额,但还是长时间 Pending 在交易池中,不被打包,这种情况应该是因为 gasPrice 设置较低导致的。

可尝试使用相同的 nonce,提高 gasPrice 重新发送交易。(Fluent 钱包发送交易时,高级模式可自行指定 nonce 和 gasPrice) (使用 SDK 发送交易可显示指定 nonce 跟 gasPrice)

Conflux 主网跟测试网建议 gasPrice 为 1GDrip。

WechatIMG250.jpeg

WechatIMG251.jpeg

Pending TX

FAQs

nonce 是从链上获取的,为什么会有 nonce 不连续 Pending 交易 ?

在网络比较拥堵的情况下,交易可能会被交易池 GC 掉,此种情况重新发送跳跃的 nonce 交易即可。

交易发送失败常见问题

在发送交易前通常需要调用 estimate 方法获取交易所需的 gas 和 storageLimit 值,然后调用 sendRawTransaction 方法发送交易。因此本章节包含了这两个方法的常见错误

交易发送失败常见问题

Can not estimate: NotEnoughCash

如果在发送交易时遇到错误:Can not estimate: transaction execution failed, all gas will be charged (execution error: NotEnoughCash { required: xx, got: xx, actual_gas_cost: xx, max_storage_limit_cost: xx }) 则表示交易的 from 账户余额不足。此种情况需要检查是否交易的 gasPrice,gas,storageLimit 设置过大,或者给 from 账号准备足够的余额,或给合约设置代付.

错误详情

此错误是由RPC 方法 cfx_estimateGasAndCollateral 返回(从v2.0.2开始),在调用该方法时,如果参数中设置了 from 信息,会使用 from 账户的真实 balance 来模拟执行交易,如果账户的余额不足以支付交易的 value + gas*gasPrice + storage抵押费,则 estimate 操作将会失败,并返回如下错误:

{
		"code": -32015,
		"message": "Can not estimate: transaction execution failed, all gas will be charged (execution error: NotEnoughCash { required: 18014398509481983999023437515000000, got: 0, actual_gas_cost: 0, max_storage_limit_cost: 18014398509481983999023437500000000 })",
		"data": "0x4e6f74456e6f75676843617368207b2072657175697265643a2031383031343339383530393438313938333939393032333433373531353030303030302c20676f743a20302c2061637475616c5f6761735f636f73743a20302c206d61785f73746f726167655f6c696d69745f636f73743a203138303134333938353039343831393833393939303233343337353030303030303030207d"
}

在 estimate 操作检查 balance 可大大减少 pending 交易。目前 TestNet 公开 RPC 节点已完成升级,cfx_estimateGasAndCollateral 该方法参数的默认值如下:

  1. gasPrice: 1 Drip
  2. gas: 1500w

另外从 v2.0.2 开始,发送交易的最低 gasPrice 提高到了 1GDrip

如何分析余额不足的具体原因

可通过如下步骤检查具体不足原因:

  1. 检查发送账户是否有余额
  2. 如果发送账户有余额,检查是否 gas, gasPrice, storageLimit 设置过大,余额不足有可能是某项设置过大导致的,比如 storageLimit
  3. 如果交易接受账户是一个合约,且合约有 sponsor,检查

注意:可使用 Scan 的赞助页面查看合约的赞助余额,可通过 SponsorWhitelistControl 合约的读写合约功能,查看白名单设置情况

合约设置了赞助商,为什么还是报此错误

用户可能会遇到此种情况:交易的 to 地址是一个合约,且合约已经设置了赞助商,但发送交易时还是报 NotEnoughCash 错误。此种情况可能是由两个原因导致的:

  1. 合约代付的白名单可能没有正确设置,交易的 from 地址不在白名单里,所以代付未生效
  2. 交易的 gasFee(gasPrice * gas) 超过了燃气代付的上限(upperbound), 所以代付未生效

解决办法

解决此错误可使用如下方法之一:

  1. 可尝试在预估燃气费时将 gasPrice 设为 1Drip,得到预估值后发送交易时再把燃气费设为正确的值比如 1GDrip。
  2. 直接升级最新版本的 SDK(js,go,java), 目前最新版本的SDK 已针对此 case 做了处理
  3. 如果条件允许,可提高合约燃气赞助的 upperbound 到 0.05 CFX
交易发送失败常见问题

Estimation isn't accurate: transaction is reverted

发送交易前通常会调用 cfx_estimateGasAndCollateral 方法,来预估交易执行所需要的 gasstorageLimit。该方法本质是对交易进行了模拟执行,然后统计交易执行完之后实际的 gas 和 storage 使用量。但交易的模拟执行并不是都会成功的,部分交易由于某些原因会执行失败,这时该方法会返回 Estimation isn't accurate: transaction is reverted 错误:

{
		"code": -32015,
		"message": "Estimation isn't accurate: transaction is reverted. Innermost error is at CFX:TYPE.CONTRACT:ACDUZTJBPM9PPP9F0K5VT3PJU0EJUDNHP2ZM7WS35N: Vm reverted. .",
		"data": "CFX:TYPE.CONTRACT:ACDUZTJBPM9PPP9F0K5VT3PJU0EJUDNHP2ZM7WS35N: Vm reverted. \nCFX:TYPE.CONTRACT:ACD5E6SPRGMDVG15FDXF2B8AH7DAN7GMZAGXA10EPZ: Vm reverted. "
}

遇到该错误意味着合约方法代码无法成功执行,交易被 reverted。导致此错误的可能较多,比如:发送合约代币或 NFT 余额不够;合约方法传参错误;没有权限或授权,等等。

如果合约执行时抛出了错误 message,这时 RPC 的错误信息中可以看到合约执行失败的具体原因,比如如下错误是在进行 NFT(1155)转账时,余额不足合约返回的错误:

Estimation isn't accurate: transaction is reverted: ERC1155: insufficient balance for transfer. Innermost error is at xxxx: Vm reverted. ERC1155: insufficient balance for transfer

参考

交易发送失败常见问题

Can not estimate: transaction execution failed

在调用 estimate 的方法的时候,如果方法执行失败,则会报此错误。Can not estimate: transaction execution failed, all gas will be charged

有时后边可能会包含错误的详情,目前已知的有如下几种:

ConflictAddress(0xxxxx)

{
  "code": -32015,
  "message": "Can not estimate: transaction execution failed, all gas will be charged (execution error: VmError(ConflictAddress(0x87e69792aab04a1e54faa54b41a688335199c1bb)))
",
  "data": "VmError(ConflictAddress(0x87e69792aab04a1e54faa54b41a688335199c1bb))"
}

此错误为合约部署地址冲突错误,意味着部署操作将要部署的合约地址,已经有合约存在。

如果某账户的第一笔交易为合约部署交易,且之后用相同的 data 再次 estimate,且不指定 nonce 的情况,会触发此错误。因为 nonce 的默认值为 0

此时在进行 estimate 时指定 nonce 为用户当前 nonce, 即可解决此问题.

BadInstruction { instruction: 214 })

{
  "code": -32015,
  "message": "Can not estimate: transaction execution failed, all gas will be charged (execution error: VmError(BadInstruction { instruction: 214 }))
",
  "data": "VmError(BadInstruction { instruction: 214 })"
}

此错误表示在部署合约时,传递的 data 数据有问题,包含错误的指令。

一种触发此错误的场景为,在调用合约方法时,未指定合约地址,此时会被认为是创建合约的操作,但 data 数据又不正确,导致此错误.

VmError(OutOfGas)

{
    "jsonrpc": "2.0",
    "error": {
        "code": -32602,
        "message": "Can not estimate: transaction execution failed, all gas will be charged (execution error: VmError(OutOfGas))"
    },
    "id": "15922956697249514502"
}

此错误产生是由于在进行 estimate 操作时指定的 gas 值较小,不足以支撑交易执行完,因此返回了 OutOfGas 错误。这种情况调大 gas 值,或者不传递 gas 字段(自动预估)即可.

另外一种情况是在 estimate 时虽然未指定 gas 值,但还是遇到了 OutOfGas 错误,此种情况说明合约执行逻辑消耗 gas 过大,超过了单 tx 上限,此时需要优化合约的执行逻辑。

交易发送失败常见问题

SendRawTx: Invalid parameters: tx

发送交易时,如果构造的交易不正确,会遇到 Invalid parameters: tx 错误。错误的具体原因在 RPC 返回数据的 data 字段中, 大致会有如下几种:

余额不足

Transaction {?} is discarded due to out of balance, needs {?} but account balance is {?}

从 conflux-rust v2.0.2 开始 cfx_sendRawTransaction 方法会拒绝掉 tx.from 余额不足以支付交易 value + gasFee + storageCollateral 的交易。

nonce 设置错误

许多交易发送错误是由于 nonce 未设置正确导致的

tx already exist

此错误表示同 nonce 的交易已经存在于交易池中了,重复发送相同的交易会报错

Tx with same nonce already inserted

此错误亦表示同 nonce 交易已经在交易池中

Transaction 0xxx is discarded due to a too stale nonce

此错误表示发送的交易使用了一个已经被执行过交易的 nonce,通俗点说这个 nonce 已经被用过了,不能再使用,需要使用新的未使用的 nonce 重新发送

Transaction 0xxx is discarded due to in too distant future

此错误表示使用了一个过大的 nonce 构造交易,发送交易时 nonce 只能比用 current nonce - current nonce + 2000 范围内的,如果比当前可用 nonce 大超过 2000 会报此错误

gasPrice 错误

ZeroGasPrice

交易的 gasPrice 设置为 0 会报此错误。交易的 gasPrice 必须会大于 0.

transaction gas price 1000000 less than the minimum value 1000000000

从 conflux-rust v2.0.2 开始交易的最低 gasPrice 改为 1GDrip(9个0),如果gasPrice 小余该值,会报此错误

gas 设置错误

交易的 gas 字段设置过大,或过小也会发送失败

NotEnoughBaseGas { required: 21000, got: 2000 }

如果交易的 gas 小余 21000,则会报此错误

transaction gas 20000000 exceeds the maximum value 15000000, the half of pivot block gas limit

如果交易的 gas 超过 1500w 会报此错误

其他参数设置错误

EpochHeightOutOfBound { block_height: 53800739, set: 0, transaction_epoch_bound: 100000 }

交易 epochHeight 字段设置错误,只能设置 10w epoch 以内的区块号

Unsupported receiver address type

交易接受地址填写错误

ChainIdMismatch { expected: 1, got: 2 }

交易的 chainId 填写错误,与发送链的 chainId 不一致

编码签名错误

RlpIncorrectListLen

交易内容不完整,可能会报 Rlp 错误长度错误

Can not recover pubkey for Ethereum like tx

此错误为交易签名错误

网络拥堵

在网络拥堵的情况下,交易池中的交易可能会达到容量上限,此时发送交易可能会遇到以下错误

txpool is full

表示交易池中交易已满

Failed imported to deferred pool: Transaction Pool is full

表示交易池中交易已满

其他

Request rejected due to still in the catch up mode.

发送交易的节点未同步到最新数据,仍处于 catch up 模式,需等同步到最新数据后,才能发送交易

Failed to read account_cache from storage: {}

节点错误

参考

具体的 RPC 返回错误详情可参看 cfx_sendRawTransaction error 文档

交易发送失败常见问题

JS-SDK: Method not found

如果使用 js-conflux-sdk 发送交易,且交易的 from 账号未添加到 wallet 中的时候,会遇到此错误。此种情况通过如下方式添加账号即可:

conflux.wallet.addPrivatekey("your account private key");

节点运行问题

节点运行问题

节点启动失败

kvdb_rocksdb - DB has been previously marked as corrupted, attempting repair

发生此错误是因为节点的数据文件遭到了损坏,导致无法启动。此种情况可尝试删掉数据目录,让节点重新同步数据。

如果想快速启动节点,可直接下载节点数据快照,解压后启动节点。

Err value: PKCS#8 cryptographic error

Screen Shot 2022-06-14 at 11.40.23.png

该错误可能是 pos_key 的密码输入错误导致的

window 系统启动节点: ExecutionContext exists for cur_era_genesis core\src\block_data_manager\mod.rs

在 Windows 系统使用数据快照,启动一个节点时,可能会遇到如下错误:

WechatIMG6266.jpeg

此错误可能是用 archive tool 下载数据的时候数据没下全导致的,其本质原因是启动用数据有问题导致的。

可尝试重新下载数据,启动节点。

Mac 系统运行 Release binary 失败

如果在 Mac 系统,使用从 Github Release 下载的节点程序,运行节点,遇到如下错误:

CleanShot 2022-07-12 at 11.08.07@2x.png

则说明 Host 系统的版本太低导致,目前只支持 OSX 12 版本及以上的系统。

另外使用 Mac 运行节点程序,需要注意根据电脑的处理器架构选择正确的处理器版本节点。M1 跟 x86 不能混用。

failed to start full client: Os { code: 6, kind: Uncategorized, message: "No such device or address" }

此错误是使用 docker 启动节点时,节点会尝试通过标准输入读取 pos_key 密码,读取不到返回的错误,此种情况可将该密码配置到配置文件中或设置到环境变量中具体参看这里

节点运行问题

常见问题

Fullnode 会保存多长时间内的交易记录?state应该是完整的吧?一般需要多大的硬盘?

Fullnode 会保存最近10w Epoch 的区块数据,state 也是如此,只能查询最近几万的状态。 Fullnode 目前硬盘需要 250G, 建议硬盘为 400G。

Archive node一般需要多大的硬盘?

Archive node 目前空间为 500G 左右,建议空间为 800G-1T

运行节点需要什么配置的机器?

Conflux 节点建议使用 Linux server 运行,建议配置为 4核 16G内存。Fullnode 建议硬盘空间为 500G。Archive node 建议空间为 1T。

如何获取节点程序?

获取节点程序有多种方式:

  1. 直接至 Github Release 页面下载最新版本的编译程序
  2. 使用 conflux-rust docker 镜像
  3. 下载源码自行编译

节点 Core 空间 RPC 默认端口号是多少,eSpace 默认 RPC 端口号是多少?

Core 空间 HTTP 默认端口号是 12537. eSpace 默认 HTTP 端口号是 8545.

ERROR IO Worker #2 cfxcore::con - Fail to recover state_valid

此为正常现象,不影响节点同步和运行

Screen Shot 2022-06-24 at 11.43.19.png

INFO COW copy failed, check file system support

INFO Background Snapshott cfx_storage: - COW copy failed, check file system support. Command "cp" "-R" "--reflink=always"

此信息是由于机器文件系统不支持 Copy on write 功能,发出的提示,不影响节点运行。 如果机器支持 COW 将有助于提升节点性能。

测试网从头同步数据,中间同步卡主

测试网全量同步需要调大选项 additional_maintained_snapshot_count 到 50

运行 Conflux 节点是否需要公网 IP

节点运行不要求公网IP

主网,测试网节点的配置文件,节点程序是否相同, 可否互用

两个网络的配置文件,跟节点程序是不同的,不能混用,需要各自使用正确的节点程序跟配置文件

节点运行问题

节点同步问题

failed to calculate mempool broadcast RTT: SystemTimeError(1.2762543s)

details = '''panicked at 'failed to calculate mempool broadcast RTT: SystemTimeError(1.2762543s)', core\src\pos\mempool\shared_mempool\peer_manager.rs:400:18'''
backtrace = '''
   0:     0x7ff737fa5645 - backtrace::backtrace::trace::hab5abe5046f447b5
   1:     0x7ff737fa4aac - backtrace::capture::Backtrace::new::hd9f1f4afb992e4d5
   2:     0x7ff73781b172 - crash_handler::setup_panic_handler::he3eed2ba07c7a235
   3:     0x7ff7380d6cf6 - std::panicking::rust_panic_with_hook
                               at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a\/library\std\src\panicking.rs:610
   4:     0x7ff7380d6afb - std::panicking::begin_panic_handler::closure$0
                               at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a\/library\std\src\panicking.rs:502
   5:     0x7ff7380d4377 - std::sys_common::backtrace::__rust_end_short_backtrace<std::panicking::begin_panic_handler::closure$0,never$>
                               at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a\/library\std\src\sys_common\backtrace.rs:139
   6:     0x7ff7380d67f9 - std::panicking::begin_panic_handler
                               at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a\/library\std\src\panicking.rs:498
   7:     0x7ff7384c8e10 - core::panicking::panic_fmt
                               at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a\/library\core\src\panicking.rs:116
   8:     0x7ff7384c8f23 - core::result::unwrap_failed
                               at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a\/library\core\src\result.rs:1690
   9:     0x7ff7374fcb6f - cfxcore::pos::mempool::shared_mempool::peer_manager::PeerManager::process_broadcast_ack::h66a5c6263f1cb4c5
  10:     0x7ff7374f5e19 - cfxcore::pos::mempool::shared_mempool::coordinator::coordinator::{{closure}}::h6c1ff8196b71855b
  11:     0x7ff737543216 - std::panicking::try::hd909c3032f511b0c
  12:     0x7ff73776aca6 - tokio::runtime::task::harness::Harness<T,S>::complete::hf2bbf17ca3ded03d
  13:     0x7ff73775b7ee - tokio::runtime::task::harness::Harness<T,S>::poll::h0348d72954fb7fe3
  14:     0x7ff7379a174f - std::thread::local::LocalKey<T>::with::h1b1b4832535dd8eb
  15:     0x7ff7379a0508 - tokio::runtime::thread_pool::worker::Context::run::h1871366c06b8b19b
  16:     0x7ff73799f313 - tokio::runtime::thread_pool::worker::Context::run::h1871366c06b8b19b
  17:     0x7ff737997b08 - tokio::macros::scoped_tls::ScopedKey<T>::set::h72c7679a82ac49e7
  18:     0x7ff73799ee3a - tokio::runtime::thread_pool::worker::run::he96293bdc96c9c85
  19:     0x7ff7379a25d5 - tokio::runtime::task::core::CoreStage<T>::poll::hfebd390d78b509ef
  20:     0x7ff7379a6036 - std::panicking::try::h2cdfe9794da6da4e
  21:     0x7ff7379a4150 - tokio::runtime::task::harness::Harness<T,S>::poll::h32aca2917e8ece97
  22:     0x7ff737994efc - tokio::runtime::blocking::pool::Inner::run::h50dc8a99eae64ddb
  23:     0x7ff737990855 - std::sys_common::backtrace::__rust_begin_short_backtrace::hd7f858c23b97e5cf
  24:     0x7ff7379a1203 - <&T as core::fmt::Debug>::fmt::hd9ffef8910ae9eb8
  25:     0x7ff7380dd69c - alloc::boxed::impl$44::call_once
                               at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a\library\alloc\src\boxed.rs:1854
  26:     0x7ff7380dd69c - alloc::boxed::impl$44::call_once
                               at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a\library\alloc\src\boxed.rs:1854
  27:     0x7ff7380dd69c - std::sys::windows::thread::impl$0::new::thread_start
                               at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a\/library\std\src\sys\windows\thread.rs:58
  28:     0x7ffc35637034 - BaseThreadInitThunk
  29:     0x7ffc36822651 - RtlUserThreadStart

此错误是系统API返回的系统时间往回跳导致,建议及时同步时间,避免系统时间误差扩大。

节点运行问题

PoS 节点运行问题

运行 PoS 节点,如何使用原有节点的账户

把原有节点的 pos_config 下的 pos_key 文件复制过来即可.

101 FAQs

Conflux 基本概念相关问题

101 FAQs

性能相关FAQs

Conflux TPS 能到多少?

普通 CFX 转账 TPS 可达到 3000,ERC20 token 转账可达到 1000,如果交易涉及到合约操作,具体 TPS 跟合约执行复杂度有关。

Conflux 网络平均一秒产生 2 个 block,每个区块的 gasLimit 上限为 3000w。

101 FAQs

TX FAQs

单笔交易数据大小的上限为多少?

单笔交易数据的最大值为 200k

单笔交易燃气(gas)的上限为多少?

单笔交易燃气(gas)上限为 1500w

交易发出后能取消掉么?

区块链中发出的交易没法取消,如果交易还未被打包,可使用相同的 nonce,并提高 gasPrice 新发送一笔交易来覆盖到原始交易,通过此方式,可达到取消交易的效果。

为什么交易发出之后,在 ConfluxScan 查看交易为 not found

此种情况大概率为网络交易比较拥堵,且交易未满足打包条件或 gasPrice 较低,交易被 GC 掉了。此种情况可尝试重发交易

Conflux 交易确认时间为多久

通常 Conflux 的交易经过 50-100 个 Epoch 可以被确认。平均一个 Epoch 1s 。

交易的燃气费是如何收取的?交易的燃气费是如何计算的?

交易的燃气费计算规则为 gas * gasPrice, gasPrice 的单位为 Drip。通常交易 gas 设定值比实际使用值要大,多余指定的 gas 会返还,但最多只返还 gas 值的四分之一。

交易的存储费如何收取?

交易的存储费收取规则为每占用 1024 字节空间,抵押 1CFX。只对实际占用的空间收取抵押费用,storageLimit 指定多余的部分不收取

单个地址交易有什么数量限制么?

101 FAQs

Sponsor FAQs

生产环境的代付 upperbound一般设置多大 ?

代付设置只要满足大部分交易的 fasFee 即可,交易费计算方式为 gas * gasPrice, 一般交易的 gas 消耗为 2w-100w,最大不会超过 1500w, 燃气费则跟网络状况有关,生产环境建议 gasPrice 为 1GDrip,一般不会超过 1w Gdrip。

所以建议生产环境的 upperBound 设置为 0.005-0.5 CFX.

代付的 CFX 可以退回或取消么?

代付无法自行撤回,但如果有其他用户成为合约新的赞助商,则原有赞助商的剩余代付燃气费,以及所有的存储抵押代付将会退回。

为什么合约设置了代付,但与合约交互的交易没有被赞助, 发送交易时还报错 NotEnoughCash?

交易没有被代付,是因为没有满足代付的条件,可能的情况有三种:

  1. 发送账户没有在代付白名单中
  2. 交易的燃气费超过了代付的 upperbound
  3. 代付的余额不够交易的燃气或存储费用

另外一种情况是如果交易一直处于 Pending 状态,也有可能是交易不满足代付条件导致的.

设置 Sponsor 合约错误

VmError(InternalContract(Zero sponsor balance is not allowed))

此错误为在设置合约 Sponsor 时,没有设置 tx.value 返回的。

交易执行失败常见问题

成功发送并被打包的交易并不一定会执行成功,交易执行有成功,失败,Skip(跳过) 三种情况,通过交易的 status 字段或交易 Receipt 的 outcomeStatus 字段可以判断交易的最终执行结果状态

注意:跟以太坊相反

执行失败的交易,其 receipt 中的 txExecErrorMsg 字段会包含一些执行失败的原因或错误信息

可能的错误消息类型

VmError(OutOfGas)

交易所指定的 gas 小余交易执行实际所用的 gas 数量,因而失败。

VmError(ExceedStorageLimit)

交易所指定的 storageLimit 小余交易执行实际所占用的存储空间,因而失败。

NotEnoughCash

交易发送账户余额不够,导致交易执行失败

Vm reverted, xxxx

合约执行失败,一般是没有通过合约的 require 检查语句,require 语句的错误 message 会被包含在此种错误信息里

VmError(BadInstruction

合约部署交易的 data 设置错误,可能是构造函数参数没有正确设置导致

Vm reverted,

合约执行失败,但合约没有提供详细的失败信息

错误消息 changlog

Error message changed since v1.1.4

Trace returnData

除了 receipt 的 txExecErrorMsg 字段,还可以通过 transaction 的 trace 了解交易执行失败的原因。 如果某个 trace 的类型是 call/create result 并且其 outcomefail 则 trace 的 returnData 即是合约执行失败的错误信息(hex 编码的)

合约常见问题

合约交互 Vm reverted 错误

在跟合约交互时可能会碰到如下错误:

transaction is reverted. Innermost error is at CFXTEST:TYPE.CONTRACT:ACEJ04GJ99EM49UG52E662HU5PFUAEGBDJ3YJJEMYN: Vm reverted. ., data = "CFXTEST:TYPE.CONTRACT:ACEJ04GJ99EM49UG52E662HU5PFUAEGBDJ3YJJEMYN: Vm reverted.

通常可能有两种可能

  1. solidity 的执行逻辑或检查逻辑失败,包括:交易 calldata ABI 编码错误,调用了不存在的函数,合约内部调用了不存在的合约,向不 payable 的函数转账等。
  2. solidity 代码中 require 函数检查失败,没有错误消息,如:require(msg.sender == owner);

Common RPC errors

cfx_getEpochNumber

-32016 Error processing request: block_number is missing for best_hash

遇到此错误,表示节点最新的区块数据未准备好,此错误可直接忽略,直接重新请求即可.

RlpExpectedToBeList

Rlp 编码错误,如果是与 eSpace 交互,碰到此问题,可能你发送的交易格式为 1559,目前 eSpace 只支持 155 格式交易

{"code":-32602,"message":"Invalid parameters: raw","data":"\"RlpExpectedToBeList\""}