手把手复刻 Uniswap V2:从部署合约到前端跑起来,一次打通全链路

手把手复刻 Uniswap V2:从部署合约到前端跑起来,一次打通全链路

文章目录

引言

在把 Uniswap V2 的 Interface 跑起来之前,很多人卡的并不是“前端怎么启动”,而是合约地址、链参数和 SDK 常量这些最容易被忽略、但一旦错了就会全盘崩掉的基础配置:Factory/Router/WETH/Multicall 到底在哪里查?不同链的合约地址怎么对齐?INIT_CODE_PAIR_HASH 为什么必须从你自己的 Pair bytecode 推出来?SDK 里哪些常量必须同步修改,前端又需要额外适配哪些配置(浏览器链接、supportedChainIds、tokenlist、多链 multicall 等)?

一、路由合约地址

(1)进入以太坊区块链浏览器,快速找到 Uniswap V2 路由合约地址

在这里插入图片描述


(2)下滑,找到 Uniswap V2: Router 2,这个就是路由合约

在这里插入图片描述

二、WETH 合约 和 工厂合约地址

(1)点击 Contract 可以看到开源的合约信息,然后在 Read Contract 里面,点击,获取合约中读方法的值,就是我们需要的合约地址了。

在这里插入图片描述


(2)打开合约地址,找到这三个地址的源代码,然后把这三个合约的源代码进行复制,然后分别新建到对应的文件中去

在这里插入图片描述

三、 Multicall 合约

在这里插入图片描述

四、合约代码进行编译

将以上四个合约的源码复制下来,打开 Remix,新建文件夹和四个合约文件,进行编译

在这里插入图片描述
注意:
在 Remix 上编译的时候,记得看一下以太坊区块链浏览器每个合约的编译版本,gas 优化数,记得对照着写
在这里插入图片描述


在这里插入图片描述

五、部署合约

(一)部署工厂合约

(1)选择要部署哪条区块链,可以在 Chainlist传送🚪 里面去看,并添加到钱包里去。这里我选择了以太坊的 Sepolia 测试网,大家可以自行选择

(2)打开工厂合约,在主合约里面添加这行代码,能够读取出 配对合约的 byteCode,编译出来的哈希值

bytes32 public constant INIT_CODE_PAIR_HASH =
keccak256(abi.encodePacked(type(UniswapV2Pair).creationCode));
在这里插入图片描述

(3)构造函数中的 _feeToSette 手续费设置员,设置为自己当前这个合约地址

在这里插入图片描述

(4)展开部署好的合约,调用 INIT_CODE_PAIR_HASH 常量,将32位的 hash 值,复制到路由合约的 hex 里面去,注意要把 0x 去掉

在这里插入图片描述

(二)部署 WETH 合约

这里是直接部署一个自己的 WETH 合约,没有去找官方的 WETH 合约

在这里插入图片描述

(三)部署路由合约

在这里插入图片描述

(四)部署 Multicall 合约

在这里插入图片描述

六、获取前端 Interface

找到干净的 V2 版本,日期为 2020年9月1日(传送🚪)

在这里插入图片描述

七、前端修改 SDK

(1)找到前端的 SDK,日期为 2020年8月6日(传送🚪)

在这里插入图片描述

(2)将这两个文件下载到本地代码编译器中

在这里插入图片描述

(3)将刚刚部署的路由合约地址、INIT_CODE_HASH,复制到此文件里面,记得保存哦

在这里插入图片描述

(4)修改 链 id,增加 Sepolia 的链 id

在这里插入图片描述

(5)修改刚刚部署的 WETH 的合约地址

在这里插入图片描述

(6)进入 v2-sdk 的文件夹目录,进行安装依赖

输入

npm i 或 npm install 
在这里插入图片描述

八、修改前端 Interface

(1)把链 id 新增至 index.ts 文件中

在这里插入图片描述

(2)将 Muliticall 合约复制到这里面来

在这里插入图片描述

(3)安装前端 interface 代码的依赖

在这里插入图片描述

(4)访问 Uniswap v2 的 tokenlist 列表(传送🚪)
可以将这个 json 文件 下载下来,放进 public 目录下。
我们可以把 这个 json 文件,放到 Github 里面,通过 raw 去读取。或者找到一个服务器去存放,墙内地址去存放这些代币信息,这样就有一个链接可以往在这里面,我们是直接把 tokenlist 放在 lists.ts 文件里面的,但是需要修改 token 列表的时候,前端需要重新部署

在这里插入图片描述


在这里插入图片描述

(5)复制到 lists.ts 文件中去,注意需要加 `` 把 json 变为字符串数组

在这里插入图片描述

(6)导出 Sepolia 链 id

在这里插入图片描述

(7)找到 Sepolia 浏览器的域名 ,复制 https://sepolia.etherscan.io/tx 部分

在这里插入图片描述

(8) 在二级域名里,把 Sepolia 的新增进来

在这里插入图片描述

如果不是以太坊兼容链,那么需要修改

在这里插入图片描述

九、发布 npm 包

(1)注册 npm 并登录

在这里插入图片描述
在这里插入图片描述

(2)进入到 sdk 的目录下,输入 npm login 进行登录

在这里插入图片描述

(3)修改 package.json 的 name,不能有重名的,否则会发布失败
版本号这里 改成了 1.0.0 因为是第一次提交

在这里插入图片描述

可通过此命令去查询包名是否有重复,没有就可以用

npm view yoona1020-sepolia-sdk name version --json
在这里插入图片描述

(4)进行 npm pubilsh 之后,发现失败了,没有 token

在这里插入图片描述

(5)我们去 npm 官网,生成一个新的 token

Packages: Read and write Scope 覆盖
All packages(或至少覆盖你要发的包)
在这里插入图片描述

(6)输入 notepad $env:USERPROFILE.npmrc
将生成的 token 复制进去,记得保存

注意:不要加引号;也不要把 token 写到项目目录的 .npmrc,优先写在用户目录
在这里插入图片描述

(7)验证 token 是否成功

npm whoami 能输出你的 npm 用户名:说明认证成功

npm ping 返回 pong:说明能正常连 registry

在这里插入图片描述

(8)发布成功,但是我的包名改成了 scope 包 再发布的,注意看我的 name 的值,发布为:@你的用户名/包名。这类包通常更不容易被当作垃圾包,同时也更符合“个人 fork/练习版本”的发布语义。

下次发布的时候,只需要改版本号,进行发布就好啦

在这里插入图片描述

十、修改前端 Interface,使用新的 npm 包

(1)注意进入 interface 的目录,然后移除 uniswap 的包

在这里插入图片描述

(2)拷贝自己的包名,进行安装包,将 uniswap 的 sdk,换成我们自己发布的 sdk 了。

在这里插入图片描述

(3)将 uniswap 的 sdk 全部替换成我们的

在这里插入图片描述

(4)进行本地测试,
输入 npm start
测试没问题之后,可以部署到自己的 GitHub 仓库,然后部署到 vercel 上,可以让大家一起体验啦!

在这里插入图片描述

总结

到这里,核心闭环已经完成:合约层(Factory/Router/WETH/Multicall)部署成功,INIT_CODE_PAIR_HASH 从 Pair 的 creationCode 正确导出并回填;SDK 层 完成常量同步并发布到 npm;前端层 完成路由地址、链支持、浏览器链接、multicall 与 tokenlist 的适配,能够在目标网络上正常运行和部署。

最后强调三点最容易踩坑、但也最关键的“验收标准”:

地址一致性:Factory/Router/WETH/Multicall 四个地址必须在 SDK 与 Interface 两端完全一致,且对应同一条链的 chainId。

INIT_CODE_PAIR_HASH 必须来源于你当前编译产物:只要 Pair 合约 bytecode、编译器版本或优化参数变化,hash 就会变化;hash 不匹配会导致 Pair 地址推导错误,进而影响路径、交易与查询。

Multicall 的价值在“批量读”:前端大量状态依赖多次链上 read,Multicall 能显著减少 RPC 往返与加载时间,是 Interface 体验能否“像官方一样顺滑”的关键。

后续如果你要扩展到更多链,建议把这套流程进一步产品化:把链的参数(chainId、factory/router/weth/multicall、explorer base url、tokenlist url)抽成一份配置文件,做到“新增一条链 = 新增一段配置”,从而把迁移成本从“改代码”降到“填参数”。这样你就拥有了一套可持续维护的 Uniswap V2 多链部署与前端适配框架。

Read more

Meta-Llama-3-8B-Instruct优化技巧:显存占用降低50%

Meta-Llama-3-8B-Instruct优化技巧:显存占用降低50% 1. 引言 1.1 背景与挑战 Meta-Llama-3-8B-Instruct 是 Meta 在 2024 年 4 月发布的中等规模指令微调模型,凭借其 80 亿参数、8k 上下文支持和 Apache 2.0 可商用协议,迅速成为本地部署对话系统的热门选择。尤其在消费级 GPU(如 RTX 3060)上实现单卡推理的能力,极大降低了大模型应用门槛。 然而,在实际部署过程中,显存占用过高仍是制约其广泛应用的核心瓶颈。原始 FP16 模型需约 16 GB 显存,即便使用 GPTQ-INT4 压缩后仍需 4–6 GB,对于 LoRA 微调或长上下文推理场景,

By Ne0inhk

Stable Diffusion XL 1.0镜像免配置方案:灵感画廊Streamlit UI定制实战

Stable Diffusion XL 1.0镜像免配置方案:灵感画廊Streamlit UI定制实战 1. 项目介绍:艺术与技术的完美融合 灵感画廊(Atelier of Light and Shadow)是一个基于Stable Diffusion XL 1.0打造的沉浸式艺术创作工具。与传统的AI绘画工具不同,它摒弃了复杂的工业化界面,采用了一种类似艺术沙龙的恬静交互方式,为创作者提供了一个专注的"灵感捕捉空间"。 这个项目的核心价值在于:无需复杂配置,开箱即用。即使你没有任何技术背景,也能快速上手使用SDXL 1.0的强大生成能力。整个界面设计得像一个数字艺术工作室,让你专注于创作本身,而不是技术细节。 "见微知著,凝光成影。将梦境的碎片,凝结为永恒的视觉诗篇。" 2. 核心特色功能解析 2.1 艺术沙龙视觉设计 灵感画廊采用了独特的视觉设计风格,

By Ne0inhk

本地AI绘画新选择:麦橘超然Flux控制台使用心得

本地AI绘画新选择:麦橘超然Flux控制台使用心得 麦橘超然 - Flux 离线图像生成控制台 基于 DiffSynth-Studio 构建的 Flux.1 图像生成 Web 服务。集成了“麦橘超然”模型(majicflus_v1),采用 float8 量化技术,大幅优化了显存占用。界面简单直观,支持自定义提示词、种子和步数,适合在中低显存设备上进行高质量 AI 绘画测试。 1. 为什么我愿意为它腾出一块显存? 你有没有过这样的经历:想在家用RTX 3060跑一个Flux模型,结果刚加载完DiT主干就爆显存?或者打开网页UI,等了三分钟才看到“Loading…”——而你的风扇已经唱起了交响乐? 我试过不下五种本地Flux方案,直到遇见“麦橘超然”。它不是又一个套壳WebUI,而是一次真正面向普通创作者的工程减负:不靠堆显存,不靠换硬件,而是用float8量化+DiT分层卸载+Gradio极简交互,把原本需要24GB显存的任务,

By Ne0inhk
AI 写作(八)实战项目一:自动写作助手(8/10)

AI 写作(八)实战项目一:自动写作助手(8/10)

一、项目背景与需求分析 (一)写作需求的多样化 在互联网普及的今天,人们对写作的需求呈现出前所未有的多样化态势。无论是学术论文、新闻报道,还是社交媒体的动态更新、网络小说的创作,都离不开高质量的写作。以学术研究为例,学者们需要撰写严谨的论文来阐述自己的研究成果,这不仅要求语言准确、逻辑严密,还需要大量的文献引用和数据分析。而对于新闻工作者来说,快速、准确地报道时事新闻是他们的首要任务,这就需要在短时间内创作出简洁明了、富有吸引力的新闻稿件。此外,社交媒体的兴起使得每个人都成为了内容创作者,人们希望通过精彩的文字来展示自己的生活、观点和创意。然而,传统的写作方式往往需要耗费大量的时间和精力,从构思、收集资料到撰写、修改,每一个环节都可能面临着各种挑战。面对如此繁重的写作任务,很多人常常感到力不从心,迫切需要一种更加高效、便捷的写作方式。 (二)人工智能技术的发展 近年来,人工智能技术尤其是自然语言处理技术取得了突破性的进展,为自动写作助手的出现提供了强大的技术支持。自然语言处理技术通过对大量文本数据的深度学习,能够掌握语言的规律,理解语义、语法和语境,从而实现自动生成文章、故

By Ne0inhk