7*24快訊從另一個智...

從另一個智能合約調用智能合約

智能合約 是在區塊鏈環境中發布和執行的計算機程序。由於它們在區塊鏈上運行,它們可以在沒有中央方或服務器的情況下運行。它們通常寫在 堅固性 語。

在以太坊區塊鏈上,智能合約可以與現有部署的合約交互。這也適用於任何其他與EVM 兼容的區塊鏈(使用以太坊虛擬機創建的任何區塊鏈)。

以下是一些與其他智能合約交互的智能合約示例:

  • 代幣鑄造者或發行者有權調用代幣的智能合約並發行它。
  • 去中心化交易所一直以交易代幣的形式與其他智能合約交互。
  • 當您使用Chainlink Data Feed 獲得資產報價時,您的智能合約正在與資產的價格聚合器交互,這是另一個智能合約。
  • 當您使用可驗證的隨機數生成器Chainlink VRF 時,您的合約會向VRF 協調器發送請求,後者會將數字發送回您的智能合約。
  • 要使用Chailink Keepers 自動執行智能合約,您需要創建一個Keepers Upkeep,它將檢查條件並在已部署的智能合約上執行指令。

為什麼要從另一個智能合約調用函數?

有時一個應用程序需要拆分為多個智能合約。例如,我曾經創建了一個應用程序,該應用程序已經分成三個相互交互的智能合約,但我無法在以太坊主網上發布它,因為字節大小超過了允許的限制。為了發布應用程序,我不得不重構應用程序以將其拆分為五個智能合約。

另一個有趣的用例是可升級合約。區塊鍊是不可變的,這意味著智能合約的代碼一旦部署就不可能更改。但是可以創建一個代理,將函數調用委託給另一個包含實際業務邏輯的合約。

如果您想更改邏輯,可以為代理合約提供不同的目標地址,例如具有一些改進的新部署版本。可以將邏輯和數據分離到不同的智能合約中。邏輯合約可以通過代理進行更新或換出,同時保留數據合約中的所有信息。

此功能非常強大,因為它允許重用代碼,並且可以像庫一樣使用一些已部署的合約。它還可以降低部署成本,因為使用該庫的合約不需要包含所有代碼本身。

使用Solidity 調用另一個智能合約

讓我們使用Remix,一個在線網絡工具。去 remix.ethereum.org 開始。

為您的智能合約創建文件

創建一個文件以添加智能合約。是的,同一個文件中可以有多個智能合約!

  1. 在Remix 中,單擊左側欄上的第二個圖標“文件資源管理器”。
  2. 單擊“創建新文件”按鈕。
  3. 將您的文件命名為Contracts.sol

您將在此文件中的Solidity 中編寫和部署兩個智能合約。

首先,定義 SPDX 許可證類型和編譯器版本。複製並粘貼此部分:

// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

櫃檯合約

第一個合約是“計數器”,一個增加數字的腳本。

複製並粘貼此示例:

contract Counter {

    uint public number;

   

    function increment() external {

        number += 1;

    }

}

該計數器合約具有:

  • 公共變量 數字,無符號整數類型,將存儲增量的值。
  • 一個函數 增量 將number 變量的值加一。它是一個外部函數,這意味著它可以從其他合約和交易中調用。

編譯Counter 合約

  1. 在左側欄中找到一個名為“Solidity 編譯器”的按鈕。
  2. 單擊“編譯Contracts.sol”按鈕。
  3. 啟用自動編譯選項。
  4. 檢查按鈕上的綠色標誌,消息編譯成功。

部署Counter 合約

  1. 在左側面板中,轉到“部署和運行事務”按鈕。
  2. 目前,我們只有一個智能合約,因此“合約”下拉菜單中會自動選擇“計數器”。
  3. 單擊“部署”按鈕。

在左側面板底部找到合約並複制其地址。例如,我的是:

0xd9145CCE52D386f254917e481eB44e9943F39138

您應該會看到如下圖所示的內容:

顯示代碼示例的圖像。
在屏幕左下角找到合約。

與計數器交互

展開Counter 合約並:

  1. 單擊“數字”按鈕並檢查它是否為0。
  2. 點擊“增加”按鈕發送一筆交易以增加數量。
  3. 再次單擊“數字”按鈕並檢查現在它是否為1。

這是最終結果:

顯示櫃檯合約的圖像。
合約計數器的最終結果。

CounterCaller 合約

現在我們已經部署了第一個合約,讓我們創建另一個使用Counter 增量函數的合約。這是一種類似依賴注入的機制。調用者可以實例化它想要調用的合約,並且知道函數和公共變量的類型簽名。

將此代碼複製並粘貼到Contracts.sol 文件的末尾:

contract CounterCaller {

    Counter public myCounter;




    constructor(address counterAddress) {

        myCounter = Counter(counterAddress);

    }




    function counterIncrement() external {

        myCounter.increment();

    }

}

CounterCaller 合約有:

  • 一個名為的公共變量 我的計數器, 類型計數器。這意味著我們正在使用我們想要調用的合約作為類型,獲取Counter Contract 的公共函數和變量的規範。
  • 構造函數一個僅在部署過程中調用的函數,用於將myCounter 初始化為之前部署的Counter 的地址。
  • 功能 反增量 這將調用myCounter 上的函數increment,這就像一個指向智能合約Counter 的“指針”。

查看整個文件Contracts.sol:

// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;




contract Counter {

    uint public number;

   

    function increment() external {

        number += 1;

    }

}







contract CounterCaller {

    Counter public myCounter;




    constructor(address counterAddress) {

        myCounter = Counter(counterAddress);

    }




    function counterIncrement() external {

        myCounter.increment();

    }

}

編譯CounterCaller 合約

  1. 如果您已經啟用了自動編譯選項,則會對其進行編譯。
  2. 檢查按鈕上的綠色標誌,消息編譯成功。
  3. 否則,請按照前面解釋的說明編譯Counter Contract。

現在,讓我們部署CounterCaller 合約。在左側面板中,轉到“部署和運行事務”按鈕。

  1. 在下拉合同中,選擇 反來電者。
  2. 將計數器地址粘貼到按鈕部署右側的字段中。
  3. 單擊“部署”按鈕。
顯示部署ContractCaller 合約的步驟的圖像。
部署ContractCaller 合約。

與CounterCaller 交互

找到左側面板底部的CounterCaller 合約並展開它。

  1. 單擊“myCounter”按鈕並檢查它是否是計數器地址。
  2. 點擊“counterIncrement”按鈕發送一個調用Counter 合約上的函數increment 的交易。
  3. 轉到Counter 合約並單擊數字按鈕以驗證它再次增加,現在應該是2。

這是最終結果:

顯示最終結果的圖像。
與CounterCaller 合約交互。

這是一個基本示例,可幫助您了解如何使用Solidity 從另一個智能合約調用智能合約。

還有其他方法可以在Solidity 中委託合約之間的調用。重要的是要注意部署的合約總是有一個地址,如果你知道函數和公共變量,另一個智能合約可以調用它。

既然您知道如何從另一個智能合約調用智能合約,那麼您可以使用大量的用例和功能。你可以:

  • 將合同拆分為多個合同
  • 設計複雜dApp 的架構
  • 啟用可重用性
  • 創建工廠合約(可以創建其他合約的智能合約)

如果您是開發人員並希望保護您的智能合約、dApp 或協議,請考慮在您的智能合約應用程序中使用Chainlink。如需更多學習和參考資源,請查看 區塊鏈教育中心, 開發者文檔, 或者 聯繫專家. 您還可以通過以下方式直接將您的智能合約與現實世界的數據聯繫起來 去中心化的預言機.

Source Link

最受歡迎

繼續閱讀

長期持有者持有的比特幣(BTC)供應量達到最高水平

根據Glassnode 的估計,比特幣的長期持有者(LTH)目前擁有1452 萬枚BTC,創歷史新高,只剩下25% 留給短期持...

抓住Web3 遊戲的先發優勢:成功策略

Web3和區塊鏈技術的出現徹底改變了遊戲行業,為開發者和企業家提供了前所未有的機遇。 Web3 遊戲的去中心化性質為創新遊戲貨幣化模式、玩家所有權和社區參與打...

現在讀

$COOKIE, the Cookie3 Mark...

Tallinn, Estonia, March 26th, 2024...

長期持有者持有的比特幣(BTC)供應量達到最高水平...

根據Glassnode 的估計,比特幣的長期持有者(LTH)目前擁有1452 萬枚BTC,創歷史新高,只剩下25% 留給短期持有者和投機者。 儘管BTC 的價格在過去一個月中保持相對平穩,範圍在約29,000 美元至31,000 美元之間,但人們還是開始瘋狂囤積。 ...

Caldera 宣布與Espresso Syste...

Caldera 開發人員可以利用Espresso Sequence...

抓住Web3 遊戲的先發優勢:成功策略

Web3和區塊鏈技術的出現徹底改變了遊戲行業,為開發者和企業家提供了前所未有的機遇。 Web3 遊戲的去中心化性質為創新遊戲貨幣化模式、玩家所有權和社區參與打開了大門。對於那些尋求利用Web3 遊戲巨大潛力的人來說,確保先發優勢至關重要。 了解Web3 遊戲生態系統在深入研究Web3 遊戲之前,有...

Taapsee Pannu 推出NFT 平台,介紹...

企業家貢獻者表達的意見是他們自己的。 您正在閱讀《企業家印度》,這是企業家媒體的國際特許經營刊物。 女演員Taapsee Pannu 最近推出了“taapseeclub.com”,這是她自己的非同質代...

比特幣(BTC) 地址休眠超過11 年,轉移310...

經過11 年多的閒置之後,一個包含3100 萬美元BTC 的休眠比特幣地址最近突然活躍起來。 2023年7月22日,地址 轉入 將其全部餘額轉移到新地址。 早期BTC 地址復活 比特幣自2009 年以來就已經存在,因此存在多年來不活躍的休眠地址,其中包含大量BTC。這種加密貨幣的一些早期採用者能夠...

加密貨幣死了嗎?當今加密貨幣的現狀

您之前可能聽說過加密貨幣正在消亡(或比特幣已消亡)。在這篇文章中,我們將研究加密貨幣的狀態,並嘗試回答這個問題:加密貨幣現在已經死了嗎? 在我們開始之前,我們想澄清一下,本文指的是最廣泛意義上的“加密貨幣行業”; 在裡面 網絡3 感覺。該定義包括加密資產市場; 但它還包括其他非財務用例。 隨著近來加...

Chancer 可能成為體育和社交博彩領域的下一個...

加密貨幣 隨著企業財報季節的繼續,本週股市表現好壞參半。在Ne...

以太坊(ETH) 創下兩個月來CEX 流入最高紀錄...

過去一周,以太坊(ETH)流入中心化交易所(CEX)的資金量創下了過去兩個月來的最高水平。這些重大的資產變動表明ETH 的價格可能會下跌。 CoinGecko 數據顯示,第二大加密貨幣的價格一直在小幅下跌,過去一周價值下跌了2.5%。截至撰寫本文時,以太幣易手價格為1,892.65 美元,過去24...

新的DeFi 法案有“不可行的義務”

加密貨幣創新委員會表示,新的反洗錢法案沒有為DeFi 中的非法金融...

幣安大幅削減成本,瑞波幣為美國銀行和加密貨幣風險投...

美國證券交易委員會(SEC)對加密貨幣公司的打擊似乎嚴重影響了幣安的業務。據報導,在過去幾週內,該加密貨幣交易所解雇了1,000 多名員工,並削減了一些福利。 幣安表示,“當前的市場環境和監管環境”導致利潤下降,這表明可能正在進行更多削減。一位發言人告訴Cointelegraph,該公司將考慮縮減“...

Automata 雙週更新:第48 期| 通過自動...

迎接新的季度意味著設定我們的意圖並為團隊規劃下一步的行動。幕後醞釀的一切——合作、產品功能和營銷發布——很難抑制我們的興奮。我們一開始就在1RPC(2 個備受期待的第2 層主網)上添加了對Linea 和Base 的支持。科技載體更新頁腳以顯示界面版本平滑的用戶體驗 USDC CCTP 支持 關於仲裁...