Phần lớn chi phí gas của Ethereum tập trung vào việc lưu trữ. Mỗi hoạt động thay đổi trạng thái (lưu trữ) của mạng Ethereum thường tốn kém. Do đó, việc tập trung vào cách lưu giữ và truy cập dữ liệu có thể giúp giảm chi phí đáng kể. Trong phần này, chúng ta sẽ xem xét một số cách tối ưu hóa bộ nhớ bằng Remix.
Chuỗi khối Ethereum cung cấp lưu trữ vĩnh viễn. Mọi thứ được lưu trên blockchain sẽ có sẵn miễn là blockchain tồn tại, nhưng sự lâu dài này phải trả giá. Tối ưu hóa lưu trữ không chỉ giảm chi phí mà còn đảm bảo rằng trạng thái toàn cầu của Ethereum được sử dụng hiệu quả.
Solid lưu trữ các biến trong các khe. Mỗi khe là 32 byte. Khi các biến có thể vừa trong một khe duy nhất, chúng có thể được đọc hoặc cập nhật bằng một thao tác SLOAD hoặc SSTORE tương ứng.
Hãy xem xét hai hợp đồng:
Độ vững chắc
// Không có Tối ưu hóa
độ vững chắc pragma ^0.8.9;
hợp đồng UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Độ rắn
// Với Tối ưu hóa
độ rắn pragma ^0.8.9;
hợp đồng OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
Triển khai cả hai hợp đồng trong Remix và lưu ý sự khác biệt về khí khi tương tác với các biến của chúng.
Trong phiên bản được tối ưu hóa, cả value1
và value2
đều chia sẻ một khe 32 byte.
Khi bạn sử dụng xong khe lưu trữ, đặc biệt là lưu trữ dữ liệu tạm thời, bạn có thể xóa hoặc loại bỏ khe cắm đó để được hoàn lại tiền xăng.
Độ rắn
độ rắn pragma ^0.8.9;
ví dụ hoàn tiền hợp đồng {
uint256 public temporaryData;
hàm storeTemporaryData(uint256 data) public {
temporaryData = data;
}
function clearTemporaryData() public {
delete temporaryData;
}
}
Triển khai hợp đồng này trong Remix.
Lưu trữ một số dữ liệu tạm thời và sau đó xóa nó.
Kiểm tra chi phí gas. Lưu ý khoản tiền hoàn lại gas bạn nhận được cho thao tác delete
.
Nếu dữ liệu không cần phải truy cập trên chuỗi, hãy cân nhắc việc ghi nhật ký dữ liệu đó như một sự kiện thay vì lưu trữ dữ liệu đó. Sự kiện rẻ hơn nhiều so với hoạt động lưu trữ.
Độ rắn
độ rắn pragma ^0.8.9;
hợp đồng EventExample {
sự kiện DataStored(uint256 data);
hàm storeData(uint256 data) public {
emit DataStored(data);
}
}
Triển khai và tương tác với hợp đồng trong Remix.
Lưu ý chi phí gas rẻ hơn khi so sánh với việc lưu trữ.
Điều quan trọng là phải thực hành ngay bây giờ khi bạn đã nắm vững một số phương pháp tối ưu hóa bộ nhớ cơ bản. Tham gia vào các ví dụ được cung cấp và thử nghiệm tạo ra ví dụ của riêng bạn. Trong phiên tiếp theo, chúng ta sẽ đi sâu hơn vào việc tối ưu hóa khả năng hiển thị hàm và sử dụng lại mã với các thư viện. Hãy nhớ rằng tối ưu hóa vừa là nghệ thuật vừa là khoa học. Tiếp tục thử nghiệm!
Phần lớn chi phí gas của Ethereum tập trung vào việc lưu trữ. Mỗi hoạt động thay đổi trạng thái (lưu trữ) của mạng Ethereum thường tốn kém. Do đó, việc tập trung vào cách lưu giữ và truy cập dữ liệu có thể giúp giảm chi phí đáng kể. Trong phần này, chúng ta sẽ xem xét một số cách tối ưu hóa bộ nhớ bằng Remix.
Chuỗi khối Ethereum cung cấp lưu trữ vĩnh viễn. Mọi thứ được lưu trên blockchain sẽ có sẵn miễn là blockchain tồn tại, nhưng sự lâu dài này phải trả giá. Tối ưu hóa lưu trữ không chỉ giảm chi phí mà còn đảm bảo rằng trạng thái toàn cầu của Ethereum được sử dụng hiệu quả.
Solid lưu trữ các biến trong các khe. Mỗi khe là 32 byte. Khi các biến có thể vừa trong một khe duy nhất, chúng có thể được đọc hoặc cập nhật bằng một thao tác SLOAD hoặc SSTORE tương ứng.
Hãy xem xét hai hợp đồng:
Độ vững chắc
// Không có Tối ưu hóa
độ vững chắc pragma ^0.8.9;
hợp đồng UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Độ rắn
// Với Tối ưu hóa
độ rắn pragma ^0.8.9;
hợp đồng OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
Triển khai cả hai hợp đồng trong Remix và lưu ý sự khác biệt về khí khi tương tác với các biến của chúng.
Trong phiên bản được tối ưu hóa, cả value1
và value2
đều chia sẻ một khe 32 byte.
Khi bạn sử dụng xong khe lưu trữ, đặc biệt là lưu trữ dữ liệu tạm thời, bạn có thể xóa hoặc loại bỏ khe cắm đó để được hoàn lại tiền xăng.
Độ rắn
độ rắn pragma ^0.8.9;
ví dụ hoàn tiền hợp đồng {
uint256 public temporaryData;
hàm storeTemporaryData(uint256 data) public {
temporaryData = data;
}
function clearTemporaryData() public {
delete temporaryData;
}
}
Triển khai hợp đồng này trong Remix.
Lưu trữ một số dữ liệu tạm thời và sau đó xóa nó.
Kiểm tra chi phí gas. Lưu ý khoản tiền hoàn lại gas bạn nhận được cho thao tác delete
.
Nếu dữ liệu không cần phải truy cập trên chuỗi, hãy cân nhắc việc ghi nhật ký dữ liệu đó như một sự kiện thay vì lưu trữ dữ liệu đó. Sự kiện rẻ hơn nhiều so với hoạt động lưu trữ.
Độ rắn
độ rắn pragma ^0.8.9;
hợp đồng EventExample {
sự kiện DataStored(uint256 data);
hàm storeData(uint256 data) public {
emit DataStored(data);
}
}
Triển khai và tương tác với hợp đồng trong Remix.
Lưu ý chi phí gas rẻ hơn khi so sánh với việc lưu trữ.
Điều quan trọng là phải thực hành ngay bây giờ khi bạn đã nắm vững một số phương pháp tối ưu hóa bộ nhớ cơ bản. Tham gia vào các ví dụ được cung cấp và thử nghiệm tạo ra ví dụ của riêng bạn. Trong phiên tiếp theo, chúng ta sẽ đi sâu hơn vào việc tối ưu hóa khả năng hiển thị hàm và sử dụng lại mã với các thư viện. Hãy nhớ rằng tối ưu hóa vừa là nghệ thuật vừa là khoa học. Tiếp tục thử nghiệm!