헤데라 스마트 계약 - 추측 게임

7469 단어
제대로 안한거같은데 그래도 성공! 개발자로서 이것은 확실히 저에게 많이 발생합니다.

Hedera에서 스마트 계약이 어떻게 작동하는지 알아보기 위해 간단한 추측 게임을 만들고 싶었습니다.
  • 스마트 계약에 비밀 문구가 포함되어 있습니다. 스마트 계약에서 함수를 호출하여 그것이 무엇인지 추측할 수 있습니다.
  • 각 추측 비용은 5 HBAR입니다(과시하고 싶다면 더 보낼 수 있음)
  • 올바르게 추측하면 지금까지 수집된 모든 HBAR을 받게 됩니다.

  • 저장소는 여기에 있습니다https://github.com/aaronblondeau/guess-it.

    저는 견고성이나 스마트 컨트랙트에 대한 지식이 매우 제한적이어서 이 모든 것이 저에게 새로운 영역이었습니다.

    다음은 내가 계약에 대해 생각한 것입니다.

    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.11;
    pragma experimental ABIEncoderV2;
    
    // Compile with:
    // npm install -g solc
    // solcjs --bin GuessIt.sol
    contract GuessIt {
    
        string private secretPhrase;
        address public owner;
        uint pot = 0;
    
        event GuessAtttempt(address indexed from, string guess, bool success, uint pot);
    
        constructor (string memory _phrase) {
            owner = msg.sender;
            secretPhrase = _phrase;
        }
    
        function setPhrase(string memory _phrase) public {
            // Only contract owner can update phrase
            require(msg.sender == owner);
            secretPhrase = _phrase;
        }
    
        function guessPhrase(string memory _guess) public payable returns (bool) {
            // Make sure caller has sent at least 5 HBAR
            require (msg.value >= 500000000, "insufficient payable");
    
            // Add funds to the pot (why doesn't this show in contract balance on dragonglass?)
            pot += msg.value;
    
            if (keccak256(abi.encodePacked((_guess))) != keccak256(abi.encodePacked((secretPhrase)))) {
                emit GuessAtttempt(msg.sender, _guess, false, pot);
                return false;
            }
    
            // Guess was correct, transfer pot to caller
            emit GuessAtttempt(msg.sender, _guess, true, pot);
            payable(msg.sender).transfer(pot);
            pot = 0;
            return true;
        }
    
        function contractVersion() public pure returns (uint) {
            return 9;
        }
    }
    


    주요 테이크아웃 중 일부는 다음과 같습니다.
  • secretPhrase가 비공개로 표시되었으므로 네트워크에서 추출할 방법이 없다고 가정합니다. 이것은 잘못된 가정일 수 있습니다.
  • 발신자가 자금을 보낼 수 있도록 내 기능에 유료 키워드가 필요했습니다. 또한 보상을 보낼 수 있도록 지불 가능한 함수 호출로 발신자를 래핑해야 했습니다.
  • "pot"변수에서 보낸 금액을 추적했습니다. 그러나 자금이 실제로 어디에 저장되었는지는 여전히 불분명합니다. 지불금이 성공적으로 발생하더라도 계약 자체는 항상 잔액이 0인 것으로 나타났습니다.
  • 함수를 호출한 후 함수의 반환 값을 가져오는 방법을 알아내는 데 꽤 시간이 걸렸습니다. Using the getRecord function finally did the trick.

  • 이 연습에서 가장 큰 질문 중 하나는 스마트 계약을 개발하는 동안 어떻게 빠르게 반복합니까? 계약을 테스트넷에 반복해서 보내서 디버깅했습니다(죄송합니다 테스트넷). 다음에는 계약을 단위 테스트하는 방법을 알아낼 계획입니다. 그러면 반복 문제가 해결되고 내가 놓친 멋진 버그를 발견할 수 있을 것입니다.

    좋은 웹페이지 즐겨찾기