如果智能合约存储在区块链中的区块上,其状态如何更新



我知道智能合约被转换成字节码并存储在区块链中的一个块上。智能合约的使用方式与Kickstarter类似。项目团队可能会设定一个资金目标,只有当支持者捐赠足够的资金来实现这个目标时,才会支付。

但智能合约如何知道何时向项目团队付款?块的哈希值会根据其数据而剧烈变化。因此,跟踪区块内的捐赠金额和交易ID应该是不可能的,因为这会改变区块的哈希。因此,智能合约如何知道已经获得了多少资金,以及如果没有达到资金目标,它如何记得将资金捐赠给哪里?

真的有账本(或区块链(和国家数据库吗?如果是这样的话,我假设我们将与智能合约相关联的值存储在状态数据库中。

智能合约的字节码在交易中发布(在区块中挖掘(,然后存储在与地址相关的网络存储中(通常是以太坊或币安智能链(。

因此,每次与智能合约交互时,都会与一个地址交互,该地址与包含字节码的存储块相关联。另外,字节码指向存储其变量值的其他存储槽。

所有状态更改(包括存储值的更改(都是分类帐数据库的一部分。原始区块链数据只包含状态变化(而不是当前状态(,但大多数更高层默认返回当前状态(您仍然可以选择获取较旧的状态,例如此处的"defaultBlock"参数(。有些层甚至不允许访问以前的状态(例如,用于编写智能合约的Solidity和Vyper语言-您可以将此代码编译为字节码(。


但是智能合约如何知道何时向项目团队付款

智能合约可以访问任何地址的当前余额,包括它自己的地址。它也可以有一个包含资金目标的变量。比较这两个值告诉你目标是否已经实现,智能合同是否应该支付项目团队。

然而,智能合约目前没有任何本地定时器(如cronjobs(或事件处理程序,并且函数是在事务发送到智能合约地址后执行的(事务的data字段说明要执行的函数和传递的参数(。

因此,您需要手动发送交易(执行withdraw()函数(或使用一些链外工具(可以查看当前余额,然后为您发送执行函数的交易(。

pragma solidity ^0.8;
contract MyContract {
uint256 constant FUNDING_GOAL = 1 ether;
address constant TEAM_ADDRESS = address(0x123);
/**
* Throws if the current balance is lower than the goal
* Otherwise sends all of the current balance to the predefined address
*
* Need to send transaction with correct value of the `data` field
* to execute this `withdraw()` function.
* Most client apps generate the correct value of `data` field for you
* after selecting the function name and specifying argument values.
*/
function withdraw() external {
require(address(this).balance >= FUNDING_GOAL, 'Haven't reached the funding goal');
payable(TEAM_ADDRESS).transfer(address(this).balance);
}

/**
* Allows this contract to receive native currency of the network (usually ETH or BNB)
*/
receive() external payable {}
}

相关内容

  • 没有找到相关文章

最新更新