我正在使用Solidity将智能合同部署到由Ganache发起的测试Ethereum网络中。我读了一些合同的演示代码,其中一个看起来像:
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.4;
pragma experimental ABIEncoderV2;
contract Ledger {
struct TransferRequest {
string title;
uint256 amount;
string bsb;
string accountName;
string accountNumber;
}
mapping(address => uint256) balances;
address payable owner;
event Transfered(bool _success, address _from, address _to, uint256 amount);
constructor() payable {
owner = payable(msg.sender);
balances[tx.origin] = 10000;
}
function sendCoin(address payable receiver, uint256 amount)
payable public
{
require(msg.sender == owner);
if (balances[msg.sender] < amount) return;
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Transfered(true, msg.sender, receiver, amount);
}
function getBalance(address addr) public view returns (uint256) {
return balances[addr];
}
}正如您在上面所看到的,合同本身管理余额,而不是使用来自区块链的余额。在sendCoin方法中没有真实的乙醚转移。这是否意味着区块链中没有真正的事务。那订立这样的合同有什么意义呢。区块链管理的balance和合同管理的balance之间的关系是什么?
发布于 2021-11-30 08:33:11
合同自行管理余额,而不是使用区块链的余额。
每个状态变化(在本例中是balances存储属性值的变化)都记录在块链上。因此,合同正在解读区块链的平衡。
然而,按照Ethereum网络的设计方式,一个地址只能具有很少的属性--它的字节码(非零字节码意味着它是一个智能的契约),它的平衡性,以及其他几个属性。由于只有一个属性用于余额(而不是余额列表),所以它用于本地ETH余额。任何令牌余额都存储在各自令牌的契约中。
您可以在ERC-20的最终版本和链接文档中阅读更多有关令牌平衡存储设计的信息。这是第一个在以太上引入令牌的标准。
https://stackoverflow.com/questions/70164395
复制相似问题