本文目是于创建一个以太坊测试网,并创建一套小生态(包括erc20,uinswap,闪电贷等)
1,根据操作系统,下载对应的geth包,本文使用的是linux-1.10.7版本
2,解压
tar zxvf geth-linux-amd64-1.10.7-12f0ff40.tar.gz
3,移动到PATH目录下,这样比较方便
mv geth /usr/local/bin/
4,新建账号2个,保存好自己的地址和keystore及密码
geth account new
keystore默认存储在~/.ethereum/keystore/
5,修改创世块文件,创世块模板在github可以找到,修改如下
{
"config": {
"chainId": 7851254,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0
},
"alloc": {
"0x477257735cCEF9C7d42856649c7149865D04eDeb": {
"balance": "1000000"
},
"0x18A1cf95EDBAf22f55E4789782eB76A1E4C192Af": {
"balance": "1000000"
}
},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x50000",
"extraData": "",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
其中我自己创建的账户,给了一些余额,不给也没关系,后面挖矿的时候会有收益。
其中的difficulty
字段,我是在多次尝试的情况下给了0x50000
,这样观察下来平均5~30秒可以出一个块,比较能够模仿以太坊的真实环境
6,初始化创世块
geth init genesis.json
如果初始化之后想要删除原有文件从头再来,可以在~/.ethereum/
目录下找到数据文件并删除即可
7,新建一个passwd
文件,输入刚才设置新建账户的密码,用于启动geth
时候用作启动参数,不用每次使用都要解锁账户
8,启动geth并开始挖矿,我的启动参数如下
nohup geth --nodiscover --verbosity=3 --http --http.api "eth,web3,net,admin,debug,personal,miner,txpool" --http.port "8545" --http.corsdomain "*" --http.addr "0.0.0.0" --ws --ws.port "8546" --ws.api "eth,web3,net,admin,debug,personal,miner,txpool" --ws.origins "*" --ws.addr "0.0.0.0" --port "30303" --networkid "15000" --allow-insecure-unlock --mine --miner.threads 1 --miner.etherbase 0x477257735cCEF9C7d42856649c7149865D04eDeb --unlock 0x477257735cCEF9C7d42856649c7149865D04eDeb --password passwd &
启动参数可以通过geth help
命令来查看详细说明及使用方法
至此以太坊启动完毕
9,在metamask连接到自己的服务器并导入刚才创建的两个账户,可以使用keystore导入的方式,导入过程有点慢
10,打开etherscan,找到Tokens下拉框,点击ERC20 Top Tokens标签
看到排名第一的是BNB,第二是USDT,此外再搜索一个WETH,先部署这三个合约
11,以BNB为例,点击BNB(BNB),进入BNB的token页面,点击Contract后面的地址超链接进入合约页面,再点击下方的Contract,就可以看见部署的合约源码,往下拉到Constructor Arguments标签,能够看到部署合约构造方法中使用的参数:
-----Decoded View---------------
Arg [0] : initialSupply (uint256): 200000000000000000000000000
Arg [1] : tokenName (string): BNB
Arg [2] : decimalUnits (uint8): 18
Arg [3] : tokenSymbol (string): BNB
12,复制源码,到Remix中新建一个文件,命名为BNB.sol,合约源码粘贴进去,点击部署页面,enviroument选择Injected Web3,连接到metamask
13,在DEPLOY框中输入步骤11中的参数,点击transact,在metamask中确认交易,等待少许时间即可部署成功
14,部署成功后,点击下方复制即可得到合约地址
或者找到这笔交易的hash,然后在geth控制台内用eth.getTransactionReceipt
方法查询合约地址
15,复制合约地址,在metamask中点击添加代币,填入合约地址,就可以显示该erc20合约的余额了。
16,重复上述步骤,依次把USDT和WETH都部署上去,并在metamask中显示余额。我另外又创建一个CHT代币用于测试,总量一千亿
部署USDT合约时,在CONTRACT一栏选择TetherToken
部署完WETH合约后,余额为0,应向合约内转账一些eth,就会自动铸造出WETH代币来
WETH代币比较多的应用于去中心化交易所,因为eth无法和erc20代币直接交易,所以诞生了WETH
全部完成后metamask应该显示如下
记录一下几个合约地址:
BNB: 0x57984eAd86378c6d13d2658756A6C316919d8e17
WETH: 0xD85bBA49004eEa6952E302DD171638A0aD990927
USDT: 0x93e284c222d9692ACD94B671290bb3dB3F3872CC
CHT: 0x0C5A69Acda6e6fE0D11b98De4efF983E5c05ba0d
下面部署uniswapV2
17,在etherscan上找到uniswapV2Factory源码,在第399行添加一行
bytes32 public INIT_CODE_PAIR_HASH = keccak256(abi.encodePacked(type(UniswapV2Pair).creationCode));
添加这一行的目的是得到pair合约的hash值,用来放在uniswapV2Factory合约中做校验,在下一步会用到
18,在编译时选择istanbil和优化选项,编译完成后,contract选择UniswapV2Pair,然后点击下方的Bytecode,复制其字节码
字节码粘贴到文本编辑器中,复制其中的object标签,粘贴到 http://emn178.github.io/online-tools/keccak_256.html
Input type选择Hex,得到Keccak-256的值
19,返回Remix,发布合约,构造方法参数_FEETOSETTER
可以填写当前发布合约的账户,发布成功后,点击下方合约左侧下拉框,找到INIT_CODE_PAIR_HASH
方法,直接点击调用,得到pair
合约的bytecode的keccak-256hash值:0x97e88e43afc882a5ca8a17d71cdea015823b179d4d4594ea4b5ac57dfcb36520
可以看到该hash值和第18步中得到的hash值是一样的,变相的校验了结果的精确。
得到uniswapV2Factory
地址: 0xe1350dD8B1D40039d86B2cc9B5D3A840225F2976
20,部署uniswapV2Router02,合约源码拷贝下来后,在其源码第700行中,把hash值换成上述步骤得到的值
与factory合约一样编译
部署时选择UniswapV2Router02合约,并传入factory和weth地址作为构造方法的参数
得到UniswapV2Router02
地址: 0xBcf79ae53085DF50b51Cef0B81c7917d7D6b922a
21,添加流动性之前,需要把添加的代币授权给UniswapV2Router02
合约,调用代币的approve
方法
_spender
填写UniswapV2Router02
的地址,_value
填入你想要授权的值,后面要加上18个0
以BNB为例:
同样的调用CHT的approve方法
22,添加流动性,调用router合约中的addLiquidity
方法,参数分别为
tokenA地址:BNB地址
tokenB地址:CHT地址
添加A金额:10000000000000000000
添加B金额:10000000000000000000
A最小金额:10000000000000000000
B最小金额:10000000000000000000
to地址:0x18A1cf95EDBAf22f55E4789782eB76A1E4C192Af
截止时间:2629448614
BNB和CHT各少了10个,就是被添加进了流动池里面
23,调用swap方法
调用swapExactTokensForTokens
方法进行swap,参数为
投入金额:1000000000000000000
获取最小金额:900000000000000000
兑换路径:[“0x0C5A69Acda6e6fE0D11b98De4efF983E5c05ba0d”,”0x57984eAd86378c6d13d2658756A6C316919d8e17”]
to地址:0x18A1cf95EDBAf22f55E4789782eB76A1E4C192Af
截止时间:2629448614
等待打包之后,查询自己的余额,少了1个CHT,多了0.906个BNB,至此一个简单的流程就走完了
转载请注明来源