0

我希望探索在某人完成部分培训后创建数字证书(如证明)的选项,并使用 Solidity 在与 EVM 兼容的区块链上发布该证书。

我已经使用 ERC721 NFT 对“证书”进行编码进行了原型设计,但是,我想防止收件人能够转移这些证书。为了防止转移,我尝试使用 OpenZeppelin 中的 Pause.sol 功能,但是,这将导致整个合约被暂停,而不是特定的 tokenId。

有人对方法有任何建议吗?如果我不希望收件人能够交易证书(即让他们保持静态),我是否过于复杂?任何指针将不胜感激!

4

1 回答 1

0

最简单和最原始的解决方案是只设置一个映射值。

pragma solidity ^0.8;

contract TrainingResults {
    enum Stage {
        NONE,
        STAGE_1,
        STAGE_2,
        COMPLETED
    }

    mapping (address => Stage) public participantStage;

    function setParticipantStage(address _graduate, Stage _stage) external {
        require(msg.sender == address(0x123), "Not authorized");
        participantStage[_graduate] = _stage;
    }
}

或者,如果您希望他们能够在他们的钱包中看到某种 NFT(支持 NFT),您可以修改 ERC-721 合约以禁止转账。

例如,OpenZeppelin 实现使用了一个名为_beforeTokenTransfer()GitHub 链接)的函数,该函数可以被覆盖以完全禁止传输。

pragma solidity ^0.8;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract TrainingResults is ERC721 {
    constructor() ERC721("TrainingResults", "TR") {}

    function _beforeTokenTransfer(address from,address to, uint256 tokenId) override internal {
        // Allow only for the admin
        // as this function is called on token mint as well
        require(msg.sender == address(0x123), "Cannot transfer tokens");
    }
}
于 2022-01-31T20:13:28.557 回答