본문 바로가기
Develop/Solidity

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

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


 

간단하게 송금을 할 수 있는 스마트 컨트랙션을 만들어보자.

제일 먼저 할 것은 파일은 생성하고 pragma를 입력해주는 것이다.

이후 다음과 같이 코드를 입력해주면,

 

 

deploy 후에 receiveMoney 가 생성된 것을 확인할 수 있다.

 

 

이후 스마트 컨트랙트를 통해 Ether를 보내기 위해선 다음의 값을 조절해주면 되고,

 

 

receiveMoney 를 통해 송금을 할 수 있다.

 

하지만 리믹스에서는 스마트 컨트랙트에서 잔고를 빼내 올 방법이 없으므로,

또다른 함수를 이용해 스마트 컨트랙트의 주소에서 잔고를 빼내올 수 있게 해야한다.

 

다음과 같이 코드를 작성한다면,

 

 

해당 스마트 컨트랙트 안에 있는 잔고의 금액을 확인할 수 있게 된다.

 

 

그렇다면 의문이 생기게 된다.

스마트 컨트랙트 안에 받아 놓은 돈은 어떻게 움직일 수 있을까?

 

솔리디티에는 트랜잭션이 진행되는 동안에도 사용할 수 있는 글로벌 오브젝트가 존재한다.

이를 메세지 오브젝트 라고 한다.

 

이를 확인하기 위해 새 변수를 추가해보자.

 

 

해당 변수에는 돈을 얼마나 받았는지 기록할 것이다.

돈을 받을 때 해당 변수의 잔고를 변화시킬 것이므로 receiveMoney 함수에 다음과 같은 코드를 입력해준다.

 

 

송금할때의 로그에 value가 존재함을 볼 수 있다.

 

 

이번에는 스마트 컨트랙트에서 출금을 해보도록 하자.

 

 

배포 후 함수를 실행시켜 보면, 잔고를 모두 보낸 것을 확인할 수 있다.

 

 

여기서 계좌를 변경해, 돈을 출금하려고 해보면,

잔고는 0이지만 받은 돈은 있는 것을 확인할 수 있다.

이처럼 잔고를 변수에 저장하는 것은 매우 조심해야하는 일이다.

 

 

이번에는 해당 코드에 스마트 컨트랙트가 어디로 송금해야 하는지 말해주는 함수를 만들어보도록 하자.

 

송금을 하지 않고 주소만 확인하므로, payable은 필요하지 않다.

 

 

1ether를 잔고에 넣은 뒤,

 

 

새로운 계정의 주소를 withdrawMoneyTo에 넣어주고 트랜잭션을 호출하면.

 

 

주소 입력을 통해 해당 계좌에 송금이 된 것을 확인할 수 있다.

 

 

(트랜잭션 요금을 낸 것은 첫 번째 계정 // 트랜잭션을 시작했기 때문.)

 

 

 


계정에 대한 이론

이더리움에서 계정에는 2가지 유형이 존재한다.

  • 외부 소유 계정 (EOA) - External Owned Account
  • 컨트랙트 계정 (계약 계정 - CA) - Contract Account

 

EOA

EOA는 일반적인 계정 유형으로, 계정의 주소를 통제할 수 있는 개인키가 존재한다.

이러한 EOA는 트랜잭션을 발생 시키고, 이를 다른 EOA나 CA에 전송할 수 있다.

 

 

CA

CA는 컨트랙트 코드에 의해 통제되는 계정으로, 컨트랙트를 네트워크에 배포될 때 생성된다.

EOA와는 달리 CA는 계정의 주소를 통제할 수 있는 개인키가 존재하지 않으며,

개인키가 존재하지 않기 때문에 트랜잭션을 발생시킬 수 없다.

 

따라서 EOA가 발생시킨 트랜잭션을 전송 받고, 해당 트랜잭션의 메세지가 조건을 충족한다면

컨트랙트 코드가 실행되어 특정한 액션이 실행된다.

 

 

 


추가적으로 보면 좋은 것.

 

Account

이더리움의 상태(State)는 계정이라고 하는 오브젝트들로 구성되어 있으며,

각 계정 오브젝트에 20바이트의 주소와, 상태변화를 가지고 있다.

Account는 4가지(Nonce, Balance, StorageRoot, CodeHash) 정보로 구성되며,

계정의 종류에 따라 다음과 같은 역할을 수행한다.

 

 

EOA

  • Nonce : Account에서 전송된 트랜잭션의 수
  • Balance : Account가 소유한 잔고 정보로써, wei 단위로 표시
  • storageRoot : Merkle Paticia Tree의 Root Hash
  • codeHash : 빈 문자열의 Hash 정보

CA

  • Nonce : Account에서 생성된 Contract 수
  • Balance : Account가 소유한 잔고 정보로써, wei 단위로 표시
  • storageRoot : Merkle Paticia Tree의 Root Hash
  • codeHash : Account에 포함된 이더리움 버츄얼 머신(EVM) code의 Hash