게시글
질문&답변
2023.06.11
강의 업데이트 문의
안녕하세요, 옛날부터 따로 생각은 하고 있었는데요, 실현은 못 하고 있었네요 ㅠㅠ.. NFT 무료 강의도 리메이크 문의가 와서요, 조금더 실용적으로 다시 제작 하고 있습니다, 해당 본강의는 찍으면 이번에는 hardhat 이나, foundry로 강의를 제작하겠습니다. 이렇게 질문 주셨는데, 혹시 따로 간단하게 만들어 보고 싶은 프로젝트있으시다면, 참고해서 그거 바탕으로 제작 해보겠습니다 :) 좋은 하루되세요!!
- 1
- 1
- 361
질문&답변
2023.02.24
fallback
안녕하세요 제원님, 네 fallback 안의 로직이 있다면, 해당 로직이 살행될 때 가스비를 소비하게 됩니다:) 소비하는 비용은 트랜잭션을 보낸 사람이 지불합니다!!
- 1
- 1
- 299
질문&답변
2023.02.23
pure view
안녕하세요 제원님 :) function balance1(address _a) public view returns (uint256) { return _a.balance; } function fun1(uint256 _a) public pure returns (uint256) { if (_a == 3) { return 555; } return 111; } 두함수를 보시면, balance1( address _a )와 fun1( uint256 _a ) 이렇게 되어있죠, 즉 변수 _a는 함수의 파라메터에 최초로 정의된 것 알 수가 있습니다. 변수 _a가 파라메터로 정의됬다는 뜻은 함수 내부에서만 사용이 가능한 로컬변수 라고 생각할 수 있습니다. 즉 _a를 함수 밖으로 가져가서 사용하지 못 하겠죠 자 그러면, pure 와 view 는 무엇일까요 ? pure 와 view 는 데이터를 저장하지 않을 때 사용되는 모디파이어 입니다. 두 함수에서 볼 수 있듯이, 함수 밖의 변수에 데이터를 따로 저장하지 않고 있죠? 자 그러면 pure 와 view 의 차이점은 무엇일까요? 일단 balance1(address _a) 의 view 부터 보겠습니다. view 는 함수의 밖에 있는 데이터 값을 읽어 올 때 사용합니다. _a 는 함수 내부에 정의된 로컬변수 인데, 어떻게 외부의 값을 읽어와서 view라고 표시한걸까요? _a는 주소형 타입 address 인것을 알 수 있습니다. 주소형 타입의 경우 멤버변수로 balance를 조회할 수 있습니다. (balance는 현재 사용중인 블록체인의 메인 코인의 잔액을 나타냅니다) 즉, _a는 로컬 변수지만, 주소형이기에, 멤버변수인 balance라는것을 조회하기에 view를 쓴것을 알 수 있습니다. 이와 반대로, fun1(uint256 _a) 의 pure는 uint인 정수형 타입이며, 밖에서 읽어 들여오는게 없죠 그렇기 때문에 pure를 사용한것을 알 수 있습니다. 정리하자면, pure 와 view 는 함수 밖의 변수의 데이터를 저장하지 않을 때, 함수에 적용한다. view 는 함수 밖의 변수의 데이터를 저장하지 않을 때, 함수 밖의 변수의 값을 읽어 올 때, 함수에 적용한다. pure 는 함수 밖의 변수의 데이터를 저장하지 않을 때, 함수 밖의 변수의 값을 읽어 오지않을 때 함수에. 적용한다. 감사합니다 :)
- 1
- 1
- 348
질문&답변
2023.02.20
SafeMath 함수
안녕하세요 제원님 :) 이전 답변이 도움이 되었다니, 다행이네요 :) SafeMath는 문자그대로 이해하시면, 편하세요. 안전한 수학이죠. 솔리디티 버전 0.8미만 에서는 overflow 와 underflow 를 방지하는 기능이 없었습니다. 예를 들어서, uint8 의 범위 는 0~255 입니다. 그러나, 솔리디티 버전 0.8미만 underflow 와 overflow 를 방지하는 기능이 없어서, 0에서 underflow가 일어나 255로 갈수도 있고 , 255에서 overflow가 일어나서 0으로 갈 수 있는 문제가 있었습니다. 그래서, 이것을 방지하기 위해, safeMath 라는 라이브러리를 사용하게되었습니다. 그러나, 솔리디티 0.8 이상 부터는 underflow 와 overflow 를 자동으로 방지 하기에, 더이상 safeMath 를 쓰시지 않으셔도 됩니다 :)
- 1
- 1
- 428
질문&답변
2023.02.20
솔리디티
안녕하세요 제원님 :) 먼저, lec13_1 은 whoIsMsgSender 라는 함수를 갖고 있습니다. whoIsMsgSender 는 msg.sender 를 반환을 합니다. msg.sender 는 트랜잭션을 보낸 주소 입니다, 즉 여기에서는, whoIsMsgSender 를 실행한 (트랜잭션을 보낸) 주소라고 생각하시면 됩니다. 자 그러면, lec13 의 함수 callWhoIsMsgSender 는 lec13_1 의 함수 whoIsMsgSender 를 실행하고 (트랜잭션을 보내고) 있습니다. 즉 lec13_1 의 함수 whoIsMsgSender 의 입장에서 생각을 하면, lec13 의 함수 callWhoIsMsgSender 가 실행한것이기에, whoIsMsgSender 의 msg.sender는 lec13 주소가 됩니다. 자 그러면, lec13 의 함수 callWhoIsMsgSender 가 lec13_1 의 함수 whoIsMsgSender 를 실행을 시키려면, 누군가 lec13 의 함수 callWhoIsMsgSender 를 실행해야겠죠? 예를 들어서, Alice 가 lec13 의 함수 callWhoIsMsgSender 를 실행시켰다고 가정했을때, lec13 의 함수 callWhoIsMsgSender 의 msg.sender 는 Alice 의 주소가 되겠죠. 자 그러면, 정리해서 한번 볼까요? Alice ---트랜잭션 보냄---> lec13 의 함수 callWhoIsMsgSender ---트랜잭션 보냄---> lec13_1 의 함수 whoIsMsgSender 입니다 . 즉, lec13 의 함수 callWhoIsMsgSender 입장에서는 Alice 가 자신을 실행시켰으니, lec13 의 함수 callWhoIsMsgSender 의 msg.sender 는 Alice 의 주소가 되겠죠. 반면에, lec13_1 의 함수 whoIsMsgSender 는 lec13 의 함수 callWhoIsMsgSender 가 자신을 실행 시켰으니, lec13 의 함수 callWhoIsMsgSender 의 msg.sender 는 lec13 의 주소가 되겠죠. 혹시 궁금한점 있으시면, 질문 남겨주세요 :)) 감사합니다 :)
- 1
- 1
- 338
질문&답변
2022.12.06
안녕하세요 강사님 질문이 있습니다
안녕하세요, 리믹스가 업데이트 되고, transaction 과 execution cost가 같게나오네요.. 원래는 아래와 같은 내용이였는데요. 현재는 정확히 왜 같이 나오는지 리믹스 문서에서 찾아 볼 수가 없네요.. 다만 원래 아래와 같은 내용있였다는 점 참고 부탁드립니다. 리믹스의 이전 버전에서는 아래와 같은 내용이였습니다. gas: 최대 가스 비용 execution cost : 함수를 실행하는데 사용되는 가스 비용 ( 이더리움 황서 opcode의 가스가격으로 계산) transaction cost : 트랜잭션을 보내는 비용 ( 트랜잭션 비용 + execution cost) 트랜잭션 비용 : 바이트화 된 함수의 명과 매개변수(있다면) 바이트화 (예: 0x12ab34cd0000000000000000000000000000000000000000000000000000000000000001)된 것을 이더리움 황서에 측정된 opecode의 가스 가격으로 계산되어지는 비용.
- 1
- 1
- 188
질문&답변
2022.12.04
function 매개변수에 관한 질문이 있습니다
안녕하세요 :) 네, 값 타입은 값이 저장될 때 값자체가 저장이 됩니다. 그래서, 저희가 함수 내부에서 값타입을 쓸 때, 따로 memory와 같이 저장장소를 따로 지정해주지 않아도 됩니다. 반면에, 참조 타입은, 값 자체가 저장되는것이 아닌, 값을 가리키는 참조되는 주소를 복사합니다. 그래서, 그 참조형 값을 갖고 오고 싶으면, 저희가 특정한 저장공간에 들고 올 수 가 있습니다. 예를 들어 memory를 붙여 주시면 memory 공간에 참조형 타입을 주소를 이용해 값을 저장하겠다가 된다고 볼 수 있습니다 :)
- 1
- 2
- 211
질문&답변
2022.12.03
가스비 질문이 있습니다
안녕하세요 민정후님 :) 네, 값을 변경하실 때마다 트랜잭션을 주셔야하는데, 이때 가스비용이 소비가 됩니다 :) 감사합니다!
- 1
- 2
- 230
질문&답변
2022.11.14
Ownable에 대해서 질문이 있습니다
안녕하세요, p1n9 님 :) 네, 정확하십니다! 기본적으로 상속을 받게 된다면, 상속 받은 스마트 컨트랙트도 다 같이 실행이 됩니다 :) 그래서, Ownable.sol ( https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol ) 의 컨스트럭터를 확인하시면, 아래와 같이 나오는데요. constructor() { transferOwnership(msgSender()); } 스마트 컨트랙트를 배포한 사람이, Owner의 권한을 갖게 되는걸 보실 수 있으세요. 이와같이, 제가 Sale contract에 Ownable.sol 을 상속 받아서, 제가 주소 0xab..12 를 사용해서 Sale contract를 배포한다면, 0xab..12 가 owner의 권한을 받게 됩니다 ;) 혹시 질문 사항있으시면 언제든지 남겨 주세요 :)
- 1
- 1
- 251
질문&답변
2022.10.13
ERC20과 프론트엔드연결 지갑 변경 관련 질문 입니다!
네, 정말 이상하네요. 현재 같은 코드로 해보니, 제 쪽에서는 잘 돌아가고 있습니다...😂 혹시 getWeb3.js 파일을 제가 볼 수 있을까요 :) ??
- 1
- 2
- 254