어떻게 안전모를 사용하여 BEP20 영패를 사기당하지 않도록 테스트합니까

본 문서에서 귀하는 Hardhatethers.js NPM 패키지 테스트 맞춤형 BEP20 영패를 어떻게 사용하는지 배울 것입니다.
You can contact me with Telegram if you need to hire a full stack blockchain dev.
You can also join the Telegram group where I maintain and you can find other blockchain developers, recruiters, project owners, ask questions and network.
오늘 테스트할 BEP 20 토큰은 $SCAM 토큰입니다.
SCAM은 Binance 스마트 체인에 생성된 BEP20 토큰$SCAM의 현재 시가는 10만(its/BNB의 ATH는 35만)과 1억 기호화폐의 유한 공급량이다. 이 중 많은 기호화폐는 레드디트에 있는 여러 개의 무료 공중투하를 통해 분배된다. 이는 지역사회를 200여 개의 전보 회원과 700여 개의 전보 회원reddit으로 발전시키는 데 도움이 된다.
$SCAM은 BSCMainnet에 간단한 ERC20 기호화폐를 배치하여 실현했다. 기본적으로 관리 기능이나 집중 제어가 없다. 블랙리스트, 녹음 또는 동결 기능도 없고 주조할 수 있는 다른 기호화폐도 없다.
Find out more with this post.
You can also visit their website.
나는 당신의 기계에solidity 개발 환경이 이미 준비되어 있기를 바랍니다.
그렇지 않으면, 나의 이전 문장과 예를 참고하십시오.

카탈로그

  • 왜 이 게시물은 사기 기호화폐를 선택했습니까?
  • 사기 계약 소스 코드 검사
  • 테스트 준비
  • 결론
  • You can find the entire code used for this post here.

    1.왜 이 게시물은 기호화폐 사기를 선택했을까?



    저는 dev.to 사이트에서 우연히 안전한 암호화와 돈($SCAM)을 발견했습니다. ERC20 기호화폐를 어떻게 배우는지와 Solidity에서 프로그래밍 실천을 하는 것이 이 동전의 열정적인 프로젝트가 되었습니다.
    나는 블록체인 개발을 막 다시 시작했는데 작가의 story가 매우 재미있다는 것을 발견했다.
    이름 자체에서 알 수 있듯이 이것은 처음에는 모인 표기였으나 나중에는 유기적으로 매우 우호적인 지역사회로 변했다. 초보자와 개발자는 이곳에서 암호화폐와 DeFi에 대한 지식을 더 많이 배울 수 있다.
    그들은 이미 하나의 사이트를 내놓았고 완전히 분산된 유동성 장려 계약을 실시했다. 현재working는 분산 관리와 재정, 그리고 수도꼭지 하나를 실시하고 있다.
    커뮤니티 자체는 건강한 대화, 토론과 사고의 장소가 되었고 구성원들이 참여하는 각종 지원 프로그램의 시작 플랫폼이 되었다. 예를 들어 동전 목록 사이트, NFT, 상품과 마케팅 활동 등이다.
    우선, 나는 이것이 단지 농담인 줄 알았지만, 나는 이 게시물에 대해 매우 흥미를 느꼈다.나는 이 프로젝트가 매우 재미있다고 생각한다. 이 프로젝트에 더 많이 참여하고 싶어서 나도 발견했다its Telegram group.
    내가 처음 예상했던 것과 달리 팀원들은 남을 돕는 것을 매우 좋아한다.나는 나의 고객이 테스트하고 싶은 것을 찾을 수 있다. a clue to set up and deploy a smart contract code
    나는 또 이 그룹에 참가함으로써 스스로 글을 쓰도록 격려했다.
    나는 이것이 내가 블록체인 업무에 더욱 참여하고 유용한 정보를 찾는 데 큰 도움이 된다고 생각한다.
    암호화폐와 관련 기술을 익히는 데 도움을 주는 사람이 있습니다.그렇지 않으면 속아서 손해를 보기 쉽다.
    이 글 이후에 사기에 대한 정보를 더 알고 싶다면 참가할 수 있다its Telegram group.
    현재the faucet contract 사기극을 무료로 하는 것도 유효하기 때문에 당신은 그것을 무료로 할 수 있습니다.나는 이것이 당신의 첫 번째 암호화 화폐가 있는 아주 좋은 기회가 될 것이라고 생각한다.
    For more details, you can read this post for the faucet also.
    그것의 사이트도 https://faucet.scam-coin.org/ 페이지에 있다.

    아래 목록에 있는 지갑을 사용할 수 있습니다.

    그리고 이를 사이트에 연결한다.

    마지막으로 지시에 따라 첫 번째 $SCAM 토큰을 받습니다.

    만약 궁금한 것이 있다면, 이 그룹에 가입하고, 그곳의 구성원들에게 도움을 청하세요.사기, 암호화폐, 스마트 계약, DeFi 및 기타 블록체인과 관련된 것을 이해하는 데 도움을 줄 것이다.

    2. 사기 계약서 소스 코드 검사



    시작하기 전에 BEP20 영패규범은 ERC20 등효규범과 같기 때문에 익숙하지 않으시면 먼저 읽으십시오the documentation for it.
    You can see that SCAM was verified by bscscan with the code snippet similar to this.
    pragma solidity >=0.4.22 <0.6.0;
    
    contract SCAM_Token {
    
      // 1.
      string public constant name = "Safe Crypto And Money";
      string public constant symbol = "SCAM";
      uint8 public constant decimals = 18;  
    
      event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
      event Transfer(address indexed from, address indexed to, uint tokens);
    
      mapping(address => uint256) balances;
      mapping(address => mapping (address => uint256)) allowed;
    
      // 2.
      uint256 totalSupply_ = 10 ** (8 + 18);
      uint256 preMine_ = 2 * (10 ** (7 + 18)); // This is what the owner of this token will take
      uint airdropSize_ = 10 ** (6 + 18);
    
      address payable owner_;
    
      using SafeMath for uint256;
    
      constructor() public {  
    
        require(preMine_ <= totalSupply_);
    
        owner_ = msg.sender;
    
        // 2. 
        balances[address(this)] = totalSupply_.sub(preMine_);
        balances[owner_] = preMine_;    
      }  
    
      function totalSupply() external view returns (uint256) {
        return totalSupply_;
      }
    
      // 3.
      function balanceOf(address tokenOwner) external view returns (uint) {
        return balances[tokenOwner];
      }
    
      function transfer(address receiver, uint numTokens) public returns (bool) {
        require(numTokens <= balances[msg.sender]);
        balances[msg.sender] = balances[msg.sender].sub(numTokens);
        balances[receiver] = balances[receiver].add(numTokens);
        emit Transfer(msg.sender, receiver, numTokens);
        return true;
      }
    
      function approve(address delegate, uint numTokens) external returns (bool) {
        allowed[msg.sender][delegate] = numTokens;
        emit Approval(msg.sender, delegate, numTokens);
        return true;
      }
    
      function allowance(address owner, address delegate) external view returns (uint) {
          return allowed[owner][delegate];
      }
    
      function transferFrom(address owner, address buyer, uint numTokens) external returns (bool) {
        require(numTokens <= balances[owner]);    
        require(numTokens <= allowed[owner][msg.sender]);
    
        balances[owner] = balances[owner].sub(numTokens);
        allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
        balances[buyer] = balances[buyer].add(numTokens);
        emit Transfer(owner, buyer, numTokens);
        return true;
      }
    
      // 4.
      function airdropTokens(address receiver) external {
        require(msg.sender == owner_);
        require(airdropSize_ <= balances[address(this)]);
    
        this.transfer(receiver, airdropSize_);
      }
    
      // 5.
      function releaseBNB() external {
         require(msg.sender == owner_);
         owner_.transfer(address(this).balance);
      }
    
      // Fallback function
      function() external payable {}
    }
    
    // 6.
    library SafeMath { 
      function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
      }
    
      function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
      }
    }
    
    너는 여기에 너무 많은 코드가 없다는 것을 볼 수 있다. 나는 이것이 매우 강력한 사기 표식이라는 것을 발견했다.그것은 정말로 너를 속일 수 없다.
    우리는 그것의 모든 부분을 검사할 것이다.이것은 이 계약의 역할을 찾아내고 다음 부분에서 테스트를 작성해서 이를 확인하는 데 도움을 줄 것입니다.
    1. 계약 소유자는 여기서 BEP20 영패의 명칭, 기호와 소수점을 정의할 수 있다.그것은 단지 ERC20 표준을 따를 뿐이다.
    2. 여기서 토큰의 총 공급량을 정의했다.사기극에는 박하나 연소 기능이 없다.너는 고정 수량의 사기 토큰(10000000)을 볼 수 있다.
    그리고 계약 소유자는 20000000부를 얻고 1000000부는 airdropTokens 기능에 사용할 것이다.
    3. 이 기능들은 4까지.단지 IERC20 standard functions의 일부분일 뿐이다.이것은 작가의 의도다.
    4. 사기동전을 공중 투하하는 곳입니다. 계약서에서 수신자에게 보내는 것을 볼 수 있습니다.(건조부 100000000-2000000=80000000)
    5. 이 부분은 사기 영패 논리와 무관하다.그것은 단지 계약서에서 BNB 잔액을 추출하는 반환 함수일 뿐이다.
    나는 작가와 이야기했다. 그는 계약서의 기부금을 얻기 위해 그것을 포함시켰다고 나에게 말했다.
    그것은 사기 영패 논리와는 무관하다.그러나 다음 부분에는 사기 소지자의 균형에 영향을 미칠지 테스트가 포함될 것이다.
    6.이것들은 SafeMath OpenZeppelin library 코드 중의 일부 함수들이다.
    너는 그들의 문서를 읽어서 더 많은 정보를 얻을 수 있다.

    3. 테스트 준비



    앞부분에서 우리는 계약 코드의 사기 행위를 검사하고 그 각 부분의 기능을 살폈다.
    우리는 그것이 모두 정상적으로 작동하는 것을 발견하기 위해 간단한 테스트를 작성할 것이다.
    나는 네가 사용한 것이 내가 본문 첫머리에 공유한 원본 코드 링크라고 가정한다.
    항목을 업데이트하기 전에 안전모를 편집하십시오.배치하다.js는 당신이 좋아하는solidity 컴파일러 버전 >=0.4.22 <0.6.0 을 사용합니다.
    module.exports = {
      defaultNetwork: "hardhat",
      paths: {
        artifacts: './src/artifacts',
      },
      networks: {
        // $npx hardhat run scripts/deploy.js --network localhost
        // https://hardhat.org/config/
        hardhat: {
          chainId: 1337,
        },
      },
      solidity: "0.5.6", // This is where you should edit.
    };
    
    $yarn compile (npx-hardhat-compile) 를 사용하여 계약 코드가 정말로 컴파일되었는지 확인하고 이와 유사한 결과를 표시해야 합니다.
    Creating Typechain artifacts in directory typechain for target ethers-v5
    Successfully generated Typechain artifacts!
    
    콘솔에서 $yarn serve (npx hardhat 노드) 를 사용하여 로컬solidity dev env with hardhat을 설정합니다.
    그런 다음 스크립트/배포가 올바른지 확인합니다.js 파일.
    // We require the Hardhat Runtime Environment explicitly here. This is optional 
    // but useful for running the script in a standalone fashion through `node <script>`.
    //
    // When running the script with `hardhat run <script>` you'll find the Hardhat
    // Runtime Environment's members available in the global scope.
    const hre = require("hardhat");
    
    async function main() {
      const [deployer] = await hre.ethers.getSigners();
    
      console.log(
        "Deploying contracts with the account:",
        deployer.address
      );
    
      const SCAM = await hre.ethers.getContractFactory("SCAM_Token");
    
      const scam = await SCAM.deploy();
      await scam.deployed();
    
      console.log("SCAM_Token deployed to:", scam.address);
    }
    
    // We recommend this pattern to be able to use async/await everywhere
    // and properly handle errors.
    main()
      .then(() => process.exit(0))
      .catch(error => {
        console.error(error);
        process.exit(1);
      });
    
    다른 콘솔에서 $yarn deploy와 함께 작동하는지 테스트하여 문제 없이 스마트 계약 코드를 배치할지 확인합니다.
    만약 네가 이 점을 할 수 있다면, 우리는 마침내 사기 계약을 위해 테스트를 작성할 수 있을 것이다.
    너는 테스트/사기 테스트를 볼 수 있다.저장소의 js 파일은 이와 유사합니다.
    // ethers is global variable here.
    
    const { expect } = require("chai");
    const { expectRevert } = require('@openzeppelin/test-helpers');
    
    // 1.
    const totalSupplyBigNumberHex = ethers.BigNumber.from("0x52b7d2dcc80cd2e4000000");
    const preMineBigNumberHex = ethers.BigNumber.from("0x108b2a2c28029094000000");
    const airDropSize = "1000000000000000000000000"; // "0xD3C21BCECCEDA1000000"
    
    describe("SCAMToken state and transactions", function () {
      let SCAMToken, scamToken, owner, firstComer, secondComer; // seller is owner
    
      // We don't include events here 
      // because it was already handled in the previous post
      beforeEach(async () => {
        provider = ethers.getDefaultProvider();
    
        SCAMToken = await ethers.getContractFactory("SCAM_Token");
        scamToken = await SCAMToken.deploy();
    
        [owner, firstComer, secondComer, _] = await ethers.getSigners();
      });
    
      it("Should test 'totalSupply' and other default values.", async function () {
        // 2.
        expect(await scamToken.symbol()).to.equal("SCAM");
        expect(await scamToken.name()).to.equal("Safe Crypto And Money");
        expect(await scamToken.decimals()).to.equal(18);
    
        const totalSupply = await scamToken.totalSupply();
        expect(totalSupply).to.equal(totalSupplyBigNumberHex);
    
        // What the owner takes from the total supply
        const preMine = await scamToken.balanceOf(owner.address);
        expect(preMine).to.equal(preMineBigNumberHex);
      });
    
      it("Should test 'airdropTokens' and the contract and receiver balance change.", async function () {
        // 3.
        await expectRevert.unspecified(scamToken.connect(firstComer).airdropTokens(firstComer.address));
        await expectRevert.unspecified(scamToken.connect(secondComer).airdropTokens(secondComer.address));
    
        // From contract to a user
        await scamToken.airdropTokens(firstComer.address);
        // Include contract balance also here.
        const firstComerBalance = await scamToken.balanceOf(firstComer.address);
        expect(firstComerBalance.toString()).to.equal(airDropSize);
      });
    
      // 4.
      it("Should test 'transfer' from the owner to firstComer.", async function () {
        // From a user to another user
        const amountToTransfer = 1000000;
        await scamToken.transfer(firstComer.address, amountToTransfer);
    
        let firstComerBalance = await scamToken.balanceOf(firstComer.address);
        expect(firstComerBalance.toString()).to.equal(amountToTransfer.toString());
      });
    
      it("Should test 'approve' and 'allowance' from the owner to firstComer.", async function () {
        const amountForApproval = 1000000;
        await scamToken.approve(firstComer.address, amountForApproval);
    
        const allowance = await scamToken.allowance(owner.address, firstComer.address);
        expect(allowance.toString()).to.equal(amountForApproval.toString());
      });
    
      it("Should test 'approve', 'allowance' and 'transferFrom'.", async function () {
        const amountForApproval = 1000000;
        await scamToken.approve(firstComer.address, amountForApproval);
        const allowance = await scamToken.allowance(owner.address, firstComer.address);
        expect(allowance.toString()).to.equal(amountForApproval.toString());
    
        await scamToken.connect(firstComer).transferFrom(owner.address, secondComer.address, amountForApproval);
    
        const secondComerBalance = await scamToken.balanceOf(secondComer.address);
        expect(secondComerBalance.toString()).to.equal(amountForApproval.toString());
      });
    
      // 5.
      it("Should test 'releaseBNB' and it shouldn't affect the balance of other users (not owners)", async function () {
        const amountForApproval = 1000000;
        await scamToken.approve(firstComer.address, amountForApproval);
        const allowance = await scamToken.allowance(owner.address, firstComer.address);
        expect(allowance.toString()).to.equal(amountForApproval.toString());
    
        await scamToken.connect(firstComer).transferFrom(owner.address, secondComer.address, amountForApproval);
    
        const secondComerBalance = await scamToken.balanceOf(secondComer.address);
        expect(secondComerBalance.toString()).to.equal(amountForApproval.toString());
    
        await scamToken.releaseBNB();
        expect(secondComerBalance.toString()).to.equal(amountForApproval.toString());
      });
    });
    
    SCAM의 스마트 계약 코드는 매우 간단합니다. 우리도 그것을 테스트할 코드가 너무 많지 않습니다.
    1. BEP 20 토큰 계약에 관련된 수량이 매우 많다.우리는 그들의 안전모와 이태를 테스트하기 위해 그들의 16진법이 필요하다.js 패키지.
    그래서 나는 수동으로 그것들을 추가했다.이렇게 하려면 16진수 함수가 있는 Python 콘솔을 사용할 수 있습니다.
    $python
    >>> hex(1000000000000000000000000)
    '0xd3c21bcecceda1000000'
    >>> hex(1000000000000000000000000000000)
    '0xc9f2c9cd04674edea40000000'
    >>> hex(1000000000000000000000000000000000)
    '0x314dc6448d9338c15b0a00000000'
    >>> hex(1000000000000000000000000)
    '0xd3c21bcecceda1000000'
    >>> 10 ** 26
    100000000000000000000000000
    >>> hex(_)
    '0x52b7d2dcc80cd2e4000000'
    
    post를 참조하여 JavaScript 코드에 포함할 수도 있습니다.
    그렇지 않으면 큰 숫자의 16진수 값을 찾을 수 있는 JavaScript 함수를 찾을 수도 있습니다.하지만 파이톤을 어떻게 사용하는지 알고 있다면 필요 없어요.
    2. 우리는 여기서 테스트를 진행하여 계약을 배치할 때 계약 명칭, 기호와 소수점이 정확하게 설정되었는지 확인한다.당신은 또한 토큰의 총 공급량을 설정했는지, 선불 금액이 계약 소유자의 주소에 정확하게 저장되었는지 확인할 수 있습니다.
    3. 이 부분에서 우리는 먼저 다른 사용자(소유자가 아닌)가airdropTokens를 호출할 수 있는지 검사한다.
    호출자가 퍼스트 Comer 또는second Comer (소유자가 아닌) 라면 계약에서 airdropTokens 함수를 사용할 수 없습니다.계약서에 오류 메시지 집합이 없습니다. @openzeppelin/test helpers 패키지의 unspecifiedapi를 사용하여 테스트합니다.
    그 다음에 수신기의 에어드롭 사이즈 수량은 영패'1000000000000000000000000000000000000000000000000000000000000000000000000'입니다.스마트 계약 부분에 비해 당혹스러울 수 있지만 소수점이'18'인 것을 보실 수 있습니다.만약 우리가 이 점을 고려한다면, 1000000개의 사기 영패가 수신자에게 발송될 것이다.
    4. 다음 테스트는 본 계약에 포함된 일부 ERC20 표준 기능이 어떻게 작동하는지 알아보는 데 도움을 줄 것입니다.
    너는 전직, 비준, 수당, 전직을 모두 볼 수 있다.
    5. 기부 계약 코드에 반환 기능과 BNB 방출이 있다.
    function releaseBNB() external {
      require(msg.sender == owner_);
      owner_.transfer(address(this).balance);
    }
    
    // Fallback function
    function() external payable {}
    
    우리는 이 함수를 호출하는 것이 비소유자에게 아무런 영향을 미치지 않도록 테스트할 수 있다.
    테스트에서 releaseBNB 함수를 호출한 후firstComer의 균형이 같다는 것을 볼 수 있다.
    만약 네가 원한다면, 너는 여기에 더 많은 테스트를 쓸 수 있다.$yarn test (npx hardhat Test) 테스트를 사용하면 모든 테스트가 기계에서 정상적으로 작동할 수 있습니다. 모든 테스트가 통과된 것을 볼 수 있습니다. 결과는 이와 유사합니다.
    $yarn test
    Creating Typechain artifacts in directory typechain for target ethers-v5
    Successfully generated Typechain artifacts!
    
      SCAMToken state and transactions
        ✓ Should test 'totalSupply' and other default values.
        ✓ Should test 'airdropTokens' and the contract and receiver balance change.
        ✓ Should test 'transfer' from the owner to firstComer.
        ✓ Should test 'approve' and 'allowance' from the owner to firstComer.
        ✓ Should test 'approve', 'allowance' and 'transferFrom'.
        ✓ Should test 'releaseBNB' and it shouldn't affect the balance of other users (not owners)
    
    네가 모든 시험에 통과할 수 있기를 바란다.

    4. 결론


    본고에서 우리는 SCAM 테스트 사용자 정의 BEP20 영패를 어떻게 사용하는지 배웠다.내가 그것을 소개한 것은 그 지역 사회가 매우 도움이 된다는 것을 발견했기 때문이다.여기에 사용된 코드 세션은 다른 BEP20이나 ERC20 기호화폐를 구매하기 전에 테스트할 수 있기를 바랍니다.
    ERC20과 BEP20 토큰은 거의 같으며, 전자의 코드 세션에 사용할 수도 있습니다.
    만약 당신이 이 글을 좋아한다면 다른 사람과 공유해 주세요.블록체인과 관련된 것을 더 많이 공유할 계획입니다.나는 ETH와 POLKADOT에 관심이 있다.
    If you need to hire a developer, you can contact me.
    I can also clone, set up, update and deploy another blockchain project if you want.
    고맙습니다.

    좋은 웹페이지 즐겨찾기