Tiêu đề gốc: "Giới thiệu về chủ nghĩa tối giản Solidity: 4. Lưu trữ dữ liệu biến đổi và lưu trữ phạm vi/bộ nhớ/dữ liệu cuộc gọi"
Tác giả gốc: 0xAA
Gần đây tôi đang học lại về Solidity, củng cố các chi tiết và cũng viết một "Giới thiệu về Solidity Minimalist" cho người mới sử dụng ( Các chuyên gia lập trình có thể tìm thêm bài hướng dẫn khác), 1-3 bài giảng sẽ được cập nhật mỗi tuần.
Tất cả các mã đều là nguồn mở tại: github.com/AmazingAng/WTFSolidity
Tất cả các mã đều là nguồn mở tại: github.com/AmazingAng/WTFSolidity
p>
Loại tham chiếu: Bao gồm mảng (array), cấu trúc (struct) và ánh xạ (mapping ), loại biến này chiếm nhiều dung lượng và địa chỉ được truyền trực tiếp khi gán (tương tự như một con trỏ). Vì loại biến này phức tạp và chiếm nhiều dung lượng lưu trữ nên khi sử dụng chúng ta phải khai báo vị trí lưu trữ dữ liệu.
Có ba loại vị trí lưu trữ dữ liệu vững chắc: lưu trữ, bộ nhớ và calldata. Các địa điểm lưu trữ khác nhau có chi phí gas khác nhau. Dữ liệu loại lưu trữ được lưu trữ trên chuỗi, tương tự như đĩa cứng của máy tính và tiêu tốn nhiều gas hơn; các loại bộ nhớ và dữ liệu cuộc gọi được lưu trữ tạm thời trong bộ nhớ và tiêu thụ ít gas hơn. Cách sử dụng chung:
1.storage: Theo mặc định, các biến trạng thái trong hợp đồng là bộ nhớ và được lưu trữ trên chuỗi.
2.memory: Các tham số và biến tạm thời trong hàm thường được lưu trữ trong bộ nhớ chứ không phải trên chuỗi.
3. calldata: tương tự như bộ nhớ, được lưu trữ trong bộ nhớ chứ không phải trên chuỗi. Sự khác biệt so với bộ nhớ là các biến calldata không thể sửa đổi (không thay đổi) và thường được sử dụng làm tham số của hàm. Ví dụ:

Khi các loại lưu trữ khác nhau gán giá trị cho nhau, đôi khi sẽ tạo ra các bản sao độc lập (sửa đổi biến mới sẽ không ảnh hưởng đến biến ban đầu), đôi khi một tham chiếu được tạo ra (sửa đổi biến mới sẽ ảnh hưởng đến biến ban đầu). Các quy tắc như sau:
1. Khi bộ nhớ (biến trạng thái của hợp đồng) được gán cho bộ nhớ cục bộ (trong hàm), một tham chiếu sẽ được tạo và việc thay đổi biến mới sẽ ảnh hưởng đến biến ban đầu Biến đổi. Ví dụ:

1.storage Được gán vào bộ nhớ, một bản sao độc lập sẽ được tạo ra, việc sửa đổi cái này sẽ không ảnh hưởng đến cái kia và ngược lại. Ví dụ:

1.memory Việc gán một giá trị vào bộ nhớ sẽ tạo ra một tham chiếu và việc thay đổi biến mới sẽ ảnh hưởng đến biến ban đầu.
2. Trong các trường hợp khác, việc gán các biến vào bộ lưu trữ sẽ tạo ra các bản sao độc lập và việc sửa đổi một biến sẽ không ảnh hưởng đến biến kia.
Có ba loại biến trong Solidity được chia theo phạm vi, đó là Biến trạng thái, biến cục bộ và biến toàn cục
Biến trạng thái là biến dữ liệu của họ được lưu trữ trên chuỗi và có thể được truy cập bởi tất cả các chức năng trong hợp đồng. , lượng khí tiêu thụ cao. Các biến trạng thái được khai báo trong hợp đồng và bên ngoài hàm:

Chúng ta có thể thay đổi giá trị của biến trạng thái trong hàm:

Biến cục bộ chỉ là Biến hợp lệ trong quá trình thực thi hàm sẽ không hợp lệ sau khi hàm thoát. Dữ liệu của các biến cục bộ được lưu trữ trong bộ nhớ, không được tải lên chuỗi và tiêu thụ gas thấp. Các biến cục bộ được khai báo trong hàm:

Biến toàn cục là các biến hoạt động trong phạm vi toàn cục và đều là những từ khóa dành riêng vững chắc. Chúng có thể được sử dụng trực tiếp mà không cần khai báo trong hàm:

Trên cùng Trong ví dụ này, chúng tôi sử dụng ba biến toàn cục thường được sử dụng: msg.sender, block.number và msg.data, lần lượt biểu thị địa chỉ bắt đầu yêu cầu, chiều cao khối hiện tại và dữ liệu yêu cầu. Sau đây là một số biến toàn cục thường được sử dụng. Để có danh sách đầy đủ hơn, vui lòng xem Link:
· blockhash(uint blockNumber): (byte32) Giá trị băm của khối đã cho – chỉ áp dụng cho 256 khối nhiều nhất khối gần đây, không chứa khối hiện tại.
· block.coinbase: (địa chỉ phải trả) Địa chỉ của công cụ khai thác khối hiện tại
· block.gaslimit: (uint) Gaslimit của khối hiện tại
· block.number: (uint) Số của khối hiện tại
· block.timestamp: (uint) Dấu thời gian của khối hiện tại, tính bằng giây kể từ kỷ nguyên unix
· gasleft( ): (uint256) gas còn lại
· msg.data: (byte calldata) dữ liệu cuộc gọi hoàn tất
· msg.sender: (địa chỉ phải trả) người gửi tin nhắn (người gọi hiện tại)
· msg.sig: (byte4) bốn ký tự đầu tiên của Phần calldata (mã định danh hàm)
· msg.value: (uint) Giá trị Wei được gửi bởi giao dịch hiện tại
p>
· now : (uint) dấu thời gian của khối hiện tại
Trong Bài giảng 4, chúng tôi đã giới thiệu các loại tham chiếu, vị trí dữ liệu và phạm vi biến đổi một cách vững chắc. Trọng tâm là việc sử dụng ba từ khóa lưu trữ, bộ nhớ và dữ liệu cuộc gọi. Lý do cho sự xuất hiện của chúng là để tiết kiệm không gian lưu trữ hạn chế trên dây chuyền và giảm lượng khí đốt. Trong bài giảng tiếp theo chúng tôi sẽ giới thiệu về mảng trong các kiểu tham chiếu.
Liên kết gốc
Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:
Nhóm Telegram đăng ký: https://t.me/theblockbeats
Nhóm Telegram thảo luận: https://t.me/BlockBeats_App
Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia