合约内代码复用:GenLayer Project Boilerplate中内部方法组织的3个原则
合约内代码复用GenLayer Project Boilerplate中内部方法组织的3个原则【免费下载链接】genlayer-project-boilerplate项目地址: https://gitcode.com/GitHub_Trending/gen/genlayer-project-boilerplate如果你正在学习 GenLayer 智能合约开发却常常把读网页、调大模型、写存储的逻辑堆满公开方法这篇文章会带你拆解 GenLayer Project Boilerplate 项目。它内置了一个可上链的足球竞猜智能合约是学习合约内代码复用与内部方法组织的优质样板如何用 3 个原则把 Python 智能合约写得简洁、可测、可维护。为什么内部方法组织如此重要 传统 Solidity 合约里调用外部数据是禁忌而在 GenLayer 的 GenVM 上Python 智能合约可以原生访问互联网并调用 LLM大语言模型。这带来了新的难题同一个业务如查询比赛结果可能被多个功能用到重复实现容易出错非确定性操作网页、AI需要被等价性原则包裹代码结构必须清晰测试要能独立验证每个内部环节方法拆分不当会让测试无从下手。本项目的核心合约 contracts/football_bets.py 用不到 120 行代码解决了这些问题值得逐层拆解。项目结构一览合约、测试、前端各归其位目录职责与代码复用的关系contracts/Python 智能合约内部方法下划线开头沉淀可复用逻辑tests/direct/内存级快速测试毫秒级共享辅助函数mock 一次到处复用tests/integration/对接 GenLayer Studio 的全链路测试状态 fixture 与合约 schema 对齐frontend/Next.js 15 前端所有 Hook 复用同一个合约实例工厂原则一把非确定性外部操作封装成单一内部方法 这是整个合约最有价值的设计。合约中的 _check_match 是一个下划线开头的内部方法它把三件事打包成一个原子单元通过gl.nondet.web.render抓取比赛页面文本用gl.nondet.exec_prompt让 LLM 从网页内容中抽取比分 JSON用gl.eq_principle.strict_eq包裹整个流程保证任意验证节点都能得到相同结果等价性原则。def _check_match(self, resolution_url: str, team1: str, team2: str) - dict: def get_match_result() - str: web_data gl.nondet.web.render(resolution_url, modetext) task fExtract the match result for: ... result gl.nondet.exec_prompt(task, response_formatjson) return json.dumps(result, sort_keysTrue) result_json json.loads(gl.eq_principle.strict_eq(get_match_result)) return result_json复用效果resolve_bet 直接调用self._check_match(...)一行完成取结果 抽比分 校验一致性create_bet中也预留了同一入口用于拦截比赛已结束的场景见 football_bets.py 第 65-68 行。 给新手的提示凡是网页 LLM 等价性校验的组合都应该沉淀为这样的内部方法。公开方法只负责业务判断比如比分是否支持我的预测不碰网络细节。原则二公开方法保持薄用装饰器分离读写职责 ⚖️合约的对外接口只有 5 个方法且每个方法职责单一、装饰器明确gl.public.write写方法改变链上状态create_bet、resolve_betgl.public.view读方法只读查询get_bets / get_points / get_player_points所有脏活累活外部抓取、LLM 调用、一致性校验都下沉到内部方法_check_match公开方法只剩三步校验前置条件 → 调用内部方法 → 更新存储。以resolve_bet为例football_bets.py 第 90-107 行gl.public.write def resolve_bet(self, bet_id: str) - None: bet self.bets[gl.message.sender_address][bet_id] bet_status self._check_match(bet.resolution_url, bet.team1, bet.team2) if int(bet_status[winner]) 0: raise Exception(Game not finished) # 更新比分、记积分……好处一目了然新增功能如批量结算只需组合现有内部方法不用重写外部调用逻辑前端和测试只需认识 5 个公开方法接口面小、不易误用lint 工具genvm-lint能精确检查装饰器与返回类型标注结构清晰时更容易通过。原则三统一数据结构与工具函数跨合约—测试—前端三层复用 合约层dataclass 作为存储 Schema 的单一事实来源Bet 用allow_storage dataclass定义了 9 个字段id、game_date、predicted_winner、real_score 等作为嵌套存储 TreeMap[Address, TreeMap[str, Bet]] 的值类型。一个数据类同时定义了写入格式create_bet、读取格式get_bets、链上存储结构三处永不漂移。测试层辅助函数写一次所有用例受益地址转十六进制的 to_hex 放在共享的 conftest 中test_create_bet.py、test_resolve_bet.py 直接 import 复用Web 与 LLM 的 mock 注册封装成 _setup_match_mocks6 个结算测试用例赢/输/平/重复结算/未结束只需一行vm.mock配置就能切换场景集成测试的期望状态集中在 tests/integration/fixtures.pyfootball_bets_contract_schema与 6 组未结算/已结算状态字典字段命名与合约Bet完全一致——改字段时只需改一处。前端层一个 Hook 工厂喂饱所有数据 Hook前端把所有合约调用收敛到 useFootballBetsContract它负责读取环境变量、校验钱包地址、创建合约实例。随后 useBets、useLeaderboard、useCreateBet 等 5 个 Hook 全部基于它构建统一的staleTime、refetchOnWindowFocus与 toast 提示逻辑只写了一次提示文案来自 frontend/lib/utils/toast.ts。快速上手5 步复制这套复用思路 画接口先列出公开方法区分 write / view保持薄抽内部方法把网页LLM等价性校验组合抽成_xxx私有方法定数据结构用allow_storage dataclass统一 Schema配测试夹具mock 辅助函数放 conftest期望状态放 fixtures与合约字段严格对齐收敛前端入口所有数据 Hook 共用一个合约实例工厂。小结GenLayer Project Boilerplate 这个足球竞猜样板项目用 3 个原则演示了 Python 智能合约的代码复用范式内部方法封装非确定性操作、公开接口薄而清晰、数据结构与工具函数跨层复用。配合项目自带的快速反馈循环CLAUDE.md 中列出的 lint → direct 测试 → 集成测试工作流你可以放心地重构内部方法——毫秒级的 direct 测试会立刻告诉你有没有改坏。上手地址见 README.md 的 Quick Start 章节。【免费下载链接】genlayer-project-boilerplate项目地址: https://gitcode.com/GitHub_Trending/gen/genlayer-project-boilerplate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

【保姆级教程】10行代码搞定!零基础用Google ADK创建带Web界面的AI Agent!

【保姆级教程】10行代码搞定!零基础用Google ADK创建带Web界面的AI Agent!

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 20:51:08 阅读更多 →
空中鸟类检测数据集 | 鸟类检测 生态监测 鸟击防范9176期

空中鸟类检测数据集 | 鸟类检测 生态监测 鸟击防范9176期

空中鸟类检测数据集 | 鸟类检测 生态监测 鸟击防范 鸟类目标的视觉检测9176期 数据集概述 本数据集专注于鸟类目标的视觉检测,服务于生态监测、鸟击防范及生物多样性研究。数据涵盖天空、水域等场景下的鸟类图像,适配鸟类计数、种群监测及飞行安全预警等…

2026/10/10 20:50:18 阅读更多 →
Codex 实战:用小项目验证核心能力,TaoToken 统一 Key 接入 AI 编程链路

Codex 实战:用小项目验证核心能力,TaoToken 统一 Key 接入 AI 编程链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 18:18:51 阅读更多 →

最新新闻

共聚焦显微镜与激光共聚焦有什么区别?选型与实操全解析

共聚焦显微镜与激光共聚焦有什么区别?选型与实操全解析

直接抛一个问题:你实验室里那台写着“共聚焦显微镜”的仪器,和你师弟论文里写的“激光共聚焦显微镜”,到底是不是同一个东西?如果只是名称长了三个字,为什么采购单上价格能差出一倍?很多刚接触显微成像的同…

2026/10/10 20:56:40 阅读更多 →
校园二手交易平台APP开发:从Android Studio工程到答辩的完整落地路径

校园二手交易平台APP开发:从Android Studio工程到答辩的完整落地路径

简介:这是一套基于 Android Studio 开发的校园二手交易平台 APP 完整源代码,面向计算机相关专业的毕业生、课程设计学习者以及需要期末大作业参考的开发者,帮助解决从零搭建移动端交易类项目的难题。压缩包共 95 个文件,约 929KB&…

2026/10/10 20:56:40 阅读更多 →
Windows运行库系统性修复指南:DirectX、.NET、VC++与3DM合集实战

Windows运行库系统性修复指南:DirectX、.NET、VC++与3DM合集实战

1. 这不是“一键修复”,而是运行库问题的系统性认知重建你是不是也遇到过:双击游戏图标,弹出“MSVCP140.dll 丢失”;点开某个设计软件,提示“.NET Framework 4.8 未安装或损坏”;甚至刚装完系统&#xff0c…

2026/10/10 20:56:40 阅读更多 →
大模型API聚合平台选型指南:从模型覆盖到容灾机制的核心Checklist

大模型API聚合平台选型指南:从模型覆盖到容灾机制的核心Checklist

最近一年,身边越来越多的企业朋友开始认真考虑接入大模型,而他们问我的第一个问题往往不是“该选哪家模型”,而是“要不要走API聚合平台”。这个问题问得很实在。我见过不少团队一开始图省事直接调各家模型官方的API,结果账号管理…

2026/10/10 20:56:39 阅读更多 →
从爬楼梯到跃迁:个人成长的非线性突破之道

从爬楼梯到跃迁:个人成长的非线性突破之道

"你的成长,不是爬楼梯,而是“跃迁”"去年我参加一个技术社区的小型聚会,有位做后端开发七八年的朋友跟我说了一句话,我到现在还记得:“我每年都在学新东西、做新项目,技术栈越用越新,…

2026/10/10 20:56:39 阅读更多 →
Java八种基本类型全解析:从内存布局到线上避坑实战

Java八种基本类型全解析:从内存布局到线上避坑实战

Java的八种基本类型,这个话题放在互联网上一搜一大把,但相信我,很多人在第一年学完就忘得干干净净。我自己带过几个人,面试时问int占几个字节,有人能回答上来,再问int的上限是多少、为什么负数下限比正数上…

2026/10/10 20:55:38 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →