Skip to content

Latest commit

 

History

History

26_Dispatcher

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
title tags
26. 合约调度器
cairo
starknet
interface
abi
erc20
dispatcher

WTF Cairo极简教程: 26. 合约调度器

我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 2.2.0版本。

推特:@0xAA_Science@WTFAcademy_

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 IMiniERC20DispatcherTraitIMiniERC20Dispatcher是一个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()
    }
}

需要注意的几点:

  • 合约中,你需要在合约中引入DispatcherTraitDispatcher
  • 调用时,你需要使用IMiniERC20Dispatcher并传入目标合约地址。

总结

这一讲,我们介绍了Cairo中的合约调度器,由接口合约自动生成,方便你调用其他合约。