1.17 Storage, Memory, Calldata 同學通訊錄

閱讀時間約 5 分鐘
memory, calldata, storage

memory, calldata, storage

StorageMemoryCalldata是用於定義變量存儲位置的關鍵字,它們各自有不同的適用情境和用法。

Storage

Storage是用於存儲合約狀態變量的位置。這些變量存儲在區塊鏈上,並且在合約的生命週期內持續存在。Storage變量的變化會影響合約的狀態,並且會持久化存儲在區塊鏈上。當你需要修改合約的狀態或者存儲長期存在的數據時,應該使用Storage

Memory

Memory是用於存儲函數內部的臨時變量的位置。這些變量只在函數被調用時存在,並且在函數結束時被清除。Memory變量可以被修改,並且可以用於函數參數和函數內部的變量。當你需要在函數內部處理暫時數據,並且不需要將數據持久化存儲在區塊鏈上時,應該使用Memory

Calldata

Calldata是用於存儲外部函數參數的位置。這些參數是不可修改的,並且只在函數被調用時存在。Calldata變量不能被修改,並且在函數結束時不會被清除。當你需要在外部函數中處理不可修改的數據時,應該使用Calldata

適用情境

  • Storage:適用於需要持久化存儲在區塊鏈上的數據,例如合約的狀態變量。
  • Memory:適用於函數內部的臨時數據處理,例如函數參數和函數內部的變量。
  • Calldata:適用於外部函數的不可修改參數,例如外部函數的參數。

用法

  • Storage:在合約的狀態變量宣告時使用。
  • Memory:在函數內部變量宣告時使用。
  • Calldata:在外部函數參數宣告時使用。


學校通訊錄合約 - 包含添加學生資訊、查詢學生資訊和更新學生資訊的功能。

  • addStudent函數使用calldata來接收參數,因為這些參數是從外部呼叫函數時傳遞的,並且不需要修改。
  • getStudent函數使用storage來存儲學生資訊,因為這些資訊需要永久存儲在區塊鏈上,並且可以被合約中的任何函數訪問和修改。
  • updateStudent函數使用memory來臨時存儲新的學生資訊,因為這些資訊只在函數執行期間需要,並且不需要永久存儲在區塊鏈上。
  • storage 允許學校管理員更新學生的聯繫方式, 且我們將使用storage來存儲學生的資訊。
  • updateStudentContact,該函數允許學校管理員更新學生的聯繫方式。這個函數使用storage來直接修改學生資訊,因為我們需要修改存儲在區塊鏈上的數據。這種方法避免了使用臨時變量(如memory)來複製數據,從而節省了gas成本並提高了效率。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SchoolDirectory {
// 使用mapping來儲存學生資訊,鍵為學生ID,值為學生資訊
mapping(uint => Student) public students;

// 學生資訊結構
struct Student {
string name;
uint age;
string contact;
}

// 添加學生資訊的函數,使用calldata來接收參數
function addStudent(uint id, string calldata name, uint age, string calldata contact) external {
students[id] = Student(name, age, contact);
}

// 查詢學生資訊的函數,使用storage來存儲學生資訊
function getStudent(uint id) external view returns (string memory name, uint age, string memory contact) {
Student storage student = students[id];
return (student.name, student.age, student.contact);
}

// 更新學生資訊的函數,使用memory來臨時存儲資訊
function updateStudent(uint id, string calldata name, uint age, string calldata contact) external {
Student memory newStudent = Student(name, age, contact);
students[id] = newStudent;
}

// 更新學生聯繫方式的函數,使用storage來存儲學生資訊
function updateStudentContact(uint id, string calldata newContact) external {
// 使用storage關鍵字來直接修改學生資訊
students[id].contact = newContact;
}
}
    尋大神腳印, 亦步亦趨。
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    interface的主要作用是定義合約的函數規範,但不包含具體的實現。它提供了一種清晰的方式來描述合約之間的互動方式,從而使得不同的合約可以進行互操作性。 學校圖書館系統, 包括兩個主要的合約:Library合約和Student合約。 Library合約:這個合約負責管理圖書館的書籍,包括書籍的
    ForLoop // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract ArtAuction { mapping(uint => uint) public artworks; uint public con
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract GiftShop { mapping(address => uint) public loyaltyPoints; mapping(string =>
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract TuitionPayment { address public school; uint public tuitionFee; mapping(
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract SchoolGreetings { address public principal; event GreetingReceived(string g
    一個智能合約,名為 UniformShop,它用於販售學校制服。 我們希望合約在收到以太幣後自動處理購買制服的操作。 UniformShop 合約定義了一個 fallback 函式,用於接收以太幣並購買制服。 當有人向合約地址轉帳時,如果轉帳金額足夠支付制服的價格,則 fallback 函式將
    interface的主要作用是定義合約的函數規範,但不包含具體的實現。它提供了一種清晰的方式來描述合約之間的互動方式,從而使得不同的合約可以進行互操作性。 學校圖書館系統, 包括兩個主要的合約:Library合約和Student合約。 Library合約:這個合約負責管理圖書館的書籍,包括書籍的
    ForLoop // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract ArtAuction { mapping(uint => uint) public artworks; uint public con
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract GiftShop { mapping(address => uint) public loyaltyPoints; mapping(string =>
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract TuitionPayment { address public school; uint public tuitionFee; mapping(
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract SchoolGreetings { address public principal; event GreetingReceived(string g
    一個智能合約,名為 UniformShop,它用於販售學校制服。 我們希望合約在收到以太幣後自動處理購買制服的操作。 UniformShop 合約定義了一個 fallback 函式,用於接收以太幣並購買制服。 當有人向合約地址轉帳時,如果轉帳金額足夠支付制服的價格,則 fallback 函式將
    你可能也想看
    Google News 追蹤
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
    Thumbnail
    市場盤勢,步步為營的一天 ▍盤勢分析: 今日的加權指數,在開盤平穩後,似乎開始演繹一幕鈍刀割肉的戲碼,緩緩地下滑。最終下跌185.08點,以17161.79點作收,跌破了季線的支撐。櫃買指數表現更為劇烈,下挫3.61點,雖然仍守在季線之上,但風雲變色的跡象已隱隱在市。 ▍籌碼分析:
    大盤熱錢資金目前流往儲能 資安 通路 AI
    Thumbnail
    1/8怪怪分點籌碼3149正達續創短高價 周一神盾集團也多檔漲停
    大家早安 預言的季線支撐,就差不多快到了。 目前低283、季線224 昨天這樣大殺盤,都是能預測到的 而非事後論。 那今天怎麼走? 由於夜盤只有測試壓力, 在群組提到,反彈283+50~100點 然後360、380注意 果真高點落在370、收329 若300以上做多,至少短打50
    Thumbnail
    臺股指數及OTC低走,外資賣超,中共和伊朗等地緣風險增加投資不確定性,值得觀察AI相關產業和半導體行情。留意聯發科股價止跌,臺積電法說對半導體業的展望。近期波動市場將是選股機會。
    Thumbnail
    魯蛇如我又在處理做不好的部位了,還好順利解決。
    Thumbnail
    散步時,婆西有感而發說在超市看到徵人啟事,突然發現,這輩子從來沒有應徵過。 我:「這輩子都是我去應徵,你要和我交換嗎?」 「不要。」 接著就聊到應徵工作很囧的往事,例如老闆會問:「可以接受加班嗎?」 「不可以。」 我這種應徵工作常碰壁的普通人,很想了解不用應徵工作,所謂贏家的人生。
    財富自由的基本公式 主動薪資收入+被動收入-投資金 -保險費-生活基本開銷=>還能有結餘 有結餘處可以存款,以應不時之需。生活基本開銷一班有房貸或租金、水、電費、網路費、房貸、買食物等。保險費是為了因應緊急情況的大筆支出。從上面的公式看起來照邏輯來說就是增加主動或被動收入,再來降低開銷。 可行的步驟
    Thumbnail
    週二21:00-23:00首播、 週六22:00-00:00重播(CST)。 FM98.1 News98電台。www.news98.com.tw 點選「線上收聽」鏈結即可。 亦可利用 hiChannel 收聽。(小秘密:週六22:00重播有bonus track喔。) 1967是搖滾史瘋狂大豐收的
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
    Thumbnail
    市場盤勢,步步為營的一天 ▍盤勢分析: 今日的加權指數,在開盤平穩後,似乎開始演繹一幕鈍刀割肉的戲碼,緩緩地下滑。最終下跌185.08點,以17161.79點作收,跌破了季線的支撐。櫃買指數表現更為劇烈,下挫3.61點,雖然仍守在季線之上,但風雲變色的跡象已隱隱在市。 ▍籌碼分析:
    大盤熱錢資金目前流往儲能 資安 通路 AI
    Thumbnail
    1/8怪怪分點籌碼3149正達續創短高價 周一神盾集團也多檔漲停
    大家早安 預言的季線支撐,就差不多快到了。 目前低283、季線224 昨天這樣大殺盤,都是能預測到的 而非事後論。 那今天怎麼走? 由於夜盤只有測試壓力, 在群組提到,反彈283+50~100點 然後360、380注意 果真高點落在370、收329 若300以上做多,至少短打50
    Thumbnail
    臺股指數及OTC低走,外資賣超,中共和伊朗等地緣風險增加投資不確定性,值得觀察AI相關產業和半導體行情。留意聯發科股價止跌,臺積電法說對半導體業的展望。近期波動市場將是選股機會。
    Thumbnail
    魯蛇如我又在處理做不好的部位了,還好順利解決。
    Thumbnail
    散步時,婆西有感而發說在超市看到徵人啟事,突然發現,這輩子從來沒有應徵過。 我:「這輩子都是我去應徵,你要和我交換嗎?」 「不要。」 接著就聊到應徵工作很囧的往事,例如老闆會問:「可以接受加班嗎?」 「不可以。」 我這種應徵工作常碰壁的普通人,很想了解不用應徵工作,所謂贏家的人生。
    財富自由的基本公式 主動薪資收入+被動收入-投資金 -保險費-生活基本開銷=>還能有結餘 有結餘處可以存款,以應不時之需。生活基本開銷一班有房貸或租金、水、電費、網路費、房貸、買食物等。保險費是為了因應緊急情況的大筆支出。從上面的公式看起來照邏輯來說就是增加主動或被動收入,再來降低開銷。 可行的步驟
    Thumbnail
    週二21:00-23:00首播、 週六22:00-00:00重播(CST)。 FM98.1 News98電台。www.news98.com.tw 點選「線上收聽」鏈結即可。 亦可利用 hiChannel 收聽。(小秘密:週六22:00重播有bonus track喔。) 1967是搖滾史瘋狂大豐收的