Anchor
Token2022 với Anchor

Token2022 với Anchor

Group và Member Extension

Phần mở rộng GroupMember là các Mint account extension giới thiệu khả năng tạo nhóm, như bộ sưu tập cho NFT, được liên kết với nhiều asset.

Khởi tạo Mint Account

Extension MemberGroup hơi khác so với những gì chúng ta đã quen làm vì nó được cấu thành từ 2 extension khác nhau đều nằm trên Mint account:

  • Extension chứa tất cả thông tin về group hoặc member.
  • Pointer Extension tham chiếu Mint account đến nơi extension Group hoặc Member tồn tại.

Thông thường, khi được sử dụng, ExtensionPointer Extension tồn tại trên cùng Mint account; và chúng ta sẽ làm tương tự cho ví dụ này.

Extension GroupMember không thể ở trên cùng account

Hãy bắt đầu với một số điều cơ bản trước khi đi sâu vào code:

Trong khi extension GroupPointerMemberPointer tồn tại trong gói @solana/spl-token, để khởi tạo GroupMember chúng ta cần sử dụng gói thư viện @solana/spl-token-group.

Vì vậy hãy cài đặt gói cần thiết:

npm i @solana/spl-token-group

Ngoài ra, extension GroupMember là một trong những extension "duy nhất" yêu cầu bạn khởi tạo extension sau khi đã khởi tạo Mint account.

Điều này là vì instruction khởi tạo metadata phân bổ động không gian cần thiết cho độ dài của dữ liệu group và member.

Đồng thời, điều này có nghĩa là chúng ta sẽ cần khởi tạo Mint account với đủ lamport để được miễn phí thuê với extension Group hoặc Member được bao gồm, nhưng chỉ phân bổ đủ không gian cho extension GroupPointer hoặc MemberPointer vì instruction initializeGroup()intializeMember() thực sự tăng không gian một cách chính xác.

Mã khởi tạo Group trông như thế này:

const mint = Keypair.generate();
 
// Size of Mint Account with extensions
const mintLen = getMintLen([ExtensionType.GroupPointer]);
 
// Minimum lamports required for Mint Account
const lamports = await connection.getMinimumBalanceForRentExemption(mintLen + TYPE_SIZE + LENGTH_SIZE + TOKEN_GROUP_SIZE);
 
const createAccountInstruction = SystemProgram.createAccount({
    fromPubkey: keypair.publicKey,
    newAccountPubkey: mint.publicKey,
    space: mintLen,
    lamports,
    programId: TOKEN_2022_PROGRAM_ID,
});
 
const initializeGroupPointer = createInitializeGroupPointerInstruction(
    mint.publicKey,
    keypair.publicKey,
    mint.publicKey,
    TOKEN_2022_PROGRAM_ID,
);
 
const initializeMintInstruction = createInitializeMintInstruction(
    mint.publicKey,
    6,
    keypair.publicKey,
    null,
    TOKEN_2022_PROGRAM_ID,
);
 
const initializeGroupInstruction = createInitializeGroupInstruction(
    {
        programId: TOKEN_2022_PROGRAM_ID,
        group: mint.publicKey,
        mint: mint.publicKey,
        mintAuthority: keypair.publicKey,
        updateAuthority: keypair.publicKey,
        maxSize: BigInt(100),
    }
);
 
const transaction = new Transaction().add(
    createAccountInstruction,
    initializeGroupPointer,
    initializeMintInstruction,
    initializeGroupInstruction,
);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, mint], {commitment: "finalized"});
 
console.log(`Mint created! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

Vf sau đó, chúng ta có thể sử dụng group mới tạo của chúng ta để thêm một member vào nó như thế này:

const member = Keypair.generate();
 
// Size of Member Account with extensions
const memberLen = getMintLen([ExtensionType.GroupMemberPointer]);
 
// Minimum lamports required for Member Account
const lamports = await connection.getMinimumBalanceForRentExemption(memberLen + TYPE_SIZE + LENGTH_SIZE + TOKEN_GROUP_MEMBER_SIZE);
 
const createAccountInstruction = SystemProgram.createAccount({
    fromPubkey: keypair.publicKey,
    newAccountPubkey: member.publicKey,
    space: memberLen,
    lamports,
    programId: TOKEN_2022_PROGRAM_ID,
});
 
const initializeGroupMemberPointer = createInitializeGroupMemberPointerInstruction(
    member.publicKey,
    keypair.publicKey,
    member.publicKey,
    TOKEN_2022_PROGRAM_ID,
);
 
const initializeMintInstruction = createInitializeMintInstruction(
    member.publicKey,
    6,
    keypair.publicKey,
    null,
    TOKEN_2022_PROGRAM_ID,
);
 
const initializeGroupMemberInstruction = createInitializeMemberInstruction(
    {
        programId: TOKEN_2022_PROGRAM_ID,
        group: mint.publicKey,
        member: member.publicKey,
        memberMint: member.publicKey,
        memberMintAuthority: keypair.publicKey,
        groupUpdateAuthority: keypair.publicKey,
    }
);
 
const transaction = new Transaction().add(
    createAccountInstruction,
    initializeGroupMemberPointer,
    initializeMintInstruction,
    initializeGroupMemberInstruction,
);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, member], {commitment: "finalized"});
 
console.log(`Member created! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

Cập nhật maxSize cho Group

Như bạn có thể thấy, khi chúng ta tạo group, chúng ta đã phân bổ trường maxSize sẽ giới hạn số lượng tối đa Member mà chúng ta có thể có trong group cụ thể đó.

Nếu chúng ta thay đổi ý định, và chúng ta vẫn có updateAuthority của group, chúng ta có thể sử dụng instruction updateGroupMaxSize() để thu nhỏ hoặc tăng số lượng đó như thế này:

const updateGroupMaxSizeInstructions = createUpdateGroupMaxSizeInstruction(
    {
        programId: TOKEN_2022_PROGRAM_ID,
        group: mint.publicKey,
        updateAuthority: keypair.publicKey,
        maxSize: BigInt(100),
    }
);

Cập nhật updateAuthority cho Group

Nếu chúng ta muốn thay đổi UpdateAuthority hoặc làm cho nó bất biến để không cho phép ai thêm Member nào nữa vào nó, chúng ta có thể sử dụng instruction updateGroupAuthority() như thế này:

const updateGroupAuthorityInstructions = createUpdateGroupAuthorityInstruction(
    {
        programId: TOKEN_2022_PROGRAM_ID,
        group: mint.publicKey,
        currentAuthority: keypair.publicKey,
        newAuthority: null,
    }
);
Nội dung
Xem mã nguồn
Blueshift © 2025Commit: f7a03c2