Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    GeonHun Kim
    @DNATUNA
    다음과 같이 작성하라구 하여 코드를 바꿔봤습니다.
    이후 컴파일을 돌려보니 0.5.0 버전 이후 부터는 코드가 바뀌었다고 나오며 에러가 납니다.. 아예 이전 버전을 설치 받아야 하는지 궁금합니다!
    image.png
    swkim109
    @swkim109
    @DNATUNA 아... 컴파일러 버전이 안맞아서 그런 것 같습니다. 원래 솔리디티가 버전이 올라가면서 문법적인 부분이 달라지거나 없어지거나 합니다. 우선 컴파일러 버전을 맞추고 하세요. 제 생각에는 0.7.x 대로 맞추는 것이 좋을 것 같습니다.
    swkim109
    @swkim109
    일단 트러플에서 컴파일러 버전이 몇인지 확인해보세요. 위에 첨부한 화면으로는 0.5.16 같네요.
    @DNATUNA 일단 컨트랙트를 다음과 같이 변경해보세요.
    pragma solidity ^0.5.0;
    
    contract HelloWorld {
    
        string public greeting;
    
        constructor(string memory _greeting) public {
            greeting = _greeting;
        }
    
        function setGreeting(string memory _greeting) public {
            greeting = _greeting;
        }
    
        function say() public view returns(string memory) {
            return greeting;
        }
    }
    GeonHun Kim
    @DNATUNA
    @swkim109 엇 답변 감사합니다. 혹시 컴파일러 버전을 맞추려면 트러플 버전을 낮춰야 하나요?
    swkim109
    @swkim109

    @DNATUNA 아니오. 트러플 설정 파일에 컴파일러를 지정할 수 있습니다. truffle-config.js에 다음과 같이 설정할 수 있죠.

    compilers: {
            solc: {
                version: "^0.5.0",
                settings: {
                    optimizer: {
                        enabled: true
                    },
                }
            },
    
        },

    그리고 나서 확인은 truffle version이라고 하면 현재 트러플에 설정된 솔리디디티 컴파일러 solc 버전이 나옵니다. 트러플은 기본적으로 한가지 컴파일러 버전을 사용하도록 되어 있습니다. 그러니까 예를 들어 0.4.x로 된 컨트랙트와 0.5.x로 된 컨트랙트를 같이 컴파일할 수 없어요.

    트러플 설정에 관한 도움말은 트러플 사이트에 잘 정리되어 있습니다. 😄
    트러플 설정 - 컴파일러
    GeonHun Kim
    @DNATUNA
    정말 감사합니다. 추가 질문 드리겠습니다!
    function mint(address _owner, string calldata ipfsHash) external payable {
            asset memory newAsset = asset(ipfsHash);
            uint256 tokenId = allTokens.push(newAsset) - 1;
            //token id starts from 0, index of assets array
            tokenOwners[tokenId] = _owner;
            balances[_owner] = balances[_owner].add(1);
    
            //for enumeration
            allValidTokenIndex[tokenId] = allValidTokenIds.length;
            //index starts from 0
            allValidTokenIds.push(tokenId);
    
            //Token Metadata
            tokenURIs[tokenId] = Strings.strConcat(baseTokenURI(), ipfsHash);
    
            emit Transfer(address(0), _owner, tokenId);
       }
    다음과 같이 mint코드를 수정한 뒤 특정 주소 값을 가진 사람에게 IPFS를 등록시키려고 하는데요! 잘 되지 않네요.. 일단 https://api.pinata.cloud/pinning/pinFileToIPFS API를 이용해서 IPFSHash를 구한 뒤에 해당 hash 값과 현재 이용자의 주소를 보내 토큰을 만들어보려고 하는데요! 혹시 정답 코드나 예시 코드를 공유해주실 수 있는지 궁금합니다 ㅠ
    Express로 해보고 있는 중이고, express-box 코드를 수정하면서 진행하고 있습니다.
    createNFT: function (account, ipfsHash, callback) {
        const self = this;
    
        // Bootstrap the MetaCoin abstraction for Use.
        CreateToken.setProvider(self.web3.currentProvider);
    
        let meta;
        CreateToken.deployed()
          .then(instance => {
            meta = instance;
            return meta.mint.call(account, ipfsHash);
          })
          .then(() => {
            self.refreshBalance(account, answer => {
              callback(answer);
            });
          })
          .catch(e => {
            console.log(e);
            callback('ERROR 404');
          });
      },
    일단 express 쪽 코드는 이렇게 작성했는데, 잘 되지 않네요.. React 기준으로 설명해주셔도 괜찮습니다!! coldmind님께서 내주신 IPFS 과제가 참 어렵네요 ㅠㅠ
    swkim109
    @swkim109

    @DNATUNA 우선 pinata를 통해서 ipfs hash 값을 얻는 것을 구현해보시고... 그 다음에는 그렇게 얻은 ipfs hash를 토큰 생성시 전달해서 컨트랙트에 저장하면 되겠네요? 그런데 백엔드에서 컨트랙트를 호출하려면 주체가 가스비를 부담해야 합니다.

    아무튼 pinata에서 API키를 받으셨을테고, 아마 파일을 IPFS에 업로드하시려는 것 같은데, 그렇다면 임의의 파일을 하나 IPFS에 업로드하는 것부터 시작해야 하지 않을까 싶습니다. 그리고 콜백에서 리턴받은 해쉬를 컨트랙트에 전달해주면 될 듯 합니다. 찾아보니 pinata에 Node.js SDK가 있으니 이것을 이용하면 좀더 수월할 듯 싶네요.
    https://github.com/PinataCloud/Pinata-SDK#pinFileToIPFS-anchor

    swkim109
    @swkim109
    @DNATUNA 그런데 과제를 꼭 해야 하는 것은 아닌데요... 😅
    윤지호
    @jiho3013
    안녕하세요. 전 블록체인 Dapp 이더리움_트랜잭션 초기 부분을 듣는 수강생인데요. 강사님이 링크 걸어주신 프로젝트 파일을 보면 node_modules 파일이 없던데, 그래서 그 프로젝트 파일에 npm install 이런 식으로 해서 node_modules를 설치하면 안되더라고요. 혹시 링크 걸어준 파일 가지고 해결할 수 있는 방법에는 어떤 것이 있나요?
    swkim109
    @swkim109
    @jiho3013 아... 깃허브에 있는 걸 clone하신 건가요? 제가 확인을 해보고 알려드리겠습니다. 좀 지난 레포라서... 😝
    내일 아침에 확인해보시는 것이 어떨까요? 제가 좀 보고 여기에 메시지를 남기도록 하겠습니다. 그 동안 다른 걸 하세요... 😂 @jiho3013
    윤지호
    @jiho3013
    예, 아무쪼록 꼭 해결만 해주셨으면 합니다. ㅠㅠ
    swkim109
    @swkim109
    @jiho3013
    제가 해보니 안되는 부분이 있었습니다. 트러플 최근 버전, 그리고 Node.js 14.16.1(npm 7.11)에서 안되는 부분을 확인을 했습니다. 다시 clone을 하시고 README.md 부분에 설명을 달아놓았습니다. 해보다가 안되는 부분은 언제든지 질문해주시면 되겠습니다!
    swkim109
    @swkim109
    블록체인 Dapp 이더리움_트랜잭션 의 예제를 업데이트 했습니다.
    https://github.com/swkim109/dapp-example
    Truffle 5.2.3 (core: 5.2.3)
    Solidity - 0.5.16 (solc-js)
    Node 14.16.1 Web3.js 1.2.9
    GeonHun Kim
    @DNATUNA
    NFT 코인 생성 시 ipfs를 string calldata로 부르는데요! 그냥 hash 값을 넘겨줘도 되나요? 계속 토큰 발행이 안돼서 질문 드립니다 ㅠ
    swkim109
    @swkim109
    음... 해쉬값은 그냥 문자열이니까 상관없을 겁니다. 어떤 에러가 나는지 궁금하네요?
    백엔드에서 컨트랙트 메소드를 호출하면 호출하는 계정이 가스비를 내야 하니까 이더를 조금 가지고 있어야 합니다.
    @DNATUNA
    GeonHun Kim
    @DNATUNA
    가나슈로 하고 있어서 이더는 가지고 있습니다!
    image.png
    로그도 해당과 같이 잘 찍히는데
    image.png
    막상 확인해보면 토큰 생성이 안된 상태로 나옵니다..
    msg.sender로 안하고 직접 account를 넣어주는 것이 문제가 될 수 있나요?
    GeonHun Kim
    @DNATUNA
    트러플 콘솔에서 확인해본 결과 아주 잘 진행되는데요! js 파일로 하면 안되네요 ㅠㅠ
    image.png
    image.png
    swkim109
    @swkim109
    @DNATUNA 그렇다면 JS부분에서 뭔가 잘못되었을 가능성이 있네요. 저도 한번 express box로 해보겠습니다. https://github.com/arvindkalra/express-box 이걸 사용한 것인가요?
    GeonHun Kim
    @DNATUNA
    @swkim109 넵 맞습니다! 정말 감사합니다만 선생님 드디어 성공했습니다..!!!!
    createNFT: async function (account, ipfsHash, callback) {
        const self = this;
    
        // Bootstrap the MetaCoin abstraction for Use.
        CreateToken.setProvider(self.web3.currentProvider);
        CreateToken.web3.eth.defaultAccount = account;
    
        const meta = await CreateToken.deployed();
        const nft = await meta.mint(account, ipfsHash, { from: account, gas: 3000000 });
    
        callback(nft);
      },
    맞게 코딩한 것인지는 모르겠지만.. 구글링을 통해 이런 저런 시도를 해보니 결국 성공했습니다..!
    swkim109
    @swkim109
    아... 뭐가 문제였나요? 원인을 알아야 다음에도 같은 문제를 겪지 않죠.
    @DNATUNA 이제보니 call 로 호출하셨구나. 저도 미처 파악을 못했네요. truffle-contract를 사용할 때 일반적인 조회는 call이고 트랜잭션은 call을 붙이지 않습니다.
    This message was deleted
    swkim109
    @swkim109
    meta.mint.call(account, ipfsHash); (X)
    meta.mint(account, ipfsHash, {from: }); (O)
    백엔드에서 직접 트랜잭션을 전송하는 경우에는 {from: }이 필요하겠네요. 앞으로 잊지 않으실 겁니다! 👍
    swkim109
    @swkim109
    @DNATUNA 한가지 유념할 것은 @truffle/contract을 사용할 때와 web3.js를 사용할 때 함수 호출시 차이가 있다는 것입니다.
    web3.js를 사용할 때는 컨트랙트 읽기 메소드가 get, 쓰기 메소드가 set이라면
    meta.methods.get(param).call()
    meta.methods.set(param).send({from: })
    윤지호
    @jiho3013
    블록체인 Dapp 이더리움_트랜잭션의 4번째 강의 web3.js 와 메타마스크로 트랜잭션 전송하고 이벤트 받기 맨 마지막 실행 부분을 하고 있는데 이런 에러가 뜹니다. 물론 강사님이 수정하신 파일 가지고 하는데 말입니다.
    캡처1.PNG
    윤지호
    @jiho3013
    아, 설마 큰 값 때문에 그래서 그런가 작은 수로 테스트해보니까 되더라고요. 1000 미만인 값들은 되던데, 왜 1000 이상인 값들로 테스트하면 위 그림과 같은 에러가 뜨는지 모르겠습니다.
    swkim109
    @swkim109

    @jiho3013 컨트랙트를 보면

    function set(uint x) public {
            require(x < 1000, "Should be less than 1000");
            storedData = x;
            emit Change("set", x);
    }

    require 조건에 걸려서 그렇습니다. 트랜잭션 전에 확인하는 것이고 그냥 확인 누르면 트랜잭션 비용(흔히 "가스비"라고 함)만 날리고 처리는 안되는 것이죠.😅

    윤지호
    @jiho3013
    @swkim109 아, SimpleStorage.sol 파일 안 보고 영상만 보고 왜 안 되지 이랬네요. ㅋㅋㅋㅋ ㅡ.ㅡ 감사합니다.
    Seungwoo Kim
    @seungwooKim99
    안녕하세요!
    최근 블록체인에 관심이 생겨 강좌 알아보다가 여기까지 왔네요ㅎㅎ
    열심히 공부하겠습니다😎
    swkim109
    @swkim109
    @seungwooKim99 예, 반갑습니다! 👍