MAPO Developer Docs
LearnDevelopRunWhitePaperBRC-201
繁體中文
繁體中文
  • 概述
  • 學習
    • 關於 MAP 協議
      • 背景
      • 介紹 MAP 協議
      • MAP 協議的發展歷程
    • 與其他跨鏈模型進行比較
      • MAP 協議與Cosmos& Pokadot
      • MAP vs. 其他無中繼鏈的跨鏈解決方案
    • 技術機制
      • MAP協議'的技術機制
      • 三層結構
      • MAP協議層
      • MAP中繼鏈
        • 概念
        • 與所有鏈的同構性
        • 驗證& 維護網絡
      • MAPO服務(MOS)層
      • MAPO應用層
      • ZK 支持下的輕節點
    • 燃氣費收費模式
    • DAO
    • MAP協議的構建
      • 開發者
      • 驗證者
      • 維護者
      • 信使
      • 流動資金提供者
      • 終端用戶
    • Tokenomics
    • 購買$MAP
  • 開發
    • MAP Relay Chain
      • 入門
        • 構建
        • 製作私有鏈
        • 如何投票
        • 如何取出質押
        • 集成到交易所
        • EVM 兼容鏈接入MAP 中繼鏈
      • 共識
        • 概述
        • Proof-of-Stake
        • 驗證器
          • 驗證器
          • 鎖定的MAP
        • 選舉
        • 獎勵
        • 聚合印章
      • 合約
        • 預編譯合約
        • 創世紀合約
          • ABI
            • AccountsABI
            • ElectionABI
            • EpochRewardsABI
            • LockedGoldABI
            • ValidatorsABI
          • Deploy
      • Marker
        • Genesis
        • 驗證器
        • Vote
        • ContractOwner
        • Common
    • 輕型客戶端
      • 基於輕型客戶端的驗證
      • MAPO輕型客戶端
        • EVM鏈
        • Near
      • 輕客戶端
        • 客戶端管理器
        • BNB 鏈
        • NEAR 協議
        • Polygon(Matic)
        • Ethereum 2.0
        • 維護者
    • MOS 全鏈服務
      • MOS消息指南
        • How It Works
      • MOS 指南
        • 運行原理
        • 如何使用
          • 在Evm鏈的方法
          • 在NEAR協議上
        • 中繼鏈合約
        • EVM鏈合約
        • NEAR 協議合約
      • 信使
      • API
    • OmniChain實例
      • Omni App
      • OmniDictionary
    • API & SDK
      • Butter SDK
      • Atlas JSON RPC
      • Atlas Consensus API
      • MAP掃描API
    • 最新接鏈進展以及對應地址
  • 運行
    • 如何成爲一個新的驗證者
    • 如何成爲一個新的驗證者[進階版]
    • 取出或撤回
Powered by GitBook
On this page

Was this helpful?

  1. 開發
  2. OmniChain實例

OmniDictionary

簡要描述;簡介

OmniDictionary 是一個簡單的 dApp demo,演示瞭如何通過 mapo omnichain 服務合約處理跨鏈合約交互。 它基本上允許用戶發送請求以使用簡單的鍵及其對應的值在外部鏈上的字典(簡單映射)中添加新條目。

技術細節

為了實現跨鏈合約執行,開發者首先需要在一個邏輯合約中處理他們的執行邏輯,然後通過mapo omnichain服務合約通過'TransferOut'方法從源鏈發送生成的調用數據。

在我們的示例中,'TransferOut' 方法被調用如下,調用數據也在中間過程中生成:

function sendDictionaryInput(uint256 _tochainId,bytes memory _target,string memory _key,string memory _val) external {

        bytes memory data = encodeDictionaryInput(_key,_val);

        IMOSV3.CallData memory cData = IMOSV3.CallData(_target,data,50000,0);

        require(
            IMOSV3(mos).transferOut(
                _tochainId,
                cData
            ),
            "send request failed"
        );
}

其次,信使獲取上述交易產生的事件並構建相應的證明,然後將它們打包在一起發送到 MAP 中繼鏈上的 mapo omnichain 服務合約:

function transferOut(uint256 _toChain, CallData memory _callData) external override
    payable
    nonReentrant
    whenNotPaused
    checkBridgeable(Utils.fromBytes(_callData.target), _toChain)
    returns(bool)
    {
        require(_toChain != selfChainId, "Only other chain");
        require(_callData.gasLimit >= gasLimitMin ,"Execution gas too low");
        require(_callData.gasLimit <= gasLimitMax ,"Execution gas too high");

        require(_callData.value == 0,"Not supported at present value");

        (uint256 fee,address receiverFeeAddress) = feeService.getMessageFee(_toChain,_callData.target);
        //require(fee > 0,"Address has no message fee");
        uint256 amount = msg.value;
        require(amount == fee, "Need message fee");
        if (amount > 0) {
            TransferHelper.safeTransferETH(receiverFeeAddress, amount);
        }

        bytes32 orderId = _getOrderID(msg.sender, _callData.target, _toChain);

        bytes memory fromAddress = Utils.toBytes(msg.sender);

        bytes memory callData = abi.encode(_callData);

        emit mapMessageOut(selfChainId, _toChain, orderId,fromAddress,callData);
        return true;
    }

最後,信使將重複上述過程,並通過“TransferIn”方法將所有數據發送到目標鏈,該方法還將執行用戶輸入的調用數據:

function transferIn(uint256 _chainId, bytes memory _receiptProof) external nonReentrant whenNotPaused {
        require(_chainId == relayChainId, "invalid chain id");
        (bool sucess, string memory message, bytes memory logArray) = lightNode.verifyProofData(_receiptProof);
        require(sucess, message);
        IEvent.txLog[] memory logs = EvmDecoder.decodeTxLogs(logArray);

        for (uint i = 0; i < logs.length; i++) {
            IEvent.txLog memory log = logs[i];
            bytes32 topic = abi.decode(log.topics[0], (bytes32));

            if (topic == EvmDecoder.MAP_MESSAGE_TOPIC && relayContract == log.addr) {
                (, IEvent.dataOutEvent memory outEvent) = EvmDecoder.decodeDataLog(log);

                if(outEvent.toChain == selfChainId){
                    _messageIn(outEvent);
                }
            }
        }
        emit mapTransferExecute(_chainId, selfChainId, msg.sender);
    }

目標字典最終由此設定

function setDictionaryEntry(string memory _key,string memory _val) external returns(bool) {
        require(whitelist[msg.sender],"access denied");
        dictionary[_key] = _val;
        return true;
    }

以上所有代碼都可以在我們的 github repo 中找到。

PreviousOmni AppNextAPI & SDK

Last updated 1 year ago

Was this helpful?

OmniDictionary Example contract
MAP Omnichain Service contracts