谁在以太坊中运行智能合约?

who runs the smart contract in ethereum?

我是智能合约的新手。我想知道谁在管理智能联系人。

  1. 我认为服务于 http rpc 端点的完整节点运行节点接收到的智能合约。

    然而,solidity 支持像 block.coinbaseblock.timestampblock.difficulty 这样的块属性。如果只是全节点而不是矿工运行合约,我认为这是不可能的。然后区块创建者运行所有在开采区块中的智能合约执行交易?

  2. 如果矿工运行智能合约,矿工会不会污染区块的时间戳?

智能合约已部署,然后可在其地址的区块链上使用。

“运行”智能合约的人是合约函数的调用者。 发送消息、与合约交互并发送 ETH 的人。 它在称为“msg.sender”的合同中 可以是地址账户,也可以是合约账户(合约可以调用别人的合约函数)

block.coinbase、block.timestamp、block.difficulty只是调用时引用当前区块的信息。

交易

调用的合约函数

多个实体运行合约代码

  1. 首先,所有矿工都试图生成一个包含与该合约交互的交易的区块。为了计算交易导致的状态变化(包含在区块中),矿工需要执行该函数。

    只有获胜的矿工将这些状态变化包含在他们的区块中并广播该区块。如此有效,从外部视图,您看到函数只执行了一次。

    这些 block.* 全局变量的值是获胜矿工元数据的值。如果不同的矿工发布了该区块,其中一些值(例如 coinbasetimestamp)将会不同。

    If miner runs smart contracts, can miner pollute timestamp of block?

    是的,他们可以选择在几秒钟内操纵整个区块的时间戳(也影响区块中的其他交易)。或者他们可以选择将交易包含在以后的任意块号中,或者根本不包含它。

  2. 然后,所有验证者节点执行相同的函数来验证它们是否得到与矿工相同的结果。由于他们是验证者,他们不会注入自己的元数据并根据已发布的块数据进行验证 - 例如块中发布的 block.coinbase 地址。


调用调用的合约函数

只有执行调用的节点才会调用函数。由于调用是 read-only,它们不能产生任何状态变化,因此节点仅从其本地区块链副本读取数据。

示例:Web 应用程序连接到节点,并要求节点执行调用。只有这个节点执行调用并将 returns 响应返回到 Web 应用程序。不涉及其他节点。