본문 바로가기
Develop/Solidity

[Solidity] 3. 스마트 컨트랙트 시작, 중단, 정지하기

by Tarra 2023. 2. 14.

 

 

 

 

 


개인 공부 후 자료를 남겨놓기 위한 목적이므로,
생략되거나 오류가 있을 수 있음을 알립니다.

 

[Solidity] 1. 변수

[Solidity] 2. 간단한 송금 시스템 만들어보기 + 계정에 대한 이론

[Solidity] 3. 스마트 컨트랙트 시작, 중단, 정지하기

[Solidity] 4. mapping

[Solidity] 5. 예외처리 (require와 assert)

[Solidity] 6. 생성자, 대비책 함수 (view / pure / getter)

[Solidity] 7. 제어자, 상속, file import

[Solidity] 8. 이벤트 및 반환 변수

 


- 참고했던 document

▶ Become Ethereum Blockchain Developer

https://ethereum-blockchain-developer.com/000-learn-ethereum/

 

Overview and Pricing - Become Ethereum Blockchain Developer

Learn Blockchain Development - Become Web3 Expert Ethereum-blockchain-developer.com is offering web developers, enterprise developers and software development professionals self-paced video courses with interactive labs to become successful Ethereum Blockc

ethereum-blockchain-developer.com

 

▶ Solidity_doc

https://docs.soliditylang.org/en/v0.8.16/

 

Solidity — Solidity 0.8.16 documentation

1. Understand the Smart Contract Basics If you are new to the concept of smart contracts we recommend you to get started by digging into the “Introduction to Smart Contracts” section, which covers: 2. Get to Know Solidity Once you are accustomed to the

docs.soliditylang.org

 

▶ 솔리디티_doc

https://solidity-kr.readthedocs.io/ko/latest/

 

Solidity — Solidity 0.5.10 documentation

Solidity는 스마트 컨트랙트를 구현하기 위한 컨트랙트 기반의 고급 프로그래밍 언어입니다. Solidity는 C++, Python, 그리고 JavaScript의 영향을 받아 만들어졌습니다. 그리고 Ethereum Virtual Machine(EVM)에서

solidity-kr.readthedocs.io

 

 

해당 코드는 Solidity를 실행할 수 있는 IDE인 Remix에서 작성되었습니다.

http://remix.ethereum.org/

 

Remix - Ethereum IDE

 

remix.ethereum.org


 

1. 생성자와 소유권

개념을 학습하기 위해 StartStopUpdateExample.sol 파일을 만들자.

 

그리고 송금 시스템에 만들었던 간단한 함수 2가지를 다음과 같이 만들어보자.

 

 

이 코드의 문제점은 withdrawAllMoney 함수를 누구나 호출이 가능하다는 점이다.

⇒ 스마트 컨트랙트의 소유자만 상호작용이 가능하도록 해야함.

 

따라서 스마트 컨트랙트를 배포하는 계정의 주소를 저장할 변수가 필요하다.

이를 owner 로 저장하도록 한다.

그리고 배포 중에 호출되는 함수가 필요한데, 이를 생성자라고 한다. (constructor)

 

 

💡constructor 의 경우에는 배포중에 단 한번만 호출되는 특징이 있다.

 

constructor 를 통해 owner를 지정해주고, 이후 withdrawAllMoney 에서 확인하는 과정을 거치면 된다.

 

 

 

일반적인 언어였다면 if문을 통해 다음과 같이 코드를 짰겠지만,

 

 

솔리디티의 경우 필요문이라는게 존재해, 지금 시점에 어떤 특정 상태에 도달했는지 확인해주므로,

다음과 같이 코드를 짤 수 있다.

 

 

배포한 후 작업을 확인해보면,

 

 

해당 owner 가 누구인지 확인할 수 있으며, owner 가 아닐 경우 다음과 같이 오류 메세지를 확인할 수 있다.

 

 

 


 

2. 스마트 컨트랙트 일시 정지하기

스마트 컨트랙트를 정지하는 방법은 매우 간단하다.

바로 bool 값을 만들어 활용하면 된다.

 

bool 변수를 생성해주고,

 

 

보내는 이가 owner 가 아닐경우 오류 메세지를 출력해주도록 하면 된다.

 

 

bool 값을 false로 바꿨으므로 withdrawAllMoney 에도 조건을 추가해주도록 한다.

 

 

이처럼 requirebool 등을 활용해 스마트 컨트랙트에 제어 구조를 추가할 수 있다.

 

 


 

3. 스마트 컨트랙트 파기하기

스마트 컨트랙트를 파기하기 위해선 내장함수인 `selfdestruct()` 가 사용된다.
해당 함수에는 인자가 하나 들어가는데, 이는 스마트 컨트랙트의 계정에 있는 잔고를 받을 주소를 넣어주면 된다.

 

 

스마트 컨트랙트를 배포하고 파기 함수를 작동시키면, 스마트 컨트랙트는 파기되었지만,

몇몇 함수는 작동이 되는것을 확인할 수 있다.

 

이는 스마트 컨트랙트가 완전히 삭제되지 않았기 때문인데 그 이유는 블록체인의 불변성과 연관이 있다.

 

 

+ 데이터의 불변성

블록체인에서 첫 번째로 생성된 블록을 제네시스 블록 이라고 한다.

 

이 첫 번째 블록이 생성된 이후에 다음 블록이 지속적으로 생성되어

 

마치 체인처럼 이전 블록에 연결되기 때문에 모든 블록이 연결되어 있고,

 

특정한 트랜잭션을 제거하기 위해서는 모든 모드에 분산되어 있는 데이터를 걷어내야 하므로,

 

데이터의 삭제는 현재 기술로선 불가능하다. 즉 한번 배포되면 제거할 수 없다는 것.