컨트랙트로 이더를 받을 수 있는 함수 4가지 정리

 

 

 

 

목차 

1. Payable

2. Fallback

3. Recive

4. Selfdestruct ? 

우선 solidity에서 사용하는 msg에 대해 자세히 알아보자. 

https://programmers.co.kr/learn/courses/36/lessons/10879

 

이더리움 솔리디티 실습 튜토리얼 - 메세지 프로퍼티

⚠️이 강의에서 다루는 Solidity는 최신 버전이 아닙니다. 이용에 참고해주세요. (현재 Solidity 0.4.24 사용 중) --- 솔리디티(Solidity) 기반의 탈중앙화 애플리케이션(dApp)을 구현하는 온라인 실습 튜토

programmers.co.kr

 

메세지 프로퍼티(Message Properties)

계약은 msg 프로퍼티를 사용해 계약을 호출한 사람이 보낸 메세지를 확인한다. 

msg 프로퍼티는 다음과 같은 정보를 담는다.

 

정보타입설명 : 

data byte 호출 데이터
sender address 계약을 호출한 이더리움 주소
value uint 계약 주소로 보낸 Ether 량
gas uint gas limit1에서 함수를 호출하고 남은 가스

 

msg.data 가 나왔다.

Solidity의 관점에서 컨트랙트란 무수한 코드들(함수)과 데이터(상태)가 Ethereum 블록체인의 특정 주소에 존재하는 것입니다. 다음 줄의 uint storedData;  uint (256 비트의 부호없는 양의 정수) 타입의 storedData 로 불리는 변수를 선언한 것입니다. 이것은 데이터베이스에서 함수를 호출함으로써 값을 조회하거나 변경할 수 있는 하나의 영역으로 생각할 수 있습니다. Ethereum에서, 변수들은 컨트랙트에 포함되어 있으며 set  get 함수로 변수의 값을 변경하거나 조회할 수 있습니다.

참고 : 

https://solidity-kr.readthedocs.io/ko/latest/introduction-to-smart-contracts.html

 

 


1.Payable 

Functions and addresses declared payable can receive ether into the contract.

 

https://gusdnr69.tistory.com/19

 

Solidity 이더리움 송금하기

사람 뿐만 아니라, 스마트 계약도 내부적으로 이더리움 계정1를 가집니다. 스마트 계약은 계약 계정를 통해 이더를 거래합니다. 예를 들어, 계약을 통해 A가 B에게 10 이더를 보내는 계약을 호출

gusdnr69.tistory.com

 

1. 아래와 같이 payable키워드를 사용해서 value가 0.5이더 이상이면 balance에 저장할 수 있다. 

 

2. 또 한가지 알아낸 것은, 파라미터로 (address payable _to, uint _amount )를 작성해서 주소로 이더를 보낼 수 있다. 

 

 


2. Fallback 

 

먼저, 컨트랙트는 기본적으로 돈을 받지 못한다.

근데, 컨트랙트의 fallback함수가 payable로 찍혀있으면, 이더를 받을 수 있다!

즉,  fallback을 payable로 만들어놓으면, 이더를 받을 수 있다.

 

폴백함수는, 

fallback is a function that does not take any arguments and does not return anything.

It is executed either when

  • a function that does not exist is called or
  • Ether is sent directly to a contract but receive() does not exist or msg.data is not empty

fallback has a 2300 gas limit when called by transfer or send.

 

 

- 컨트랙트는 한개의 이름없는 함수를 가질 수 있다. 이것 또한 폴백함수이며, 이 함수는 인자를 가질 수도, 

리턴 값을 줄수도 없다. 

- 폴백함수는 트랜잭션이 컨트랙트에 이더를 송금했으나 메소드를 호출하지 않은 경우에도 실행한다.

이런 경우, 함수를 가능한 싸게 만드는 것이 중요하다.  (send, tarasfer 사용하기, call은 가스비가 더 비싸다) 

-이더를 받고싶은 컨트랙트의 경우 폴백 함수를 구현해야된다. 폴백 함수가 정의되지 않았다면 예외를 발생시키고, 

이더를 돌려 보낸다. 

https://d2fault.github.io/2018/03/20/20180320-about-solidity-4/

 

- Solidity에서 다른 스마트 계약의 함수를 호출할 때 예외상황이 발생하거나 계약 간 금전적 이동이 있을 때  fallback 함수가 실행되는 경우가 많다.

- 이 fallback 함수는 임의로 작성될 수 있는 함수로 어떤 동작을 하는지 알 수 없어 공격에 이용되기 쉽다.

https://www.koreascience.or.kr/article/JAKO201907753431202.j

https://caileb.tistory.com/140

 

 

fallback 함수는 언제 호출이될까? 

내가 조사한 바로는 2가지 상황에서 호출된다.

1. 존재하지 않는 함수를 호출할 때

2. send, tarasfer, call 을 통해 이더를 컨트랙트로 보낼때 

 

'인터페이스 내의 함수 선언과 fallback 함수는 항상 external'

그 중에서도 특히 무조건 외부에서 호출되는 것이 분명한 인터페이스 내의 함수 선언(인터페이스를 상속받은 콘트랙트에서 사용)과 fallback 함수(외부에서 이 콘트랙트에 입금을 할 때 자동 호출)는 무조건 external 키워드를 붙여줘야 합니다.

https://medium.com/day34/solidity-0-5-0-%EC%97%90%EC%84%9C%EC%9D%98-%EB%B3%80%EA%B2%BD%EC%82%AC%ED%95%AD%EC%9D%84-%EC%86%8C%EA%B0%9C%ED%95%A9%EB%8B%88%EB%8B%A4-ab6104296164

 

 

"결론은 지금 내수준으로는 fallback 이더를 받을 수 있도록해주는 함수이며, 위의 예외의 상황(컨트랙트안에 없는 함수를 호출했을 시 등)을 통한 대비책으로 사용했다고 결론내리는게 좋겠다.

 

그리고 공부하면서, fallback함수말고도 생성자 그리고 일반함수에도 payable을 다 추가 해줄 수가 있는데, 왜 굳이 fallback함수를 사용할까? 라는 의문이 들었다. 하지만 곧 깨달은 점은 우선, 각각 생성자/ 일반함수/ fallback이 만들어졌을때의 목적을 생각하고,  payable을 사용 해서 이더를 받을 수 있는 방법은 많겠지만, 목적에 맞게끔 내가 잘 활용을 해야겠다는 결론이다. " -> 이후에 알게되는 내용 더 추가할 예정

 

+) 스마트 컨트랙트의 보안의 취약점에대해서 알아야한다.

 

참고한 사이트 : 

https://sejinik.tistory.com/119

 

이더리움 스마트 컨트랙트 보안 취약점

블록체인에 대해 공부하고 글로 남기려고 합니다 첫 주제는 이더리움 스마트 컨트랙트의 보안 취약점 입니다 실제 사례들도 가져와 쉽게 이해해 봅시다! 먼저 이더리움이 왜 만들어졌을까 백서

sejinik.tistory.com

http://tcpschool.com/c/c_function_recursive


3. Recive 

 

위의 Fallback함수와 동일한 기능을 담당하고있다.

다만 다른점을 굳이 꼽자면 업그레이드가 되면서, fallback함수대신 recive함수를 사용하라고 컴파일러가 유도를 하고있고, fallback함수가 recive를 포함하는 상위개념이라고 생각하면 되겠다.  

https://docs.soliditylang.org/en/v0.6.2/contracts.html

https://solidity-by-example.org/sending-ether/

 


 

여기서 그럼 Fallback & Recive의 차이점이 궁금 할 수도있는데, 간단히 정리하자면 아래와 같다.  

Fallback & Recive차이점 


Fallback :  항상 이더랑 데이터를 받는다. 근데, (데이터가 없으면 Fallback이 실행 즉, 컨트랙트 내에 data가 없으면 실행이된다. )

recive    :  이더만 받는다. 

https://solidity-by-example.org/

 


4. Selfdestruct  

 

Contracts can be deleted from the blockchain by calling selfdestruct.

selfdestruct sends all remaining Ether stored in the contract to an designated address.

 

Vulnerability (취약성) :

  • A malicious contract can use selfdestruct to force send Ether to any contract.

 

https://solidity-by-example.org/hacks/self-destruct/

 

 

selfdestruct를 사용하여, 컨트랙트를 파괴할수있지만, 블록체인 특성상 관련 코드는 누구나 있다.

그래서 위험하다고생각하는사람은 이용안하는거고, 필요할 같다고 생각하는사람은 사용하면된다.

 

따라서 결론은, 코드를 잘 볼 줄 아는 능력이 필요하다! 

 

 

 

 


+ ) 추가적으로 내가 직접 해볼만한 사이트 : 

https://solidity-by-example.org/sending-ether/

 

Sending Ether (transfer, send, call) | Solidity by Example | 0.7.6

Sending Ether (transfer, send, call) How to send Ether? You can send Ether to other contracts by transfer (2300 gas, throws error)send (2300 gas, returns bool)call (forward all gas or set gas, returns bool) How to receive Ether? A contract receiving Ether

solidity-by-example.org

https://d2fault.github.io/2018/03/20/20180320-about-solidity-4/

 

[Ethereum] Solidity 문법 이해(4)

함수 변경자 _;를 만나면 다음에 나열된 함수를 실행하라는 의미이다. 그리고 _; 뒤에 있는 문장은 차곡차곡 스택에 쌓인다. 도대체 이걸 왜 만든 건지 모르겠다. (심지어 책 예시에 myModifier4는 적

d2fault.github.io

https://medium.com/codechain-kr/%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-%EC%8A%A4%EB%A7%88%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%9E%99%EC%9C%BC%EB%A1%9C-%EC%9E%85%EA%B8%88%EB%B0%9B%EA%B8%B0%EA%B0%80-%EC%96%B4%EB%A0%A4%EC%9A%B4-%EC%9D%B4%EC%9C%A0-f78b25c2506d

 

이더리움 스마트 컨트랙으로 입금받기가 어려운 이유

이더리움의 차별점은 스마트 컨트랙을 이용하여 블록체인 위에서 다양한 어플리케이션을 만들 수 있다는 점이다. 하지만 스마트 컨트랙 때문에 오히려 간단한 일이 복잡해지기도 한다. 일례로,

medium.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기