了解区块链智能合约
Understanding Blockchain smart contract
通过在互联网上学习并向 stake overflow 提出问题,我了解了区块链和比特币的一些基础知识。 区块链:它是一个分布式数据库,记录保存并共享给所有连接的节点。每个交易块都有其前一个块的哈希值,因此它不受回火影响。通过一些共识机制添加块。区块一旦加入链中,就无法删除。
Bitcoin: Bitcoin is a cryptocurrency implemented over blockchain technology. It is also the first successful implementation of
blockchain technology. The flow of Bitcoin transaction is like below-
连接到比特币区块链网络的任何节点都可以生成传播到所有连接节点的交易。由于每个节点都有所有以前的记录,因此每个节点首先验证交易与发送者和接收者的交易历史记录。
- 在某个时间点,节点试图用所有
使用 PoW 共识机制的未决交易。
- 这里共识机制的难点在于找到hash
具有多个前导零的 to 块。
- 如果节点在散列中获得目标数量的前导零,
该节点的块将被添加到区块链中。然后是其他节点
将验证此块。
- 最终将被添加到比特币区块链数据库中。
然后类似的工作将继续添加下一个块。
我无法理解智能合约如何在区块链上运行。我知道在智能合约中,每笔交易都是一种计算机 script/program(例如,如果有某些条件,则执行某事)。但是计算机程序是如何执行的呢?交易如何得到验证?以及如何达成共识?我还没弄明白所有这些问题。
It would be great if anyone can explain smart contract the way I understood Bitcoin blockchain as explained above.
您应该对第一个具有智能合约的区块链以太坊进行更多研究。
将这些合同视为条件或服务级别协议。假设你和我正在做生意,如果我不遵守我的协议,资金就会退还给你。否则,处理交易。
这可以通过以太坊虚拟机 (EVM) 实现。这是以太坊昂贵的另一个原因,因为链上的每个区块都有一些在虚拟环境中执行的代码。
一个适合您的项目是构建您自己的区块链并使用 Solidity 创建智能合约。 Solidity 是以太坊上使智能合约成为可能的编程语言。
不要使用比特币作为参考来弄清楚智能合约是什么以及它们如何包含在区块链中。这不是比特币的目的,因此要真正理解智能合约的集成,将缺少几个部分。
很抱歉没有直接关注你的问题,我只是认为需要更详细的解释才能真正理解如何包含/执行智能合约。
既然你问的是智能合约,那么让我们以以太坊的实际例子来解释它们是如何包含在区块链中以及如何与它们交互的。 (主要思想与其他智能合约区块链类似)
让我们从区分两种类型的以太坊账户开始:
- 外部账户 (EOA)
- 合约账户 (CA)
外部账户:
EOA 是您在比特币中已经知道的,持有私钥和 public 地址的用户。 EOA 是自主的/主动的(您可以随时决定对您的帐户执行某些操作)。
EOA 可以发送 public 交易,因为它可以用自己的私钥对其进行签名。
合约账户:
CA 没有私钥,只有一个 public 地址,因为您必须能够在区块链上唯一识别智能合约。 CA 只是反应性的(CA 帐户操作将始终是 EOA 操作的结果)。
CA 帐户无法像 EOA 那样发送 public 交易,因为它无法使用 public 密钥看到它,因为它没有密钥。
在以太坊中有账户状态的概念。
基本上是从地址(EOA 和 CA)到特定状态的映射。
特定账户的状态包含余额和随机数(该账户创建的交易/合约数量)等信息,对于 CA,这是用代码哈希和存储哈希扩展的。
一笔交易可以是:
- 智能合约创建
- a value/data从账户A转账到账户B。
智能合约创建:
这笔交易没有具体的收款地址。
它包括 'data' 字段中包含智能合约代码的数据。
只要此交易包含在一个区块中并达成共识,区块链状态就会更新以说明新的智能合约。
EOA 地址将确定性地提供给您的智能合约(请参阅 this thread 了解如何完成),并在包含合约代码的智能合约的帐户状态中添加新映射.您现在可以将转账交易发送到您的智能合约地址。
Value/Data从A账户转账到B账户
现在假设您想调用智能合约的方法“setName”。
您或任何人都可以从您的帐户地址 (A) 向智能合约地址 (B) 发送交易,并在 'data' 字段中提供相关信息(调用哪个方法、参数等)
执行本身将在以太坊虚拟机 (EVM) 中进行,您的合约代码将在该虚拟机中被解释并记录帐户状态的任何更改。
考虑到所有这些,我想您的问题的答案会更清楚:
但是计算机程序是如何执行的?
它在节点上的 EVM 内部执行。此执行将在调用智能合约的 EOA 交易中找到它的起源。执行的结果是账户状态的变化。
如何验证交易?
智能合约不能发布交易,因为它们被引用为 CA 帐户。创建或调用智能合约的原始 EOA 交易与任何其他交易一样被验证并提交给区块链的正常共识方案。
混淆可能是因为智能合约可以将资金发送到另一个地址(EOA 或 CA),但它们不会以 public 交易的形式发送。
这是可能的,因为智能合约是确定性的,因此如果你有区块链,你就可以在区块链中以交易的形式进行所有智能合约的创建和智能合约调用,并且在 EVM 中执行智能合约可以改变帐户状态。因此,如果您在 EVM 执行期间将资金从(账户 A - EOA)发送到(账户 B - CA),然后再将资金转发到(账户 C - EOA 或 CA),它会被记录下来并可重放,因为一切都是确定性的。
因此,如果智能合约做了一些非法的事情(花费超过其余额),触发它的原始交易是无效的。
如何达成共识?
智能合约行为没有明确的共识,它只直接涉及区块和交易。
虽然整个答案非常针对以太坊,但我希望它能让您更好地了解智能合约在区块链系统中的集成。
通过在互联网上学习并向 stake overflow 提出问题,我了解了区块链和比特币的一些基础知识。 区块链:它是一个分布式数据库,记录保存并共享给所有连接的节点。每个交易块都有其前一个块的哈希值,因此它不受回火影响。通过一些共识机制添加块。区块一旦加入链中,就无法删除。
Bitcoin: Bitcoin is a cryptocurrency implemented over blockchain technology. It is also the first successful implementation of blockchain technology. The flow of Bitcoin transaction is like below-
连接到比特币区块链网络的任何节点都可以生成传播到所有连接节点的交易。由于每个节点都有所有以前的记录,因此每个节点首先验证交易与发送者和接收者的交易历史记录。
- 在某个时间点,节点试图用所有 使用 PoW 共识机制的未决交易。
- 这里共识机制的难点在于找到hash 具有多个前导零的 to 块。
- 如果节点在散列中获得目标数量的前导零, 该节点的块将被添加到区块链中。然后是其他节点 将验证此块。
- 最终将被添加到比特币区块链数据库中。 然后类似的工作将继续添加下一个块。
我无法理解智能合约如何在区块链上运行。我知道在智能合约中,每笔交易都是一种计算机 script/program(例如,如果有某些条件,则执行某事)。但是计算机程序是如何执行的呢?交易如何得到验证?以及如何达成共识?我还没弄明白所有这些问题。
It would be great if anyone can explain smart contract the way I understood Bitcoin blockchain as explained above.
您应该对第一个具有智能合约的区块链以太坊进行更多研究。
将这些合同视为条件或服务级别协议。假设你和我正在做生意,如果我不遵守我的协议,资金就会退还给你。否则,处理交易。
这可以通过以太坊虚拟机 (EVM) 实现。这是以太坊昂贵的另一个原因,因为链上的每个区块都有一些在虚拟环境中执行的代码。
一个适合您的项目是构建您自己的区块链并使用 Solidity 创建智能合约。 Solidity 是以太坊上使智能合约成为可能的编程语言。
不要使用比特币作为参考来弄清楚智能合约是什么以及它们如何包含在区块链中。这不是比特币的目的,因此要真正理解智能合约的集成,将缺少几个部分。
很抱歉没有直接关注你的问题,我只是认为需要更详细的解释才能真正理解如何包含/执行智能合约。
既然你问的是智能合约,那么让我们以以太坊的实际例子来解释它们是如何包含在区块链中以及如何与它们交互的。 (主要思想与其他智能合约区块链类似)
让我们从区分两种类型的以太坊账户开始:
- 外部账户 (EOA)
- 合约账户 (CA)
外部账户:
EOA 是您在比特币中已经知道的,持有私钥和 public 地址的用户。 EOA 是自主的/主动的(您可以随时决定对您的帐户执行某些操作)。
EOA 可以发送 public 交易,因为它可以用自己的私钥对其进行签名。
合约账户:
CA 没有私钥,只有一个 public 地址,因为您必须能够在区块链上唯一识别智能合约。 CA 只是反应性的(CA 帐户操作将始终是 EOA 操作的结果)。
CA 帐户无法像 EOA 那样发送 public 交易,因为它无法使用 public 密钥看到它,因为它没有密钥。
在以太坊中有账户状态的概念。
基本上是从地址(EOA 和 CA)到特定状态的映射。
特定账户的状态包含余额和随机数(该账户创建的交易/合约数量)等信息,对于 CA,这是用代码哈希和存储哈希扩展的。
一笔交易可以是:
- 智能合约创建
- a value/data从账户A转账到账户B。
智能合约创建:
这笔交易没有具体的收款地址。 它包括 'data' 字段中包含智能合约代码的数据。 只要此交易包含在一个区块中并达成共识,区块链状态就会更新以说明新的智能合约。
EOA 地址将确定性地提供给您的智能合约(请参阅 this thread 了解如何完成),并在包含合约代码的智能合约的帐户状态中添加新映射.您现在可以将转账交易发送到您的智能合约地址。
Value/Data从A账户转账到B账户
现在假设您想调用智能合约的方法“setName”。 您或任何人都可以从您的帐户地址 (A) 向智能合约地址 (B) 发送交易,并在 'data' 字段中提供相关信息(调用哪个方法、参数等)
执行本身将在以太坊虚拟机 (EVM) 中进行,您的合约代码将在该虚拟机中被解释并记录帐户状态的任何更改。
考虑到所有这些,我想您的问题的答案会更清楚:
但是计算机程序是如何执行的?
它在节点上的 EVM 内部执行。此执行将在调用智能合约的 EOA 交易中找到它的起源。执行的结果是账户状态的变化。
如何验证交易?
智能合约不能发布交易,因为它们被引用为 CA 帐户。创建或调用智能合约的原始 EOA 交易与任何其他交易一样被验证并提交给区块链的正常共识方案。
混淆可能是因为智能合约可以将资金发送到另一个地址(EOA 或 CA),但它们不会以 public 交易的形式发送。
这是可能的,因为智能合约是确定性的,因此如果你有区块链,你就可以在区块链中以交易的形式进行所有智能合约的创建和智能合约调用,并且在 EVM 中执行智能合约可以改变帐户状态。因此,如果您在 EVM 执行期间将资金从(账户 A - EOA)发送到(账户 B - CA),然后再将资金转发到(账户 C - EOA 或 CA),它会被记录下来并可重放,因为一切都是确定性的。
因此,如果智能合约做了一些非法的事情(花费超过其余额),触发它的原始交易是无效的。
如何达成共识?
智能合约行为没有明确的共识,它只直接涉及区块和交易。
虽然整个答案非常针对以太坊,但我希望它能让您更好地了解智能合约在区块链系统中的集成。