我理解智能契约被转换为字节码,并存储在块链中的一个块上。Smart合同可以与Kickstarter类似地使用。一个项目团队可能会设定一个资金目标,只有当赞助者捐出足够的钱来达到这个目标时,这个目标才会被支付。
但是,聪明的合同是如何知道什么时候支付给项目团队的?块的散列根据其数据变化很大。因此,跟踪块内的捐赠量和事务ID是不可能的,因为这会更改块的散列。因此,聪明的合同如何知道有多少钱已经得到了资助,以及它如何记得捐款到哪里,如果没有达到资助的目标?
有一个分类账(或区块链)和一个状态数据库是真的吗?如果是这样的话,我假设我们在状态数据库中存储与智能契约相关的值。
发布于 2021-05-18 13:14:48
智能契约的字节码在事务中发布(在块中挖掘),然后存储在与地址关联的网络存储(通常是Ethereum或Binance智能链)中。
因此,每次与智能契约交互时,您都要与与包含字节码的存储块关联的地址进行交互。此外,字节码指向存储其变量值的其他存储槽。
所有状态更改(包括存储值的更改)都是分类帐数据库的一部分。原始块链数据只包含状态更改(不包含当前状态),但大多数较高层默认返回当前状态(您仍然可以选择获取旧状态,例如"defaultBlock“param 这里)。有些层甚至不允许访问以前的状态(例如,用于编写智能契约的和Vyper语言--您可以将此代码编译到字节码中)。
但是,聪明的合同是如何知道什么时候支付给项目团队的?
智能契约可以访问任何地址的当前余额,包括它自己的地址。它还可以有一个包含供资目标的变量。比较这两个值可以告诉您目标是否已经实现,以及智能合同是否应该支付项目团队的费用。
但是,智能契约目前没有任何本机定时器(如cron作业)或事件处理程序--在将事务发送到智能契约的地址后执行函数(事务的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 {}
}https://stackoverflow.com/questions/67585765
复制相似问题