区块链智能合约查看函数执行时长

区块链智能合约solidity怎么查看执行函数所花费的时间呀?尝试使用在函数开始前后分别获取block.timestamp,但是他们的返回结果都是相同的,所以,请问一下怎么获取函数执行所花费时长呀?例如获知执行函数_revokeRole()所消耗的时间

function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }

其实还是以调用合约函数执行后的最终时间为我指的是外部调用合约和执行完的最终时间

Solidity 中可以使用 gas 和 block.timestamp 来估算函数执行所需的时间和费用,但这些方法并不总是精确的,因为它们受到区块链网络状况、交易池中的交易数量和矿工费用等因素的影响。

为了获取函数执行所花费的时间,你可以使用 Solidity 内置的 gasleft() 函数,该函数返回当前函数执行所剩余的 gas 数量。你可以在函数开始时记录下 gasleft() 的值,在函数结束时再次调用该函数,并计算出两次调用之间的 gas 差值,然后将其转换为时间。

以下是一个示例:

function _revokeRole(address account, bytes32 role) public onlyRole(DEFAULT_ADMIN_ROLE) {
    uint256 gasStart = gasleft();
    
    // 执行函数代码
    
    uint256 gasUsed = gasStart - gasleft();
    uint256 timeElapsed = gasUsed / 20000000000; // 以太坊每秒的 gas 上限为 20 Gwei
    
    emit ExecutionTime(timeElapsed); // 记录函数执行时间
}

在这个示例中,我们使用 gasleft() 函数记录函数开始时剩余的 gas 数量,并在函数结束时再次调用该函数获取剩余的 gas 数量。然后计算两次调用之间的 gas 差值,并将其除以每秒的 gas 上限(20 Gwei)得到函数执行所花费的时间,最后通过 emit 语句记录下来。

需要注意的是,这种方法只是估算函数执行所需时间的一种方式,结果可能会受到多种因素的影响,包括网络状况、硬件性能和矿工费用等。因此,建议在实际应用中进行充分的测试和验证,以确保结果的精确性。