不要将比特币用作了解智能合约是什么以及它们如何包含在区块链中的参考。这不是比特币的目的,所以要真正理解智能合约的集成,会缺少几个部分。
很抱歉没有直接回答你的问题,我只是认为需要更详细的解释才能真正理解智能合约是如何包含/执行的。
当您询问智能合约时,让我们以以太坊的实际示例来解释它们如何包含在区块链中以及如何与它们交互。 (主要思想与其他智能合约区块链类似)
Accounts :
让我们从区分两种类型的以太坊账户开始:
外部拥有的帐户:
EOA 是您在比特币中已经知道的,即持有私钥和公共地址的用户。 EOA 是自主/主动的(您可以随时决定对您的帐户进行某些操作)。
EOA 可以发送公共交易,因为它可以使用其私钥对其进行签名。
合约账户:
CA 没有私钥,只有公共地址,因为您必须能够唯一标识区块链上的智能合约。 CA 仅是被动的(CA 帐户操作将始终是 EOA 操作的结果)。
CA 帐户无法像 EOA 那样发送公共交易,因为它没有公钥,因此无法使用公钥查看它。
在以太坊中存在这种账户状态的概念。
基本上是从地址(EOA 和 CA)到特定状态的映射。
特定账户的状态包含诸如余额和随机数(该账户创建的交易/合约的数量)等信息,对于 CA,这通过代码散列和存储散列进行扩展。
Transactions
交易可以是:
- 智能合约创建
- 从账户 A 到账户 B 的价值/数据传输。
智能合约创建:
此交易没有具体的收款地址。
它在“数据”字段中包含包含智能合约代码的数据。
只要此交易包含在区块中并达成共识,区块链状态就会更新以适应新的智能合约。
将确定性地为您的智能合约提供一个 EOA 地址(请参阅this thread 了解有关如何完成的说明),并在包含合约代码的智能合约的帐户状态中添加一个新映射。您现在可以将转账交易发送到您的智能合约地址。
价值/数据从账户 A 转移到账户 B。
现在假设您要调用智能合约的方法“setName”。
您或任何人都可以将交易从您的账户地址 (A) 发送到智能合约地址 (B),并在“数据”字段中提供相关信息(调用哪个方法、参数等)。
执行本身将在以太坊虚拟机 (EVM) 中进行,您的合约代码将在该虚拟机中进行解释,并记录对帐户状态的任何更改。
考虑到所有这些,我想你的问题的答案会更清楚:
但是计算机程序是如何被执行的呢?
它在节点上的 EVM 内执行。此执行将在调用智能合约的 EOA 交易中找到它的起源。执行的结果是账户状态的变化。
如何验证交易?
智能合约不能发出交易,因为它们被称为 CA 账户。创建或调用智能合约的原始 EOA 交易与任何其他交易一样经过验证,并提交给区块链的正常共识方案。
混淆可能来自这样一个事实,即智能合约可以将资金发送到另一个地址(EOA 或 CA),但它们不会以公开交易的形式这样做。
这是可能的,因为智能合约是确定性的,因此,如果您拥有区块链,您将拥有所有的智能合约创建和智能合约调用,以交易形式在区块链中进行,并且在 EVM 中执行智能合约可以更改账户状态。因此,如果您在执行期间将资金从(账户 A - EOA)发送到(账户 B - CA)并转发到 EVM 内的(账户 C - EOA 或 CA),它会被记录并重放,因为一切都是确定性的。
因此,如果智能合约做了非法的事情(花费超过其余额),那么触发它的原始交易是无效的。
如何达成共识?
对于智能合约的行为没有明确的共识,它只直接涉及区块和交易。
虽然整个答案都是针对以太坊的,但我希望它能让您更好地了解智能合约在区块链系统中的集成。