Cointime

扫码下载App
iOS & Android

AO 合约概览和源码获取

项目方

想了解 AO 上应用的合约运行机制吗?那么来抓取合约代码一探究竟吧。用一个 python 小程序,轻松获取指定 Process 的合约。

作者: txohyeah

审阅:outprog

来源:内容公会 - 新闻


AO 简介

什么是 AO?

AO 测试网发布已经有小半年了,AO 的内容也有很多,本文的内容主要聚焦 Process 和智能合约,包括 AO 是什么,Process 是什么,Process 的生命周期。最后重点介绍下如何查看 Process 的合约代码。

AO 是 Arweave 在完善分布式存储基础上,进一步发展出的计算功能,旨在实现全面的去中心化应用支持,与以太坊先计算后存储的发展路径相对应。简单来说,AO 代表了 Arweave 平台上的智能合约或计算能力,是在其永久存储解决方案之上的逻辑层扩展。

AO 由三个单元组成,MU / SU / CU

MU:接收到用户发送的消息,以确保它们经过签名。

SU:对消息进行时间戳和排序,然后捆绑并发布到 Arweave。SU 也是我们今天会用到的主角,后面会在查看合约时,起到了重要的作用。

CU:处理消息并计算出结果。

什么是 AO 上运行的 Process?

AO 本质上是基于一个 Data Protocol 构建的超级并行计算机,其中 Data 的存在形式是 AO 中定义的基本元素 Message。那么 Process 在这其中扮演着处理 Message 的重要角色,是处理 AO 上消息的基本单元。Process 运行在 CU 上,可以看成是 CU 上的一个虚拟机。因此,Process 包含基本的能力就是在网络内接收和发送消息。然后开发者通过为 Process 添加 handler 的方式,为 Process 构建消息处理的能力。后面要讲到的合约,其实就是通过发送一条消息到 Process,再通过内置的 _eval handler 部署的。其中添加的 handler 可以理解为合约的消息处理函数。

Process 的生命周期

如果要在我们现有的世界中找到一个类比,那么我认为 docker 中容器(Container)可以很好的让人对比理解 Process。下面我会借助 docker 中 Container 的生命周期类比下 Process 的生命周期。

我们都知道 docker 中 Container 的创建会依赖一个镜像(Image),比如根据 mysql 的 Image 创建一个 mysql 的 Container,而后就可以在这个容器上调用 mysql 的服务了。AO 中的 Process 也是一样,Process 的创建依赖于 Module,并且也会存在不同功能的 Module,有最简单的 Module,有支持定时任务的 Module,也有包含 sqlite 的 Module。目前已经有上百个 Module,可供开发者选择去创建自己的 Process。另外,自己也可以去制作自定义的 Module。相信在不久的将来,也会出现支持 GPU 的 Module,支持各种 AI 能力的 Module。

AO 中的 Process 也存在与 docker 中 Container 不一样的地方。Docker 中的 Container 支持启动、停止、删除等各种动作。目前在 AO 的 Process 中是没有这些操作的,毕竟在去中心化应用的世界中,这些由中心化个人控制的功能就显得很不融洽了。在 AO 中 Process 的运行完全取决于 Process 自己的价值,如果有足够的价值,那么肯定会有更多的 CU 愿意去运行它,相反,一个 Process 如果没有价值,就没有 CU 愿意去运行它,那么这个 Process 就将默默的消失。

Eval 函数与 AO 合约部署

什么是 AO 合约?对比以太坊的智能合约。AO 上运行的 Process 中的 Lua 代码可以近似的看成智能合约。

我们创建 Process 时,加载的每一个 Module 都会带有两个默认的 handler(handler 可以被理解为对其他 Process 开放的函数),其中一个函数就是 _eval handler。这个 handler 的主要功能就是运行 Lua 代码。比如你在 aos 中输入1+1,返回一个2,就是通过这个 handler 处理的。那么部署合约实际上,就是给 Process 发送消息,通过 _eval handler 给这个 Process 中添加可以处理业务逻辑的自定义 Handler。

其中需要注意一点,请看下方代码。这是官方开源 AO 项目中 process.lua 中的代码段落。只有当消息的发送者与 Process 的 Owner(Owner为创建合约时的钱包地址)一致时,才能执行 _eval handler。也就是说,如果 Owner 被设置为 nil 时(即把该 Process 设置为没有 Owner),那么这个 Process 中的合约就成为了一个没有人可以再修改的合约了。

另外,因为 AO 实际上是基于存储的共识范式(SCP,Storage-based Consensus Paradigm)构建的,所以运行的合约必定是可以在“存储共识”上找到,即在 Process 中运行的所有消息,包括通过 _eval handler 部署的合约代码,都存在了 Arweave 上。因此,任何人都可以在该“存储共识”上找到合约代码。

查看合约

那么来到了今天的主题,究竟如何找到合约代码呢?下面我介绍下两种方法,并给出一份抓取合约的 Python 程序。

Arweave

第一种方法当然就是直接在 Arweave 上查询(可以使用graphql https://arweave.net/graphql)。这种方法会要求在数据打包到 Arweave 后才能有用。

SU - 浏览器

第二种就是今天主要介绍的办法。由于所有的数据都会经过 SU 上链,因此也可以在 SU 上查询。个人认为每个 SU 会在自己本地有一份缓存,缓存了由自己上链的数据,因此就可以根据查询 SU 找到对应的合约代码。首先,可以根据浏览器输入地址直接查询。但是该方法的缺点也很明显:1. 有些 Process 发送和接受的消息量巨大,因此上链的数据量也巨大。但是浏览器可以加载的数据有限,经常会出现浏览器崩溃。 2. 很难从海量的数据中过滤出自己想要的合约数据。

如下图,展现的是两个时间戳内,process id 为 m3PaWzK4PTG9lAaqYQPaPdOcXdO8hYqi5Fe9NWqXd0w 的进程(AO token 进程)的所有消息。

SU - sdk

这边我写了一个小程序,借助业内大佬基于 python 写的一个 ao 的 sdk,把 Action 为 Eval 的消息过滤出来。(Action 为 Eval 的消息,即为所有由 _eval handler 处理的消息,也包括加载的合约代码。)如下图是我从SU 上面抓取的消息,其中 data 字段中的内容就是经过字符转义的一份合约代码。当然抓取的消息也会包含非部署合约代码的内容,比如执行个 1 + 1 等。但是过滤以后的消息数量已经不多了,完全可以人工选取出来合约的代码。

程序已经开源,这里是 github 的地址:https://github.com/txohyeah/ao-sc

AO token 合约

那么让我们激动的来看看 ao token 的合约代码。(抓下来的合约代码也会一并放在开源的代码仓库中)

首先,初始化状态时,定义了 TotalSupply = "21000000000000000000" 与比特币一致的发行量。

Denomination = Denomination or 12 还定义了小数点为12位。

定义了在 100000 个区块产生之前,如果执行 transfer 函数,则直接返回 "Transfer is locked"。

由于五分钟产生一个区块,那么 100000 个区块就大约到了明年 2 月份了。

还有更多相关的信息,我就不啰嗦了。大家可以愉快的浏览这份经典的AO合约。

程序使用说明

上面我介绍了抓取的合约代码,接下来我简单介绍下这个程序。很简单,相信不懂代码的人也可以轻松使用。

第一步,安装 python 3.12 版本。程序是 python 写的,安装 python 是必须的。

第二步,安装所需要的包。本程序依赖业内大佬的 sdk,依赖于 everpay。

第三步,修改 fetch_sc_record.py 中的 start_time / end_time / process。并执行 fetch_sc_record.py。

start_time 和 end_time 是你需要抓取的时间段。process 是你需要抓取合约的 Process 的 id。

第四步,对应的 Eval 消息,就会出现在 msg_eval.json 的文件中了。再浏览其中的消息,就可以找到你需要的合约代码啦!

PS:也需要和运行 aos 一样。设置 HTTPS_PROXY。


🏆 “捉虫”有奖:在本文发现错字、病句、描述有误,点我报告,可得激励。

免责声明:本文不代表 PermaDAO 的观点或立场。PermaDAO 不提供投资建议,亦不为任何项目背书。请读者遵守所在国法律,合规进行 Web3 活动。

🔗 关于 PermaDAO:Website | Twitter | Telegram | Discord | MediumYoutube

评论

所有评论

推荐阅读

  • 美国现货比特币ETF昨日净流出2.1116亿美元

    据Trader T监测,美国现货比特币ETF昨日净流出2.1116亿美元。

  • Vitalik:未来不打算投资L2或其他代币项目,仅会捐赠有价值的项目

    Vitalik 在其 8 月 31 日表示“自 2018 年以来,从未因个人获利目的而出售以太坊”的推文下回复称,“上述情况也适用于我持有的 L2 代币或其他项目代币。所有的收益都将捐赠出去,再次用于支持以太坊生态系统内的公共产品或更广泛的慈善事业。在可预见的未来,我也不打算投资 L2 或其他代币项目。我给项目提供资金的目标是支持我认为有价值的事物,特别是在生态系统的其他部分可能低估它们的情况下。展望未来,我计划仅通过捐赠来实现这一点。”

  • 亿万富翁John Paulson预计美联储将在2025年底前将利率降至2.5%

    亿万富翁投资者John Paulson预测,美国联邦储备局将在2025年底前将利率降至低至2.5%。Paulson表示,美联储在降息方面行动过慢,并将在未来几个月内采取措施降低利率。在接受彭博电视采访时,其估计联邦基金利率可能会在明年降至3%,甚至2.5%。他指出,保持高实际利率(债券收益率与当前通胀率的差距)意味着美联储在放松货币政策方面已经落后。最后还强调,总统和财政部长对经济政策的评论至关重要。

  • 火币HTX 8月战报出炉:11周年特别企划燃爆8月,全新征程蓄势待发

    火币HTX在8月交出了一份令人瞩目的成绩单,为迎接11周年的到来,平台策划了一系列丰富多彩的庆祝活动,将周年庆的热潮推向高潮。从备受期待的11周年特别企划正式启动,到多场活动燃爆8月,再到合约巅峰赛中各路高手的激烈比拼,火币HTX用一个个高光时刻展现了在行业中的领先实力。

  • Telegram创始人Pavel Durov在法国被捕后承诺将显著改善平台监管

    9 月 6 日消息,Telegram 创始人 Pavel Durov 在法国被捕后通过 Telegram 发声表示,「Telegram 是某种无政府主义天堂的说法是绝对不真实。我们每天都会删除数百万个有害的帖子和频道。并发布每日透明度报告,与非政府组织有直接的联系渠道,以便更快地处理紧急的监管请求。 Telegram 用户数快速增长到 9.5 亿,导致平台出现了成长的阵痛,使犯罪分子更容易滥用平台。这就是为什么我将显著改善这一情况作为我的个人目标。我们已经在内部开始了这个过程,并且很快会与大家分享更多关于进展的细节。」

  • 某ETH巨鲸于20分钟前用1223万USDT重新买入5,153枚ETH

    据链上分析师余烬监测,某高抛低吸 的ETH巨鲸,20 分钟前用 1223 万 USDT 重新买进了 5,153 ETH。 他最初的 3,586 枚 ETH 经过他 3 轮波段下来,现在已经变成 5,574 ETH 1⃣$3,667 出售 3,586 ETH 换成 1315 万 U,再以 $2,512 的价格买回 5,236 ETH,增加 1,650 ETH。 2⃣$2,514 卖出 4,818 ETH 换成 1211 万 U,再以 $2,378 的价格买回 5,093 ETH,增加 275 ETH。 3⃣$2,402 卖出 5,093 ETH 换成 1223 万 U,再以 $2,375 的价格买回 5,153 ETH,增加 60 ETH。

  • 火币HTX联动SunPump打造新一代Meme币生态:迎接Web3第三次掘金潮

    SunPump是Sun.io旗下的子产品,是TRON上首个公平发射的Meme币平台。其设计充分融合了易用性、公平性和责任感,为用户提供了有效且透明的Meme币交易体验。

  • 美SEC再次推迟决定环保比特币ETF上市申请

    美国证券交易委员会(SEC)再次推迟了对纽约证券交易所(NYSE)Arca申请上市的碳抵消比特币ETF的最终决定。根据9月4日的文件,决定新截止日期已被延至11月21日。该ETF旨在通过抵消碳排放,以环保方式提供比特币投资敞口,跟踪由80%比特币和20%碳信用期货组成的投资组合。Tidal Investments于2023年12月提交了基金注册申请,而NYSE Arca则在3月提交了初步申请。比特币挖矿对环境的影响引发了关注,国际货币基金组织(IMF)报告指出,加密货币挖矿占全球温室气体排放的1%。此决定的延迟还包括对纳斯达克一站式加密投资组合ETF的审批推迟。

  • Penpie发布攻击分析报告:被盗金额11,113.6枚ETH,将在Snapshot启动治理投票确定补偿计划

    Penpie发布攻击事件的时候分析报告,其中指出其平台于9月3日攻击,导致 11,113.6枚ETH(约合27,348,259美元)被盗,目前存款和取款暂停,前端恢复完成。据悉黑客利用了PendleStakingBaseUpg::batchHarvestMarketRewards() 函数中存在重入保护漏洞,通过在奖励获取过程中重新进入PendleStakingBaseUpg::depositMarket() 函数,恶意SY合约反复添加来自闪电贷的新存款,这使得攻击者能够操纵奖励代币及其发送给假Pendle市场存款人的金额,而假存款人就是攻击者本身。 现阶段,Penpie正在积极与执法机构合作,以识别和逮捕袭击者,而且还多次向黑客发送链上消息,寻求白帽谈判,但目前尚未收到回复,此外已向社区提供有关存款、取款和其他相关发展状况的最新信息。Penpie表示,后续将全面审查所有协议和智能合约以识别漏洞,对整个协议进行定期审计,实时监控和自动暂停系统,保持韧性并继续前进。此外,还将在治理论坛中开一个帖子来收集社区的建议和反馈,从而开始制定补偿计划。然后将在Snapshot上创建治理投票以最终确定补偿计划。

  • 若比特币跌破5.7万美元,主流CEX累计多单清算强度将达8.45亿

    9 月 5 日消息,据 Coinglass 数据,若比特币跌破 5.7 万美元,主流 CEX 累计多单清算强度将达 8.45 亿。反之,若比特币突破 5.9 万美元,主流 CEX 累计空单清算强度将达 5.7 亿。 注:清算图并不是展示精确的待清算的合约数目,或者精确的被清算的合约价值。清算图上的柱子展示的是其实是每个清算簇相对临近清算簇的重要性,即强度。 因此,清算图展现的是标的价格达到某个位置会被影响到什么程度。更高的「清算柱」表示价格到了之后将会因为流动性浪潮产生更加强烈的反应。