我试图从理论上分析由多个函数组成的算法形式的智能契约的预期性能。
衡量内部功能性能的最佳方法是什么?
有人认为,测量气体的量是最好的解决办法。然而,衡量天然气成本取决于守则,需要实际执行smart合同。一些开发人员可能以比其他开发人员更好的方式执行合同。因此,这可能不太准确。
另一方面,其他人建议用大O表示法来表示计算的复杂性。然而,Big符号通常用于可能需要大量时间的复杂程序。
什么是更好的方法,为什么?
发布于 2018-08-09 19:17:08
在我看来,测量区块链上计算效率的唯一方法是使用气体。不存在“更快”或“较慢”运行合同的概念,因为事务的执行间隔是离散的(当一个块被挖掘时)。
如果算法比较复杂,并且具有较大的大O复杂度,它的复杂性将以更高的气体成本来执行函数的形式表现出来。
然而,很难从理论上衡量假想的smart合同的天然气成本。正如您所提到的,人们可能以不同的方式执行合同。程序员可以采用很多节气行为,但也有很多鼓励用户安全的“最佳实践”。这些安全措施可能会增加额外的功能和检查,从而导致合同的天然气成本上升。
此外,即使给特定合同提供了访问完整源代码的权限,也很难确定任何特定事务所需的气体,因为许多合同的行为可能因合同状态而异。例如,当用户与合同交互时,用户1-99的气体成本都与X相同。然而,用户100可能在合同中触发一些基于状态的操作,导致他们执行更多操作,并导致他们的气体成本为2X。
对于同一契约的多个事务的操作顺序将是非常不可预测的,因为它取决于大量的随机因素,如在网络中传播事务、查找正确哈希的矿工的随机性、将事务打包到块中的顺序等等。
你可能能做的最好的事情是查看特定的功能,将其分解成不同的组成部分和可能的状态,并使用“以太黄纸”第25页开始的详细信息来估算气体成本:
发布于 2018-08-09 19:24:45
进行实证分析,并与其他合同(样本)进行比较。你能得到的最精确的测量。
在core/state_transition.go中,修改TransitionDb()函数以捕获当前时间,然后执行合同后的时间与时间不同。这些是您必须修改的行:
if contractCreation {
ret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, st.value)
} else {
// Increment the nonce for the next transaction
st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)
ret, st.gas, vmerr = evm.Call(sender, st.to(), st.data, st.gas, st.value)
}这就是你花时间的方式:
start_ts:=time.Now().UnixNano() / int64(time.Millisecond)
if contractCreation {
ret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, st.value)
} else {
// Increment the nonce for the next transaction
st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)
ret, st.gas, vmerr = evm.Call(sender, st.to(), st.data, st.gas, st.value)
}
end_ts:=time.Now().UnixNano() / int64(time.Millisecond)
log.Info(fmt.Sprintf("Call() time: %v ms",(end_ts-start_ts)))上述代码还没有经过测试。
https://ethereum.stackexchange.com/questions/56211
复制相似问题