title | tags | ||||||
---|---|---|---|---|---|---|---|
26. 合约调度器 |
|
我最近在学cairo-lang
,巩固一下细节,也写一个WTF Cairo极简教程
,供小白们使用。教程基于cairo 2.2.0
版本。
WTF Academy 社群:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo
在这一章节中,我们将介绍Cairo中的合约调度器(Dispatcher),它由接口合约自动生成,帮助你调用其他合约,使用起来像Solidity中的接口(interface)。
在定义合约时,编译器会自动生成合约调度器,帮助你调用该合约。以我们上一讲中的IMiniERC20
接口合约为例:
#[starknet::interface]
trait IMiniERC20<TContractState> {
fn name(self: @TContractState) -> felt252;
fn symbol(self: @TContractState) -> felt252;
}
它在编译时会生成一个合约调度器IMiniERC20Dispatcher
和一个对应的trait IMiniERC20DispatcherTrait
。IMiniERC20Dispatcher
是一个struct
,记录了合约地址,并包装了call_contract_syscall
,方便开发者调用目标合约的函数。
#[derive(Copy, Drop, starknet::Store, Serde)]
struct IMiniERC20Dispatcher {
contract_address: starknet::ContractAddress,
}
trait IMiniERC20DispatcherTrait<T> {
fn name(self: T) -> felt252;
fn symbol(self: T) -> felt252;
}
impl IMiniERC20DispatcherImpl of IMiniERC20DispatcherTrait<IMiniERC20Dispatcher> {
fn name(
self: IMiniERC20Dispatcher
) -> felt252 {
// 使用starknet::call_contract_syscall调用相应函数
}
fn symbol(
self: IMiniERC20Dispatcher
) {
// 使用starknet::call_contract_syscall调用相应函数
}
}
下面我们写一个合约,利用Dispatcher
调用mini_erc_20
合约。
#[starknet::contract]
mod call_mini_erc_20 {
use starknet::ContractAddress;
use super::IMiniERC20DispatcherTrait;
use super::IMiniERC20Dispatcher;
#[storage]
struct Storage {
}
#[external(v0)]
fn get_name(self: @ContractState, contract_address: ContractAddress) -> felt252 {
IMiniERC20Dispatcher{ contract_address }.name()
}
#[external(v0)]
fn get_symbol(self: @ContractState, contract_address: ContractAddress) -> felt252 {
IMiniERC20Dispatcher{ contract_address }.symbol()
}
}
需要注意的几点:
- 合约中,你需要在合约中引入
DispatcherTrait
和Dispatcher
。 - 调用时,你需要使用
IMiniERC20Dispatcher
并传入目标合约地址。
这一讲,我们介绍了Cairo中的合约调度器,由接口合约自动生成,方便你调用其他合约。