针对EVM上完成证明的数字证书的最佳攻击计划



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

我已经使用ERC721 NFT进行了原型化;证书;但是,我希望阻止收件人转移这些证书。为了防止转移,我尝试使用OpenZeppelin的Pause.sol功能,然而,这会导致整个合同暂停,而不是特定的tokenId。

有人对方法有什么建议吗?如果我不希望收件人能够交易证书(即让他们保持不变(,我会不会过于复杂了?任何建议都将不胜感激!

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

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

最新更新