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
    查看全部
    發表第一個留言支持創作者!
    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
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
    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
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
    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是搖滾史瘋狂大豐收的