# 手把手教学编写BQL脚本程序 **Published by:** [Port3 Network中文社区](https://paragraph.com/@port3-network-2/) **Published on:** 2023-10-11 **URL:** https://paragraph.com/@port3-network-2/bql ## Content BQL的概念BQL(Blockchain Quest Language)是一种开放的链上交互标记语言。我们可以使用BQL描述链上操作并将其提交给执行器执行。将多个链上操作汇集成一个Workflow,从而实现链上交互的自动化、流程化执行。 BQL可以应用于各种场景中,例如:实现链上交易的批量交互,节省用户的操作时间。项目方可以通过BQL将用户直接转化为自己的协议用户。可以执行各种链上策略,例如低买高卖或跨平台套利。BQL支持超过10条的EVM公链,理论上可以使用它完成与任何合约的链上交互。BQL的结构在编写BQL脚本之前,我们需要先简单了解BQL的语法结构。以下是本次教程使用的BQL Workflow脚本示例:Workflow脚本示例BQL采用YAML语法结构,通过缩进来表达层级结构。与JSON结构相比,它们可以相互转换。在BQL脚本中,可以定义Workflow,并在其下添加多个Action。Action描述了如何执行链上交互,例如,指定要交互的协议、合约和方法,以及传递的具体参数。 使用BQL预定义的关键词(如workflow、action、protocol、call、params等),可以构建完整的脚本程序。在BQL脚本中,可以实现以下操作:定义和引用变量常规的加减乘除运算字符串的拼接和截取条件判断合约调用的参数传递和返回接收要深入了解BQL,可以阅读BQL的Specification。BQL是一种开放的语言,关键词和语法的定义还在试验阶段,BQL的标准也在梳理和形成中。但是,当前版本的BQL已能实现大多数合约交互操作。如何编写BQL脚本?SoQuest提供了BQL编辑器,您可以直接在编辑器中编写BQL程序,类似于使用Remix进行Solidity编程。我们将以在PancakeSwap上进行USDC兑换成BNB的示例为例,演示BQL的编程过程。创建BQL我们可以在SoQuest的BQL发现广场上,看到社区编写的各种公开的BQL脚本,可以点击进入任意脚本查看详情,包括其代码、执行的日志等。我们可以直接将公开的脚本Fork到自己的Library里面,当然我们也可以自主编写一个BQL的Workflow脚本。BQL Templates in discovery page创建一个BQL非常简单。只需在“BQL WORKFLOW-Discovery”页面上单击“Create My BQL”按钮即可创建BQL脚本。首先,我们需要为此脚本制定一个标题,并撰写一个简要的描述。Create BQL, fill in title and descriptionBQL代码生成我们要撰写的 Swap USDC to BNB on PancakeSwap 需要两个步骤: 第一步:执行 USDC Token 的 Approve 操作,授权给 PancakeSwap 合约。 第二步:调用 PancakeSwap 的 Swap 方法,实现 USDC 到 BNB 的兑换。 SoQuest的BQL编辑器提供了便利的BQL代码生成辅助工具。点击"How it work"可以呼出编辑器导航,跟着导航一步一步走,选择要交互的网络、协议、合约、方法即可生成Action的模板。BQL Editor Navigator实现Approve接下来,我们将使用编辑器的BQL代码生成功能,实现第一步的批准(Approve)操作。 首先,在左侧选择区块链为“BNB Chain”,协议选择“ERC20”,合约选择“USDC”,调用的函数选择“approve”。然后,点击“生成 BQL”按钮,即可生成如下代码。Using BQL generator helper to generate step1 code为了生成代码,我们需要填入具体的参数。这要求具备一定的合约和链上交互知识,只有传入准确的参数,交易才会正确运行。 在这里,我们需要填入spender和amount两个参数,这是approve方法的标准参数。spender是被授权花费token的地址,我们应该填入PancakeSwap的Router地址(0x10ED43C718714eb63d5aA57B78B54704E256024E)。而amount则是授予的额度(这里假设为 2 USDC)。由于amount下面也要用到,为了避免反复填写,我们定义一个swap_amount变量,然后通过引用的方式来使用。于是代码变成如下所示:Step1 - Approve USDC to PancakeSwap router第一步操作就这样完成了,执行过程中,执行器会自动和您的钱包交互,请求发送交易。实现Swap接下来要实现核心的第二步Swap操作。这次我们需要与PancakeSwap的Router合约进行交互。因此,我们在左侧依次选择:BNB Chain - PancakeSwap - PancakeSwap Router - swapExactTokenForETH。然后点击“Generate BQL”,即可生成下面所示的代码块。Using BQL generator helper to generate step2 codes生成的第二个action,需要填入amountIn等五个参数,我们依次填入。参数如下⬇️amountIn: 输入的金额,我们依然填 $swap_amount amountOutMin: 表示兑换得到的最小的BNB金额,用于滑点的控制,我们假定当前BNB价格是220,滑点控制在2%,那么可以大致设定为 $swap_amount / 220 * 0.98 path: 进行兑换的路径,需输入代币合约地址,这里我们是从 USDC 到 WBNB 再到 BNB,故而需填入一个USDC和WBNB的地址数组 ["0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"] to: 兑换后的BNB接收地址,我们应该填写的是自己的钱包地址,在BQL中 $ADDRESS 表示当前运行时的钱包地址 deadline: 表示兑换的时间约束,超过这个时间不确认,则取消交易,我们设定超时时间是10分钟,用 $CURRENT_TIMESTAMP + 600 表示10分钟后的时间戳 填入以上参数后,我们得到以下的代码:Step2 - call swapExactTokensForETH of PancakeSwapBQL脚本的运行BQL脚本编写完成后,我们实际上已经完成了Workflow的定义。接下来,点击“Run”即可调用执行器进行流程的执行。 在第一个步骤执行时,它会呼出我的浏览器Metamask并提示我进行Approve操作。点击“Next”后,交易会被发送到链上。 稍等片刻,交易执行并上链后,在Console里打印出了执行的日志。该日志包括执行时的action环境,并输出了对应的txid和执行状态。我们可以看到,我们的交易已成功执行。第一步完成后,继续执行第二步,调用MetaMask进行授权并发送交易。以下是输出日志,可以看到swapExactTokenForETH操作成功执行。在“My Library”中,您可以查看刚才的执行日志。Execution logs in My Library点击Txid即可跳往浏览器查看交易详情,可以看到该交易已经得到了确认,将2 USDC兑换成了 0.009 BNB。Transaction details on BSCScan定向邀请目前,SoQuest当前已经启动了BQL的定向邀请体验,仅收到邀请的KOL才可以使用BQL的功能,普通用户暂时还不能访问。KOL可以生成10枚邀请码,将邀请码分享给朋友,他们进入SoQuest输入邀请码,也可以体验BQL的完整功能。 进入BQL WORKFLOW - Discovery模块时,输入邀请码,即可获得体验资格,邀请码仅限一次使用,先到先得,欢迎使用和分享BQL。 ## Publication Information - [Port3 Network中文社区](https://paragraph.com/@port3-network-2/): Publication homepage - [All Posts](https://paragraph.com/@port3-network-2/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@port3-network-2): Subscribe to updates - [Twitter](https://twitter.com/port3community): Follow on Twitter