首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果智能契约存储在区块链中的块上,它的状态如何更新?

如果智能契约存储在区块链中的块上,它的状态如何更新?
EN

Stack Overflow用户
提问于 2021-05-18 12:01:48
回答 1查看 2.2K关注 0票数 1

我理解智能契约被转换为字节码,并存储在块链中的一个块上。Smart合同可以与Kickstarter类似地使用。一个项目团队可能会设定一个资金目标,只有当赞助者捐出足够的钱来达到这个目标时,这个目标才会被支付。

但是,聪明的合同是如何知道什么时候支付给项目团队的?块的散列根据其数据变化很大。因此,跟踪块内的捐赠量和事务ID是不可能的,因为这会更改块的散列。因此,聪明的合同如何知道有多少钱已经得到了资助,以及它如何记得捐款到哪里,如果没有达到资助的目标?

有一个分类账(或区块链)和一个状态数据库是真的吗?如果是这样的话,我假设我们在状态数据库中存储与智能契约相关的值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-18 13:14:48

智能契约的字节码在事务中发布(在块中挖掘),然后存储在与地址关联的网络存储(通常是Ethereum或Binance智能链)中。

因此,每次与智能契约交互时,您都要与与包含字节码的存储块关联的地址进行交互。此外,字节码指向存储其变量值的其他存储槽。

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

但是,聪明的合同是如何知道什么时候支付给项目团队的?

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

但是,智能契约目前没有任何本机定时器(如cron作业)或事件处理程序--在将事务发送到智能契约的地址后执行函数(事务的data字段指定要执行的函数以及传递的参数)。

因此,您需要手动发送事务(执行withdraw()函数),或者使用一些离链工具(该工具可以监视当前余额,然后为您发送执行该函数的事务)。

代码语言:javascript
复制
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 {}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67585765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档