Khóa học blockchain

Set trong Smart Contract

0 phút đọc

Trong lập trình Smart Contract, việc quản lý các tập hợp dữ liệu một cách hiệu quả là rất quan trọng, đặc biệt khi các dữ liệu này cần được duy trì một cách duy nhất và không trùng lặp. Trong các ngôn ngữ lập trình như Python, cấu trúc dữ liệu "set" được sử dụng rộng rãi để lưu trữ các phần tử không trùng lặp. Tuy nhiên, trong Solidity, ngôn ngữ lập trình chính cho Ethereum Smart Contracts, không có cấu trúc dữ liệu set sẵn có. Do đó, việc triển khai một set yêu cầu một số kỹ thuật lập trình cụ thể. Bài viết này sẽ khám phá cách triển khai và quản lý một set trong Smart Contract, cùng với các ví dụ thực tế.

Khái niệm về Set

Set là một cấu trúc dữ liệu cho phép lưu trữ các phần tử duy nhất, tức là không có hai phần tử nào giống nhau trong set. Điều này làm cho set trở thành công cụ lý tưởng để quản lý các tập hợp mà mỗi phần tử chỉ xuất hiện một lần, như danh sách các tài khoản người dùng, danh sách các token duy nhất, v.v.

Triển khai Set trong Solidity

Do Solidity không có cấu trúc dữ liệu set sẵn có, chúng ta cần sử dụng một kết hợp của mảng và mapping để triển khai một set. Dưới đây là một ví dụ về cách triển khai một set đơn giản trong Solidity:

Bước 1: Khai báo Cấu trúc Dữ liệu

pragma solidity ^0.8.0;

contract SimpleSet {
    // Mảng để lưu trữ các phần tử của set
    address[] private elements;

    // Mapping để kiểm tra sự tồn tại của một phần tử
    mapping(address => bool) private isElement;
}

Bước 2: Thêm Phần tử vào Set

function add(address element) public {
    if (!isElement[element]) {
        elements.push(element);
        isElement[element] = true;
    }
}

Trong đoạn mã trên, trước khi thêm một phần tử vào mảng elements, chúng ta kiểm tra xem phần tử đó đã tồn tại trong set hay chưa bằng cách sử dụng mapping isElement. Nếu phần tử chưa tồn tại, nó sẽ được thêm vào mảng và đánh dấu là đã tồn tại trong mapping.

Bước 3: Xóa Phần tử khỏi Set

function remove(address element) public {
    if (isElement[element]) {
        // Tìm chỉ số của phần tử cần xóa
        for (uint i = 0; i < elements.length; i++) {
            if (elements[i] == element) {
                // Di chuyển phần tử cuối cùng của mảng đến vị trí của phần tử cần xóa
                elements[i] = elements[elements.length - 1];
                // Xóa phần tử cuối cùng
                elements.pop();
                break;
            }
        }
        // Đánh dấu phần tử là không tồn tại trong mapping
        isElement[element] = false;
    }
}

Trong đoạn mã trên, để xóa một phần tử, chúng ta tìm chỉ số của phần tử đó trong mảng, sau đó di chuyển phần tử cuối cùng của mảng đến vị trí của phần tử cần xóa và cuối cùng là xóa phần tử cuối cùng bằng cách sử dụng hàm pop(). Điều này giúp duy trì tính liên tục của mảng mà không để lại khoảng trống.

Ví dụ Thực tế

Giả sử chúng ta cần quản lý một danh sách các địa chỉ người dùng được phép truy cập vào một tính năng đặc biệt trong dApp (ứng dụng phi tập trung). Chúng ta có thể sử dụng set đã triển khai ở trên để đảm bảo rằng mỗi địa chỉ chỉ được thêm vào danh sách một lần, như sau:

pragma solidity ^0.8.0;

contract AccessControl {
    SimpleSet private accessList;

    function grantAccess(address user) public {
        accessList.add(user);
    }

    function revokeAccess(address user) public {
        accessList.remove(user);
    }

    function checkAccess(address user) public view returns (bool) {
        return accessList.isElement[user];
    }
}

Trong ví dụ này, AccessControl sử dụng SimpleSet để quản lý danh sách truy cập. Các hàm grantAccess, revokeAccesscheckAccess cho phép thêm, xóa và kiểm tra quyền truy cập của người dùng.

Kết luận

Việc triển khai set trong Smart Contract đòi hỏi phải sử dụng các kỹ thuật lập trình cụ thể do hạn chế của ngôn ngữ Solidity. Tuy nhiên, với sự kết hợp của mảng và mapping, chúng ta có thể tạo ra các cấu trúc dữ liệu phức tạp như set để quản lý dữ liệu một cách hiệu quả và an toàn. Các nhà phát triển cần lưu ý đến chi phí Gas khi triển khai các hàm liên quan đến set, đặc biệt là khi xử lý các mảng lớn.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Dữ liệu được lưu trữ trong container sẽ bị mất trong những trường hợp nào?

entry

Tầm quan trọng của việc tạo mẫu trong thiết kế là gì?

entry

Các thành phần chính trong Microservices?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào