본문 바로가기

전체 글

(41)
[Solidity] 가스(Gas) 가스 - 이더리움 DApp이 사용하는 연료 솔리디티에서는 DApp의 함수를 실행할 때마다 가스 라고 불리는 화폐를 지불해야 함 사용자는 이더(ETH)를 이용해서 가스를 사기 때문에, DApp 함수를 실행하려면 사용자들은 ETH를 소모해야 함. 함수를 실행하는 데에 얼마나 많은 가스가 필요한지는 그 함수의 로직(논리 구조)이 얼마나 복잡한지에 따라 달라짐. 각각의 연산은 소모되는 가스 비용(gas cost)이 있고, 그 연산을 수행하는 데에 소모되는 컴퓨팅 자원의 양이 이 비용을 결정. 예를 들어 storage에 값을 쓰는 것은 두 개의 정수를 더하는 것보다 훨씬 비용이 높음. 함수의 전체 가스 비용은 그 함수를 구성하는 개별 연산들의 가스 비용을 모두 합친 것과 같음 함수를 실행하는 것은 사용자들에게 실..
[Solidity] 컨트랙트의 불변성 * 이더리움에 컨트랙트를 배포하고 나면, 컨트랙트는 변하지 않는다. (Immutable) -> 컨트랙트를 수정하거나 업데이트 할 수 없음 컨트랙트로 배포한 최초의 코드는 항상, 블록체인에 영구적으로 존재함. 이 부분이 솔리디티에 있어서 보안이 굉장히 큰 이슈인 이유 컨트랙트 코드에 결점이 있다고 하더라도, 배포 이후 그것을 고칠 수 있는 방법이 전혀 없음. 함수를 호출할 때 마다 코드에 쓰여진 그대로 함수가 실행될 것. 그 누구도 배포 이후에 함수를 수정하거나 예상치 못한 결과를 발생시키지 못함 * 외부 의존성 - 특정 컨트랙트의 주소를 DApp에 직접 붙여넣은 경우, 붙여넣은 특정 컨트랙트에 버그가 있었고, 누군가가 파괴해버렸다면? 그럴 일은 잘 없겠지만, 만약 그런 일이 발생한다면 DApp은 완전히 ..
[Solidity] Storage vs Memory 솔리디티에는 변수를 저장할 수 있는 공간으로 Storage vs Memory 두가지가 있다. Storage 는 블록체인 상에 영구적으로 저장되는 변수를 의미 Memory 는 임시적으로 저장되는 변수로 컨트랙트 함수에 대한 외부 호출들이 일어나는 사이에 지워짐 각각 컴퓨터 하드 디스크(Storage)와 RAM(Memory)과 같음 대부분의 경우에는 키워드를 이용할 필요가 없음. 왜냐면 솔리디티가 알아서 처리해주기 때문! 상태 변수(함수 외부에 선언된 변수)는 초기 설정상 storage로 선언되어 블록체인에 영구적으로 저장되는 반면, 함수 내에 선언된 변수는 memory로 자동 선언되어서 함수 호출이 종료되면 사라짐. 그럼 이 키워드 들을 사용하는 경우는 ? 함수 내의 구조체와 배열을 처리하는 경우! con..
[Solidity] 상속 상속 엄청나게 긴 컨트랙트를 하나 만들기 보다는 여러 컨트랙트에 코드 로직을 나누는 것이 효율적인 경우 이를 보다 관리하기 쉽도록 하는 솔리디티 기능. contract Doge { function catchphrase() public returns (string) { return "So Wow CryptoDoge"; } } contract BabyDoge is Doge { function anotherCatchphrase() public returns (string) { return "Such Moon BabyDoge"; } } BabyDoge 컨트랙트는 Doge 컨트랙트를 상속함. 즉, BabyDoge 컨트랙트를 컴파일해서 구축하는 경우, BabyDoge 컨트랙트가 catchphrase() 함수와 an..
[Solidity] Require Require : 특정 조건이 참이 아닐 때 함수가 에러 메시지를 발생하고 실행을 멈추게 함 function sayHiToVitalik(string _name) public returns (string) { // _name이 "Vitalik"인지 비교한다. 참이 아닐 경우 에러 메시지를 발생하고 함수를 벗어난다 // (참고: 솔리디티는 고유의 스트링 비교 기능을 가지고 있지 않기 때문에 // 스트링의 keccak256 해시값을 비교하여 스트링 값이 같은지 판단한다) require(keccak256(_name) == keccak256("Vitalik")); // 참이면 함수 실행을 진행한다: return "Hi!"; } sayHiToVitalik("Vitalik")로 이 함수를 실행하면 "Hi!"가 반환됨..
[Solidity] Msg.sender 솔리디티에는 모든 함수에서 이용 가능한 특정 전역 변수들이 있음. 참고 (https://solidity-kr.readthedocs.io/ko/latest/units-and-global-variables.html#) 그 중 하나가 현재 함수를 호출한 사람 (혹은 스마트 컨트랙트)의 주소를 가리키는 msg.sender (솔리디티에서 함수 실행은 항상 외부 호출자가 시작. 컨트랙트는 누군가가 컨트랙트의 함수를 호출할 때까지 블록체인 상에서 아무것도 안 하고 있기 때문에 항상 msg.sender가 있어야 함.) msg.sender를 이용하고 mapping을 업데이트하는 예시 mapping (address => uint) favoriteNumber; function setMyNumber(uint _myNumber..
[Solidity] Mapping 과 Address 이더리움 블록체인은 은행 계좌와 같은 계정들로 이루어져 있고 계정은 이더리움 블록체인상의 통화인 이더(ETH) 의 잔액을 가지고 있음 나의 은행 계좌에서 다른 계좌로 돈을 송금할 수 있듯이, 계정을 통해 다른 계정과 이더를 주고 받을 수 있음 각 계정은 은행 계좌 번호와 같은 주소를 가지고 있고 주소는 특정 계정을 가리키는 고유 식별자 (0x0cE446255506E92DF41614C46F1d6df9Cc969183) Address 주소(Address)는 특정 유저(혹은 스마트 컨트랙트)가 소유한다 주소를 계정에 대한 소유권을 나타내는 고유 ID로 활용할 수 있음 앱을 통해 새로운 계정을 생성하면 계정을 생성하는 함수를 호출한 이더리움 주소에 그 계정에 대한 소유권을 부여 Mapping mapping은 솔리..
[Solidity] Keccak256과 형 변환 함수의 반환값이 (반)랜덤인 uint가 되기를 원하면? 이더리움은 SHA3의 한 버전인 keccak256를 내장 해시 함수로 가지고 있음 해시 함수는 기본적으로 입력 스트링을 랜덤 256비트 16진수로 매핑하고 스트링에 약간의 변화라도 있으면 해시 값은 크게 달라짐 해시 함수는 이더리움에서 여러 용도로 활용되지만, 예시의 경우 의사 난수 발생기(pseudo-random number generator)로 이용 //6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5 keccak256("aaaab"); //b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9 keccak256("aaa..