我有一个问题,就是同时要求订立一项明智的合约。如果有两个用户调用一个智能契约同时设置同一个变量的状态,那么矿工如何处理它们,以及智能契约的最终一致性是什么?
例如,由于事务是有序的,如果userA set variable1 = 1和userB set variable1 = 2,当两个矿工按照不同的顺序安排这两个事务时,variable1的最终状态可能是不同的。这意味着minerA在transactionB之前安排transactionA,variable1最终将是2,而minerB在transactionA之前安排transactionB,variable1最终将是1。variable1的最终状态将不一致。
发布于 2023-03-09 06:44:34
所有块按顺序排列,以便事务处理。两个块共享相同的父块并具有相同的块号是不可能的。
以前是在合并之前发生的。在战俘时代,经常看到两个矿工几乎同时生产一块。在这些情况下,其中一个块必须是孤立的,这称为链reorg。
孤立块的事务重新输入内存池,并等待在以后的块中再次被挖掘。
发布于 2023-03-09 10:43:15
如果两个用户同时设置相同变量的状态,块链中将只包含一个事务。这是一种“种族状况”,可能导致意想不到的行为。开发人员可以使用锁或其他技术来确保一次只有一个事务可以修改变量,或者使用冲突解决机制来处理并发访问。
contract LockedCounter {
uint256 private counter;
bool private locked;
function increment() public {
require(!locked, "LockedCounter: contract is locked");
locked = true;
counter += 1;
locked = false;
}
function getCounter() public view returns (uint256) {
return counter;
}
}发布于 2023-03-19 01:24:51
合同的状态只能从交易中修改。事务按矿商/块投标人的顺序执行。
块链结构使得不可能同时执行两个事务以进入不一致状态。
https://ethereum.stackexchange.com/questions/147063
复制相似问题