您正在查看: EOS 分类下的文章

获取交易到不可逆的时间

需求

根据交易id(transaction_id)获取交易预计到达不可逆的时间。

方案

当push_transaction 无异常后,会得到 trx_id,以及status状态为executed (状态讲解),以及必须校验此状态,防止(hard_fail 状态攻击)。

"receipt": {
      "status": "executed",
      "cpu_usage_us": 1260,
      "net_usage_words": 18
    },

先通过get_info 获取返回参数中的last_irreversible_block,
再请求接口 POST /v1/history/get_transaction 查询当前的transaction_id(如果此时未能查到,则表示交易被丢弃,交易失败),获取返回参数中 block_num。
用block_num 减去last_irreversible_block获得差值,并用差值乘以0.5s(单出块时间),即可预计(忽略get_info和get_transaction的请求时间差)计算出当前交易预计达到不可逆的时间。

备注

最好在交易发起6s+后获取计算的差值,因为超过6s(BP交替出块)后交易被回滚的几率会很小,当然如果长时间停留在等待页面,期间最好在再做定时时间刷新计算,避免交易已回滚,不必要的等待。

eos Transact Without Broadcast

https://github.com/EOSIO/eosjs/blob/849c03992e6ce3cb4b6a11bf18ab17b62136e5c9/src/tests/web.html#L144

     const transactWithoutBroadcast = async () => await api.transact({
            actions: [{
                    account: 'eosio.token',
                    name: 'transfer',
                    authorization: [{
                        actor: 'bob',
                        permission: 'active',
                    }],
                    data: {
                        from: 'bob',
                        to: 'alice',
                        quantity: '0.0001 SYS',
                        memo: '',
                    },
                }]
            }, {
                broadcast: false,
                blocksBehind: 3,
                expireSeconds: 30,
            });


            const testTransactWithoutBroadcast = async (e) => {
                resultsLabel = e.target;
                resultsLabel.innerText = EXECUTING;

                try {
                    transactionSignatures = await transactWithoutBroadcast();
                } catch (error) {
                    resultsLabel.className = 'failed';
                    resultsLabel.innerText = FAILED;
                    console.error('Transact without Broadcast Test Failure: ', error.message);
                    return false;
                }

                if(transactionSignatures.signatures && transactionSignatures.serializedTransaction) {
                    resultsLabel.className = "success";
                    resultsLabel.innerText = SUCCESS;
                    return true;
                }
                resultsLabel.className = 'failed';
                resultsLabel.innerText = FAILED;
                return false;
            };

transaction_trace 中的 account_ram_delta

transaction_trace具有新的可选字段account_ram_delta,如果存在,则记录支付用于存储延迟交易的特定账户的RAM使用增量:输入延迟交易将具有account_ram_delta记录该交易的第一授权者的RAM使用增加的字段。当延迟交易退出(无论哪个状态)该account_ram_delta字段将存在时记录延期交易的付款人的RAM使用减少。

参考

https://github.com/EOSIO/eos/issues/6897

EOSjs getTableRows lower and upper bound on account name

try {  
      let con_account = 'bcskillsurou';
      const encodedName = new BigNumber(Eos.modules.format.encodeName("bcskillsurou", false))
      console.log(encodedName);
      console.log(await rpc.get_table_rows(
      {
        code:con_account,
        scope:con_account,
        table:"accounttb",
        lower_bound: encodedName,
      }));

    } catch (e) {
      console.log( '\nCaught exception: ' + e);
      if (e instanceof eosjs_jsonrpc.RpcError)
        console.log( '\n\n' + JSON.stringify(e.json, null, 2));
    }

参考

https://eosio.stackexchange.com/questions/813/eosjs-gettablerows-lower-and-upper-bound-on-account-name
issue: https://github.com/EOSIO/eosjs/issues/456

checksum256 secondary index to get table rows

进一步解释了如何通过cleos传递的值。正如原帖中已经提到的,这一切都围绕着字节顺序。由于某种原因,该checksum256值以不同的endian返回到索引键类型所sha256期望的范围。

如果您checksum256在表中的行中返回以下hash():

7af12386a82b6337d6b1e4c6a1119e29bb03e6209aa03c70ed3efbb9b74a290c

它首先分为两部分(每边16个字节):

7af12386a82b6337d6b1e4c6a1119e29 bb03e6209aa03c70ed3efbb9b74a290c

然后使用第一部分作为示例,以2个字符(1个字节)块反转每个部分:

7af12386a82b6337d6b1e4c6a1119e29

7a f1 23 86 a8 2b 63 37 d6 b1 e4 c6 a1 11 9e 29

29 9e 11 a1 c6 e4 b1 d6 37 63 2b a8 86 23 f1 7a

然后连接两个反转部分以形成可以与sha256索引键类型一起使用的值:

299e11a1c6e4b1d637632ba88623f17a 0c294ab7b9fb3eed703ca09a20e603bb

最终结果:

299e11a1c6e4b1d637632ba88623f17a0c294ab7b9fb3eed703ca09a20e603bb

参考

https://eosio.stackexchange.com/questions/4116/how-to-use-checksum256-secondary-index-to-get-table-rows
https://github.com/EOSIO/eos/issues/6648
https://github.com/EOSIO/eos/pull/6591