区块链是一种特殊的分布式数据库,任何服务器都可以成为区块链中的一个节点,且节点之间是平等的,无中心化,区块链中的数据是经过加密存储,已经存储的数据无法修改,可以保证数据的准确性。
区块链技术一般用于构建交易系统,而且要保证交易的信息真实可信,可追踪且不可篡改。每一次交易的信息被确认后存储在一个区块中,区块信息通过散列技术加密,以保证信息不被篡改。这些区块按时间顺序构成链条。每个节点都保有完整的区块链信息,个别节点的信息损坏,不会对区块链信息产生影响。这种信息记录方式被称作分布式账本。
/**
铸造方法
* @param to to地址
* @return liquidity 流动性数量
* @notice 应该从执行重要安全检查的合同中调用此低级功能
*/
// this low-level function should be called from a contract which performs important safety checks
function mint(address to) external lock returns (uint256 liquidity) {
//获取`储备量0`,`储备量1`
(uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
//获取当前合约在token0合约内的余额
uint256 balance0 = IERC20(token0).balanceOf(address(this));
//获取当前合约在token1合约内的余额
uint256 balance1 = IERC20(token1).balanceOf(address(this));
//amount0 = 余额0 - 储备0
uint256 amount0 = balance0.sub(_reserve0);
//amount1 = 余额1 - 储备1
uint256 amount1 = balance1.sub(_reserve1);
//返回铸造费开关
bool feeOn = _mintFee(_reserve0, _reserve1);
//获取totalSupply,必须在此处定义,因为totalSupply可以在mintFee中更新
uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
//如果_totalSupply等于0
if (_totalSupply == 0) {
//流动性 = (数量0 * 数量1)的平方根 - 最小流动性1000
liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
//在总量为0的初始状态,永久锁定最低流动性
_mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
} else {
//流动性 = 最小值 (amount0 * _totalSupply / _reserve0) 和 (amount1 * _totalSupply / _reserve1)
liquidity = Math.min(
amount0.mul(_totalSupply) / _reserve0,
amount1.mul(_totalSupply) / _reserve1
);
}
//确认流动性 > 0
require(liquidity > 0, "UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED");
//铸造流动性给to地址
_mint(to, liquidity);
//更新储备量
_update(balance0, balance1, _reserve0, _reserve1);
//如果铸造费开关为true, k值 = 储备0 * 储备1
if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
//触发铸造事件
emit Mint(msg.sender, amount0, amount1);
}