区块链就是把加密数据(区块)按照时间顺序进行叠加(链)生成的永久、不可逆向修改的记录。某种意义上说,区块链技术是互联网时代一种新的“信息传递”技术,
区块链(Blockchain)是一种由多方共同维护,使用密码学保证传输和访问安全,能够实现数据一致存储、难以篡改、防止抵赖的记账技术,也称为分布式账本技术(Distributed Ledger Technology)。Essentially,blockchain is a reliable database that is collectively maintained and distributed through decentralization and trustworthiness.
区块链作为一种新型的技术组合,综合了P2P网络、共识算法、非对称加密、智能合约等新型技术,是一种在对等网络(也称分布式网络、点对点网络)环境下,Through transparent and trusted rules,a traceable block chain data structure is constructed,which has the typical characteristics of distributed peer-to-peer,chained data blocks,anti forgery and Tamper resistance,traceability,transparency and credibility,and high reliability.
区块链技术就是一种数据库技术,每个区块就像一个硬盘,把信息全部保存下来,再通过密码学技术进行加密,这些被保存起来的数据是不能被篡改的。
pragma solidity=0.5.16;
import'./interfaces/IUniswapV2Factory.sol';
import'./UniswapV2Pair.sol';
contract UniswapV2Factory is IUniswapV2Factory{
address public feeTo;
address public feeToSetter;
mapping(address=>mapping(address=>address))public getPair;
address[]public allPairs;
event PairCreated(address indexed token0,address indexed token1,address pair,uint);
//初始化就设定好谁是设定手续费接收的人的设定者
constructor(address _feeToSetter)public{
feeToSetter=_feeToSetter;
}
//获取一共有多少个交易对
function allPairsLength()external view returns(uint){
return allPairs.length;
}
//创建交易对函数
//创建交易对只是创建一个交易对地址,还没有往里面添加代币数量
function createPair(address tokenA,address tokenB)external returns(address pair){
//必须是两个不一样的ERC20合约地址
require(tokenA!=tokenB,'UniswapV2:IDENTICAL_ADDRESSES');
//让tokenA和tokenB的地址从小到大排列
(address token0,address token1)=tokenA<tokenB?(tokenA,tokenB):(tokenB,tokenA);
//token地址不能是0
require(token0!=address(0),'UniswapV2:ZERO_ADDRESS');
//必须是uniswap中未创建过的pair
require(getPair[token0][token1]==address(0),'UniswapV2:PAIR_EXISTS');//single check is sufficient
//获取模板合约UniswapV2Pair的creationCode
bytes memory bytecode=type(UniswapV2Pair).creationCode;
//以两个token的地址作为种子生产salt
bytes32 salt=keccak256(abi.encodePacked(token0,token1));
//直接调用汇编创建合约
assembly{
pair:=create2(0,add(bytecode,32),mload(bytecode),salt)
}
//初始化刚刚创建的合约
IUniswapV2Pair(pair).initialize(token0,token1);
//交易对映射填充
//记录刚刚创建的合约对应的pair
getPair[token0][token1]=pair;
getPair[token1][token0]=pair;
allPairs.push(pair);
emit PairCreated(token0,token1,pair,allPairs.length);
}
//设置接收手续费的人,只能设置者能设置
//用于设置feeTo地址,只有feeToSetter才可以设置。
function setFeeTo(address _feeTo)external{
require(msg.sender==feeToSetter,'UniswapV2:FORBIDDEN');
feeTo=_feeTo;
}
//设置接收手续费的人的设置者,只能上一个设置者进行设置,也就是设置权利转交
//用于设置feeToSetter地址,必须是现任feeToSetter才可以设置。
function setFeeToSetter(address _feeToSetter)external{
require(msg.sender==feeToSetter,'UniswapV2:FORBIDDEN');
feeToSetter=_feeToSetter;
}
}