본문 바로가기

Solidity

[크립토 좀비] 솔리디티 openzeppelin

이더리움에 컨트랙트를 배포하고 나면 컨트랙트는 변하지 않는다. = 컨트랙트를 수정하거나 업데이트할 수 없다.

 

컨트랙트로 배포한 최초의 코드는 항상 블록체인에 영구적으로 존재한다.

이것이 바로 솔리디티에 있어서 보안이 굉장히 큰 이슈인 이유이다.

만약 컨트랙트 코드에 결점이 있다면, 그것을 이후에 고칠 수 있는 방법이 전혀 없다.

그러나 이것 또한 스마트 컨트랙트의 한 특징이다. 어떤 스마트 컨트랙트의 코드를 읽고 검증을 했다면 함수를 호출할 때마다 코드에 쓰여진 그대로 함수가 실행될 것이라고 확신할 수 있기 때문이다. 누구도 배포 이후에 함수를 수정하거나 예상치 못한 결과를 발생시키지 못한다.

 

OpenZeppelin의 Ownable 컨트랙트

 

OpenZeppelin은 솔리디티 라이브러리에서 가져온 Ownable 컨트랙트이다. OpenZeppelin은 DApp에서 사용할 수 있는, 안전하고 커뮤니티에서 검증받은 스마트 컨트랙트의 라이브러리이다.

 

  • 생성자(Constructor): function Ownable()는 생성자이네. 컨트랙트와 동일한 이름을 가진,생략할 수 있는 특별한 함수이지. 이 함수는 컨트랙트가 생성될 때 딱 한 번만 실행된다.
  1. 컨트랙트가 생성되면 컨트랙트의 생성자가 owner에 msg.sender(컨트랙트를 배포한 사람)를 대입한다.
  2. 특정한 함수들에 대해서 오직 소유자만 접근할 수 있도록 제한 가능한 onlyOwner 제어자를 추가한다.
  3. 새로운 소유자에게 해당 컨트랙트의 소유권을 옮길 수 있도록 한다.

 

  • 함수 제어자(Function Modifier): modifier onlyOwner(). 제어자는 다른 함수들에 대한 접근을 제어하기 위해 사용되는 일종의 유사 함수. 보통 함수 실행 전의 요구사항 충족 여부를 확인하는 데에 사용한다. onlyOwner의 경우에는 접근을 제한해서 오직 컨트랙트의 소유자만 해당 함수를 실행할 수 있도록 하기 위해 사용될 수 있다.

 

 

가스 - 이더리움 DApp이 사용하는 연료

 

솔리디티에서는 사용자들이 자네가 만든 DApp의 함수를 실행할 때마다 가스를 지불해야함. 

각각의 연산은 소모되는 가스 비용(gas cost)이 있고, 그 연산을 수행하는 데에 소모되는 컴퓨팅 자원의 양이 이 비용을 결정한다.

함수의 전체 가스 비용은 그 함수를 구성하는 개별 연산들의 가스 비용을 모두 합친 것과 같다.

 

그래서 uint를 쓸때도 할 수 있는 한 더 작은 단위의 uint를 사용하는게 좋다.

 

동일한 데이터 타입은 하나로 묶어놓는 것이 좋다. 즉, 구조체에서 서로 옆에 있도록 선언하면 솔리디티에서 사용하는 저장 공간을 최소화한다. 예를 들면, uint c; uint32 a; uint32 b;라는 필드로 구성된 구조체가 uint32 a; uint c; uint32 b; 필드로 구성된 구조체보다 가스를 덜 소모한다.

 

 

 

시간 단위(Time units)

 

now 변수를 쓰면 현재의 유닉스 타임스탬프(1970년 1월 1일부터 지금까지의 초 단위 합) 값을 얻을 수 있다. 

솔리디티는 또한 seconds, minutes, hours, days, weeks, years 같은 시간 단위 또한 포함하고 있다. 이들은 그에 해당하는 길이 만큼의 초 단위 uint 숫자로 변환된다. 즉 1 minutes는 60, 1 hours는 3600(60초 x 60 분), 1 days는 86400(24시간 x 60분 x 60초).

 

 

 

구조체를 인수로 전달하기

 

private 또는 internal 함수에 인수로서 구조체의 storage 포인터를 전달할 수 있다. 

 

function _doStuff(Zombie storage _zombie) internal { // _zombie로 할 수 있는 것들을 처리 }

 

 

인수를 가지는 함수 제어자

modifier olderThan(uint _age, uint _userId) { require (age[_userId] >= _age); _; }

 

  1. 함수의 나머지 내용을 실행할 수 있도록 제어자의 마지막 줄에 _;를 넣는 것을 잊지 말자.

 

솔리디티에서 더 비싼 연산 중 하나는 바로 storage를 쓰는 것이다.

비용을 최소화하기 위해서, 진짜 필요한 경우가 아니면 storage에 데이터를 쓰지 않는 것이 좋다.