以太坊智能合約編寫part5

在 Solidity 中,Modifier函數是一種特殊的子函數,在它們附加到的主要函數之前執行。 Modifier的目的是執行所需要的檢查,並且只有在所有所需要的檢查都通過時才允許執行主要函數。 Modifier通常用於促進role-based access智能合約的某些特性或能力。 所以在以太坊等這種公開且非許可平台上建立許可式的解決方案是可能的 — — 而modifier函數是這樣做的一種常見方式。

在這個練習中,我們將繼續資產清單的智能合約篇寫。我們將限制只有合約的擁有者才能修改資產清單的內容,我們在編寫樂透智能合約也用到了此功能。

首先,我們需要一個變量來存儲合約所有者的帳號。 Solidity 中的“address”資料類型用於存儲合約和使用者的地址。 使用下面的代碼使用地址資料類型聲明一個新變量 addressOwner。

我們將假設合約的所有者是部署它到網絡的同一個帳號。 在 Solidity 中,任何交易的發起者地址都可以使用“msg.sender”這個函數找到。 但如果合約的部署者不是所有者,則可以通過input parameter將所有者地址傳遞給constructor函數。我們用以下代碼讓constructor函數變成是合約的擁有者。

接下來,我們將建立modifier函數 onlyOwner,以驗證我們的modifier函數附加到的任何交易的發起者 (msg.sender) 是否與所有者的地址匹配。 在我們的contructor函數中加入以下代碼。 在下面的代碼中,底線符號“_”會讓EVM中的modifier函數中的所有檢查都已通過,並且應該執行該modifier函數所附加的函數。 如果 msg.sender 值與所有者地址不相符,則底線符號“_”代碼之後的代碼都不會執行到。

現在我們已經定義了一個modifier函數,但它還沒有附加到任何函數上。 下一步,我們將把新的modifier函數附加到 setasset 函數。 這個modifier函數我們可以加到我們想要的任何函數,並且還可以將多個modifier函數加到同一個函數中。 如果將多個modifier函數加到同一個函數中,它們將按照它們出現的順序進行檢查。 所以我們要跟更setasset函數(如下圖)。

測試Modifier函數

接來來重新編譯與部署合約。在整個測試過程中,我們應該都能部署與更新asset。因為我們都是使用同一個帳戶。我們可以使用Remix的第二個帳號來進行資產更新的測試。

我們可以看到更新的交易是成功的,但是去get asset時卻沒有是我們用第二個帳號去更新的資料。表示我們的設定是有效的。

更新前端的index.html網頁

我們可以根據Ganache所提供的不同的accout(如下圖一),去更新前端網頁的myAccountNumber(如下圖二)。

圖一
圖二

如果我們用不對的帳號來更新資產就對看到網頁一直轉圈圈(如下圖)。

在前端網頁加上錯誤訊息

這個前端網頁看起來不夠有友善,我們需要有一些錯誤訊息被顯示出來。因為使用者大多不會是開發人員本人,他們需要被告知哪裡錯誤。所以我們分別要在合約及前端網頁加上顯示錯誤訊息的代碼。

先定義一個錯誤訊息的變量(如下圖)。

再來我們需要把錯誤訊息發射出去告知前端網頁。所以要在modifer函數中加上emit功能(如下圖)。

重新編譯與部屬該合約。請記得更新前端網頁的myAccountNumber與myContractAddress還有ABI(如果我們沒有接續part4的練習)。並把以下這段代碼加到assetContract event之前。

如果使用不對的帳號就會顯示如下的錯誤畫面

--

--

運用"雲端服務"加速企業的數位轉型願景
運用"雲端服務"加速企業的數位轉型願景

Written by 運用"雲端服務"加速企業的數位轉型願景

我們協助您駕馭名為"雲端運算"的怪獸,馴服它為您所用。諮詢請來信jason.kao@suros.com.tw. https://facebook.com/jason.kao.for.cloud

No responses yet