---
title: "與智能合約互動"
description: "逐步說明如何透過更新智能合約變數,與已部署的 Ethereum 智能合約互動。"
---

# 與智能合約互動

在開始本教學（智能合約互動）之前，你應該已經完成第一部分 — [Hello World Smart Contract](https://www.alchemy.com/docs/how-to-deploy-a-smart-contract-to-the-sepolia-testnet) \(建立並部署智能合約\)。在第三部分中，我們會介紹如何[將合約提交到 Etherscan](https://www.alchemy.com/docs/best-practices-for-deploying-a-smart-contract-on-evm-mainnets-1)，讓任何人都能了解如何與它互動！

<ExternalVideo
  url="https://www.youtube.com/watch?v=sQJ-XQBzEuc&embeds_referring_euri=https%3A%2F%2Fcdn.iframe.ly%2F&source_ve_path=OTY3MTQ&feature=emb_imp_woyt&ab_channel=Alchemy"
  provider="youtube"
  providerUid="sQJ-XQBzEuc"
/>

## 第二部分：與你的智能合約互動

我們已經成功將智能合約部署到 ropsten 網路，現在來測試一下我們的 web3 技能，跟它互動吧！

### 步驟 1：建立 interact.js 檔案

這是我們撰寫互動腳本的檔案。我們會使用你在第一部分安裝過的 Ethers.js 函式庫。

在 hardhat 教學中的 `scripts/` 資料夾內（若是 Truffle 教學則在你的家目錄下），建立一個名為 `interacts.js` 的新檔案，並加入以下程式碼：

### 步驟 2：更新你的 .env 檔案

我們會用到新的環境變數，因此需要在 `.env` 檔案中定義它們，並確保 `dotenv` 模組會載入這些變數。

我們需要加入 Alchemy `API\_KEY` 的定義，以及你的智能合約部署所在的 `CONTRACT\_ADDRESS`。

你的 `.env` 檔案看起來應該會像這樣：

### 步驟 3：取得你的合約 ABI

我們的合約 ABI \(Application Binary Interface\) 是與智能合約互動的介面。你可以在我們的 [eth_getLogs 深度解析](https://www.alchemy.com/docs/deep-dive-into-eth_getlogs)文章中了解更多關於 Contract ABI 的內容。Hardhat（以及 Truffle）會自動為我們產生 ABI，並將它存放在 HelloWorld.json 檔案中。

為了使用它，我們需要在 `contract-interact.js` 檔案中加入以下程式碼來解析內容：

如果你想查看 ABI，可以把它印到 console：

若要執行 `interact.js` 並在 console 中看到印出的 ABI，請到終端機執行

#### Hardhat:

#### Truffle:

### 步驟 4：建立合約的實例

為了與我們的合約互動，我們需要在程式碼中建立它的實例。使用 Ethers.js 時，我們需要處理三個概念：

1. Provider - 這是一個節點提供者，讓你能夠讀取及寫入區塊鏈。
1. Signer - 這代表一個有能力對交易簽章的 Ethereum 帳戶。
1. Contract - 這是一個 Ethers.js 物件，代表部署在鏈上的特定合約。

我們會使用上一步取得的合約 ABI 來建立合約的實例：

你可以在 Alchemy 的 Ethers.js 說明文章中閱讀更多關於 [Providers](https://www.alchemy.com/docs)、[Signers](https://www.alchemy.com/docs) 和 [Contracts](https://www.alchemy.com/docs) 的內容。

### 步驟 5：讀取 init message

還記得我們用 `theinitMessage = "Hello world!"` 部署合約時的操作嗎？現在我們要讀取儲存在智能合約中的那則訊息，並把它印到 console。

在 JavaScript 中，我們使用非同步函式來與網路互動。

使用以下程式碼來呼叫智能合約中的 `message` 函式，並讀取 init message：

在終端機用 `npx hardhat run scripts/interact.js` 執行該檔案後，我們應該會看到這樣的回應：

恭喜！你剛剛成功從 Ethereum 區塊鏈讀取了智能合約的資料，做得好！

### 步驟 6：更新訊息

現在除了讀取訊息之外，我們還可以用 `update` 函式來更新儲存在智能合約中的訊息！很酷吧？

要做到這點，我們可以直接在已實例化的 Contract 物件上呼叫 `update` 函式，像這樣：

注意我們對回傳的交易物件呼叫了 `.wait\(\)`。這能確保我們的腳本會等待交易在區塊鏈上被打包後才繼續執行。如果省略這行，你的腳本可能無法看到合約中更新後的 `message` 值。

### 步驟 7：讀取新訊息

你應該可以重複步驟 5 來讀取更新後的 `message` 值。花點時間看看你能不能做出必要的修改，印出那個新的值！

如果你需要提示，這時你的 `interact.js` 檔案應該會長這樣：

現在只要執行腳本，你就應該能在終端機看到舊訊息、更新中的狀態，以及新訊息被印出來！

`npx hardhat run scripts/interact.js --network ropsten`

在執行該腳本時，你可能會注意到 `Updating the message... ` 這個步驟需要一段時間才能載入出新訊息。這是因為挖礦過程的關係！如果你想知道如何在交易被挖礦時追蹤它的狀態，可以造訪 Alchemy mempool 來查看你交易的狀態（不論是 pending、已挖礦，還是被網路丟棄）。如果你的交易被丟棄了，也可以去 Ropsten Etherscan 搜尋你的交易雜湊來確認。

就這樣！你現在已經部署並且和一個 Ethereum 智能合約互動過了。如果你想把你的合約發佈到 Etherscan，讓任何人都知道如何與它互動，可以看看第三部分：[將你的智能合約提交到 etherscan](https://www.alchemy.com/docs/best-practices-for-deploying-a-smart-contract-on-evm-mainnets-1)！🎉

完成本教學後，歡迎在 Twitter 上標記我們 @Alchemy，讓我們知道你的體驗如何，或提供任何意見回饋！
