如何使 uniswap v2 去中心化交易所支持以太坊私链

在上一篇文章我们详细讲解了如何 在以太坊测试网络部署 uniswap v2 去中心化交易所,但是只能支持特定的几个以太坊网络:Mainnet、Ropsten、Rinkeby、Goerli、Kovan。现在我们来讲解如何支持其它以太坊网络,包括我们自己搭建的私链。主要涉及对前端配置参数进行修改。

1 部署 multicall 合约

multicall 合约用于将多笔合约调用操作打包进同一笔交易,它的目的是为了保证执行多笔操作时所有操作能够顺序地执行,以及保证它们要么全部完成,要么全部不完成。

由于 Mainnet、Ropsten、Rinkeby、Goerli 和 Kovan 网络都已经部署了 multicall 合约,所以在之前的文章里面我们并没有重新部署它。但是在我们的私链上并没有部署,所以下一步我们先将 multicall 合约部署到私链上。

1.1 安装编译工具

multicall 项目使用 dapp.tools 开发、测试和部署智能合约,我们需要先安装工具:

# user must be in sudoers
sudo curl -L https://nixos.org/nix/install | sh

# Run this or login again to use Nix
. "$HOME/.nix-profile/etc/profile.d/nix.sh"

sudo curl https://dapp.tools/install | sh

1.2 配置环境变量

根据自身情况修改以下环境变量,然后执行命令:

export ETH_GAS=4500000
export ETH_GAS_PRICE=1000000000
export ETH_KEYSTORE=/root/keystore  
export ETH_PASSWORD=/root/keystore/pass    
export ETH_FROM=0x0000000000000000000000000000000000000000
export ETH_RPC_URL=http://localhost:8545
  1. ETH_GAS:单笔交易的GAS上限
  2. ETH_GAS_PRICE:交易的GAS价格
  3. ETH_KEYSTORE:发送交易地址的 .keystore 文件路径
  4. ETH_PASSWORD:发送交易地址的 .keystore 文件的解锁密码
  5. ETH_FROM:发送交易地址
  6. ETH_RPC_URL:以太坊RPC节点的地址

1.3 编译和部署合约

首先 clone multicall 代码仓库,拉取项目依赖并编译合约:

git clone https://github.com/makerdao/multicall.git
cd multicall
dapp update && dapp build

然后执行 dapp create 命令部署合约。

dapp create src/Multicall.sol:Multicall
++ seth send --create 608060405234801561001057600080fd5b5061053e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100785760003560e01c80630f28c97d1461007d578063252dba421461009b57806327e86d6e146100bc5780634d2301cc146100c457806372425d9d146100d757806386d516e8146100df578063a8b0574e146100e7578063ee82ac5e146100fc575b600080fd5b61008561010f565b6040516100929190610429565b60405180910390f35b6100ae6100a9366004610302565b610113565b604051610092929190610432565b610085610235565b6100856100d23660046102e0565b61023e565b61008561024b565b61008561024f565b6100ef610253565b6040516100929190610415565b61008561010a3660046103e1565b610257565b4290565b805143906060906001600160401b038111801561012f57600080fd5b5060405190808252806020026020018201604052801561016357816020015b606081526020019060019003908161014e5790505b50905060005b835181101561022f576000606085838151811061018257fe5b6020026020010151600001516001600160a01b03168684815181106101a357fe5b6020026020010151602001516040516101bc91906103f9565b6000604051808303816000865af19150503d80600081146101f9576040519150601f19603f3d011682016040523d82523d6000602084013e6101fe565b606091505b50915091508161020d57600080fd5b8084848151811061021a57fe5b60209081029190910101525050600101610169565b50915091565b60001943014090565b6001600160a01b03163190565b4490565b4590565b4190565b4090565b80356001600160a01b038116811461027257600080fd5b92915050565b600082601f830112610288578081fd5b81356001600160401b0381111561029d578182fd5b6102b0601f8201601f19166020016104b2565b91508082528360208285010111156102c757600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156102f1578081fd5b6102fb838361025b565b9392505050565b60006020808385031215610314578182fd5b82356001600160401b038082111561032a578384fd5b81850186601f82011261033b578485fd5b803592508183111561034b578485fd5b61035884858502016104b2565b83815284810190828601875b868110156103d25781358501604080601f19838f03011215610384578a8bfd5b61038d816104b2565b6103998e8c850161025b565b815281830135898111156103ab578c8dfd5b6103b98f8d83870101610278565b828d015250865250509287019290870190600101610364565b50909998505050505050505050565b6000602082840312156103f2578081fd5b5035919050565b6000825161040b8184602087016104d8565b9190910192915050565b6001600160a01b0391909116815260200190565b90815260200190565b600060408201848352602060408185015281855180845260608601915060608382028701019350828701855b828110156104a457878603605f190184528151805180885261048581888a018985016104d8565b601f01601f19169690960185019550928401929084019060010161045e565b509398975050505050505050565b6040518181016001600160401b03811182821017156104d057600080fd5b604052919050565b60005b838110156104f35781810151838201526020016104db565b83811115610502576000848401525b5050505056fea2646970667358221220c366d862b441877d320885ceaf80c85465dd463862a5da9358351de241a6761764736f6c63430006070033 'Multicall()'
seth-send: Published transaction with 1374 bytes of calldata.
seth-send: 0x4a046cbff360620e9a3a31ad7e003f15f0e011459da73069c30a6a223a9fbce4
seth-send: Waiting for transaction receipt.........
seth-send: Transaction included in block 55269.
0xE4cB75D35af81EcCb44eB9521524C9C6f93440d2

最后终端输出的 0xE4cB75D35af81EcCb44eB9521524C9C6f93440d2 就是已部署的 multicall 合约地址,需要记录下来,后面会用到。

2. 修改前端配置

2.1 添加 ChainId

下面的步骤中我们假设私有网络的名称为 PRIVNET,ChainId 是 1024,请根据自身情况进行替换。WETH 合约地址 0x5740F4E31A84FcB79720e807d022BD0833809e4A 请参考上一篇文章进行部署。

  1. 打开 node_modules/@uniswap/sdk/dist/sdk.cjs.development.js 文件,找到 function (ChainId) 方法,在方法最后添加代码 ChainId[ChainId["PRIVNET"] = 1024] = "PRIVNET";。然后再找到全局对象 WETH,再里面添加 _WETH[exports.ChainId.PRIVNET] = new Token(exports.ChainId.PRIVNET, '0x5740F4E31A84FcB79720e807d022BD0833809e4A', 18, 'WETH', 'Wrapped ETH')
  2. 打开 node_modules/@uniswap/sdk/dist/sdk.esm.js 文件,找到 function (ChainId) 方法,在方法最后添加代码 ChainId[ChainId["PRIVNET"] = 1024] = "PRIVNET";。然后再找到全局对象 WETH,再里面添加 _WETH[ChainId.PRIVNET] = new Token(ChainId.PRIVNET, '0x5740F4E31A84FcB79720e807d022BD0833809e4A', 18, 'WETH', 'Wrapped ETH')
  3. 打开 src/components/Header/index.tsx 文件,在全局对象 NETWORK_LABELS 里面添加 [ChainId.PRIVNET]: 'Privnet'
  4. 打开 src/connectors/index.ts 文件,在 supportedChainIds 数组里面添加 ChainId 1024
  5. 打开 src/constants/index.ts 文件,在全局对象 WETH_ONLY 里面添加 [ChainId.PRIVNET]: [WETH[ChainId.PRIVNET]]
  6. 打开 src/constants/multicall/ndex.ts 文件,在全局对象 MULTICALL_NETWORKS 里面添加 [ChainId.PRIVNET]: '0xE4cB75D35af81EcCb44eB9521524C9C6f93440d2',里面的地址是之前我们部署的 multicall 合约地址。
  7. 打开 src/constants/v1/index.ts 文件,在全局对象 V1_FACTORY_ADDRESSES 里面添加 [ChainId.PRIVNET]: '0x0000000000000000000000000000000000000000'
  8. 打开 src/state/lists/hooks.ts 文件,在全局对象 EMPTY_LIST 里面添加 [ChainId.PRIVNET]: {}
  9. 打开 src/utils/index.ts 文件,在全局对象 ETHERSCAN_PREFIXES 里面添加 1024: ''。其中 1024 是私链的 ChainId。

2.2 修改原生代币名称

如果我们需要将原生代币名称由 ETH 改为其它的,例如 GAS,还需要作出以下修改。

  1. 打开 node_modules/@uniswap/sdk/dist/sdk.cjs.development.js 文件,找到 Currency.ETHER,将值改为 new Currency(18, 'GAS', 'Gas Token');
  2. 打开 node_modules/@uniswap/sdk/dist/sdk.esm.js 文件,找到 Currency.ETHER,将值改为 new Currency(18, 'GAS', 'Gas Token');
  3. 打开 src/components/Header/index.tsx 文件,将文本 ETH 修改为 GAS
  4. 打开 src/components/SearchModal/CommonBases.tsx 文件,将文本 ETH 修改为 { ETHER.symbol }

你可能感兴趣的:(区块链以太坊智能合约)