区块链上的所有节点都必须执行每一个智能合约函数cal吗?

Must all nodes on the blockchain execute every smart contract function cal?

我明白为什么以太坊主网上的所有节点必须执行任何智能合约函数调用很重要,这会改变合约或链的内部状态。 (例如,从一个账户转账到另一个ec。)

我想知道的是,如果每个节点都必须执行在任何智能合约上调用的 every 函数,即使该函数不会导致状态更改也是如此.

例如,如果 ERC721 智能合约有一个函数“getName()”,它只是 returns NFT 代表的艺术品的名称,存储在 NFt 中。假设 joe 连接到网络,并希望在合同上执行 getName()。这是否意味着所有 9,000 个节点都以循环执行 getName() 结束,即使 Joe 只需要执行一次? 运行“getName()”的 gas 成本是否补偿了每个节点的 运行“getName()”的开销?如果这是真的(每个节点都得到报酬),随着更多节点加入矿池,gas 会变得更加昂贵吗?

gas 价格高的原因之一是因为每个节点都必须执行智能合约上调用的每个功能的低效率,即使是那些对状态没有影响的功能?

如果是这样的话,在以太坊上执行计算密集型但“纯”(无副作用)的函数似乎是一个非常(也许是不必要的)昂贵的提议,对吗?

谢谢。为这个可能幼稚的问题道歉!

transaction (can make state changes - but doesn't need to), and a call有区别(只读,不能改变状态)


我将从通话开始,因为它更容易。

当一个节点执行调用时,它执行最有可能从存储读取、存储到内存和returns从内存中读取的合约函数。

示例:

string name;

function getName() external view returns (string memory) {
    // reads from storage, stores to memory, returns from memory
    return name;
}

但它不会向其他节点广播任何信息(例如“我刚刚执行了读取操作”)。 IE。其他节点不执行相同的操作。


一个交易在每个节点上执行一次。

string name;

function setName(string memory _name) external {
    // reads from memory, stores to storage
    name = _name;
}

矿工从内存池(等待挖掘的交易列表)中获取交易,在他们的机器上执行它,执行状态更改,并将交易添加到块中(包括预期的状态更改)。

然后所有(验证器)节点下载新块,执行交易,并在其端执行相同的状态更改。如果他们发现自己的状态变化与矿工声明的状态变化之间存在不匹配,他们会将其广播到网络中,并宣布可能是无效区块。


回答您的问题:

Does that mean that all 9,000 nodes end up spinning cycles executing getName(), even though Joe only needs it to be executed once?

如果 Joe 请求调用,getName() 仅在一个节点(Joe 连接到的节点)上执行。如果他请求交易,则在所有节点上执行。

Does the gas cost of running "getName()" compensate each of the nodes for the overhead of running "getName()"?

它只补偿收取交易费用的(获胜)矿工。较大的 tx 费用(ETH 的总量,而不是 gas 价格)补偿了机器需要使用的更多资源(主要是 CPU 时间),与他们可以使用相同的资源。

If that is true (that every node gets paid) will gas get even more expensive as more nodes join the pool?

并不是每个节点都能得到报酬,见上文。

Is one of the reasons gas prices are high is because of the inefficiency of every node having to execute every function called on a smart contract, even those that have no effect on state?

这可能主要是出于经济原因 - 供求关系。越多的人想要尽快执行他们的交易并愿意支付更高的 gas 价格,他们就会将 gas 价格推得越高。可能他们只是使用他们的钱包应用程序推荐的价格,这可能高于平均水平。