【问题标题】:Best plan of attack for digital certificates for proof of completion on EVM用于证明 EVM 完成的数字证书的最佳攻击计划
【发布时间】:2022-02-01 04:13:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: ethereum solidity smartcontracts nft evm


    【解决方案1】:

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

    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 link) 的函数,该函数可以被覆盖以完全禁止传输。

    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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-21
      • 2021-05-19
      • 2010-12-04
      • 2011-04-10
      • 2011-04-25
      • 2011-03-08
      • 2011-02-11
      • 1970-01-01
      • 2013-08-01
      相关资源
      最近更新 更多