创建自己的以太坊生态(1)

本文目是于创建一个以太坊测试网,并创建一套小生态(包括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导入的方式,导入过程有点慢

1

10,打开etherscan,找到Tokens下拉框,点击ERC20 Top Tokens标签

2

看到排名第一的是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中确认交易,等待少许时间即可部署成功

3

14,部署成功后,点击下方复制即可得到合约地址

或者找到这笔交易的hash,然后在geth控制台内用eth.getTransactionReceipt方法查询合约地址

4

15,复制合约地址,在metamask中点击添加代币,填入合约地址,就可以显示该erc20合约的余额了。

16,重复上述步骤,依次把USDT和WETH都部署上去,并在metamask中显示余额。我另外又创建一个CHT代币用于测试,总量一千亿

部署USDT合约时,在CONTRACT一栏选择TetherToken

部署完WETH合约后,余额为0,应向合约内转账一些eth,就会自动铸造出WETH代币来

WETH代币比较多的应用于去中心化交易所,因为eth无法和erc20代币直接交易,所以诞生了WETH

全部完成后metamask应该显示如下

5

记录一下几个合约地址:

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,至此一个简单的流程就走完了


转载请注明来源

×

喜欢就点赞,疼爱就打赏