Chuyển đến nội dung chính

Tự học Solidity bài 19: Storage & Memory trong ngôn ngữ lập trình Solidity

Storage & Memory

Ngôn ngữ lập trình Solidity. Tài liệu tự học Solidity. Trong khoá học online miễn phí Tự học lập trình web3 - Tự học ngôn ngữ lập trình Solidity


Summary for English Visiter  Sandwich[] sandwiches;

  function eatSandwich(uint _index) public {

    // So instead, you should declare with the `storage` keyword
    Sandwich storage mySandwich = sandwiches[_index];
    mySandwich.status = "Eaten!";
    // If you just want a copy, you can use `memory`:
    Sandwich memory anotherSandwich = sandwiches[_index + 1];
    anotherSandwich.status = "Eaten!";
    sandwiches[_index + 1] = anotherSandwich;
  
  }Thank you!

Vị trí dữ liệu

Trong Solidity, có hai vị trí bạn có thể lưu trữ các biến - trong bộ lưu trữ Storage và trong bộ nhớ Memory.


Storage trỏ đến các biến được lưu trữ vĩnh viễn trên blockchainMemory là các biến là tạm thời và bị xóa giữa các lệnh gọi hàm. Có thể hình dung nó giống như lưu trữ dư liệu trong ổ đĩa cứng và RAM.


Hầu hết trong các trường hợp thì bạn không cần sử dụng các từ khóa này vì Solidity xử lý chúng theo mặc định. Các biến trạng thái (các biến được khai báo bên ngoài các hàm) được mặc định là Storage và được ghi vĩnh viễn vào blockchain, trong khi các biến được khai báo bên trong các hàm là Memory và sẽ biến mất khi lệnh gọi hàm kết thúc.


Tuy nhiên, đôi khi bạn cần sử dụng các từ khóa này, cụ thể là khi xử lý các structsarrays trong các hàm:


Hãy xem ví dụ dưới đây:

contract SandwichFactory {
  struct Sandwich {
    string name;
    string status;
  }

  Sandwich[] sandwiches;

  function eatSandwich(uint _index) public {

    // So instead, you should declare with the `storage` keyword, like:
    Sandwich storage mySandwich = sandwiches[_index];
    mySandwich.status = "Eaten!";


    // If you just want a copy, you can use `memory`:
    Sandwich memory anotherSandwich = sandwiches[_index + 1];
    anotherSandwich.status = "Eaten!";
    sandwiches[_index + 1] = anotherSandwich;
  
  }
}

Giải thích

Bạn khai báo với từ khóa `storage`, trong trường hợp đó `mySandwich` là một con trỏ đến` sandwich [_index] trong bộ nhớ và  lệnh mySandwich.status = “Eaten!” => điều này sẽ thay đổi vĩnh viễn sandwiches [_index]` trên blockchain.


Nếu bạn chỉ muốn một bản sao, bạn có thể sử dụng `memory`: trong trường hợp đó `anotherSandwich` sẽ chỉ là một bản sao của dữ liệu trong bộ nhớ và lệnh   anotherSandwich.status = "Eaten!"  sẽ chỉ sửa đổi biến tạm thời và không có tác dụng trên `sandwich [_index + 1]`. 


Nhưng bạn có thể làm điều này bằng lệnh gán như sau nếu bạn muốn sao chép lại các thay đổi vào bộ nhớ blockchain.

sandwich [_index + 1] = anotherSandwich;


Đừng lo lắng nếu bạn chưa hiểu rõ khi nào nên sử dụng bộ nhớ nào - trong suốt khoá họ này, chúng ta sẽ cho bạn biết khi nào sử dụng bộ nhớ và khi nào sử dụng bộ nhớ và trình biên dịch Solidity cũng sẽ đưa ra các cảnh báo để bạn biết khi nào bạn nên sử dụng một trong những từ khóa này.


Qua bài học số 19 này, chỉ cần bạn nhớ rằng có những trường hợp bạn sẽ cần phải khai báo bộ nhớ hoặc bộ nhớ một cách rõ ràng!

Thực hành luôn cho nhớ lâu bạn nhé

Nếu bạn chưa biết cách TẠO FILE, COMPILER và DEPLOY thì hãy xem lại trong bài giới thiệu nhé. Có hướng dẫn chi tiết ở đó.


BÀI TIẾP THEO: BÀI SỐ 20

HỌC TỪ ĐẦU: BÀI SỐ 1