solidity에서 contract는 객체지향언어에서 class와 디슷하다. 그것은 state variables에 속하는 영속적인 데이터와 이러한 변수를 수정할 수 있는 함수로 되어 있다. 다른 contract에서 함수를 호출하면 EVM함수가 호출될것이다. 따라서 context를 바꾸면 상태변수에 접근할 수 없습니다.
contract 생성
contract내에서 다른 contract를 생성하거나 외부에서 ethereum transaction을 통하여 생성할 수 있다.
Remix같은 개발환경은 UI를 통해 매끈하게 처리한다.
contract의 생성을 프로그램으로 이더리움에서 만드는 것은 web3.js같은 javascript API를 활용하는 것이 가장 좋다.
contract가 생성되면, 생성자가 한번 실행된다. 생성자는 선택사항이다. 생성자는 하나만 허용되며, 오버로딩은 지원하지 않는다.
내부적으로, contract자체 코드의 후미에 붙어서 생성자의 입력값이 ABI 코드로 변경되어 전달된다. 하지만 web3.js를 사용한다면 이부분에 대하여 신경쓰지 않아도 된다.
만약 contract가 다른 contract를 생성하고자 하면, 대상 source code가 생성하고자 하는 contract에게 알려진 상태여야 한다. 이의미는 순환 생성 종속성의 문제가 발생하지 않도록 하기위함이다.
# 생성자 내부에서는 this를 사용할 수 없다. 왜냐하면 아직 생성이 완료되지 않았기 때문이다.
# contract는 명시적으로 address로 변환할 수 있다.
# return (keccak256(newOwner) & 0xff) == (bytes20(msg.sender) & 0xff);
Visibility and Getters
solidity는 2가지의 함수를 호출할 수 있다. 하나는 internal이고 이것은 EVM call을 생성하지 않는다. 그리고 external이 있다. 다음에 4가지의 Visibility의 함수와 상태변수를 보인다.
function visibility : external, public, internal, private
state variable visibility : default internal, external is not possible
external function : 다른 contract에서 transaction을 통해 호출 될 수 있는 함수, external function은 internal상태에서도this.function() 형식으로 호출해야한다. 대규모 array of data를 받을 때 효과적이다.
public function : external, internal 모두 가능
public state variable : 자동으로 getter함수가 제공된다. getter함수는 external visibility를 갖는다.
# 당연하지만 internal에서 this를 붙이지 않으면 state variable로 처리되고 this를 붙이면 function으로 처리된다.
internal function and state variable : internal에서만 호출 가능하다. deriving contract에서는 호출 가능하다. this 는 생략할 수 있다.
private function and state variable : 파생 contract에서는 보이지 않고 해당 contract에서만 보인다.
visible의 의미는 구문의 확인 차원이고 blockchain외부에서 보이는 것은 맞다 다만 실행이 되지 않는다.
# external과 public이 비숫해서 차이를 알기 어렵다.
# 다시 정리하면
- internal은 해당 contract에서만
- private는 derivated contract까지만
- public은 어디에서나 가능
- external은 this를 이용하여 가능
Function Modifiers
# modifier function_name { require; _;} <= 파라미터가 없음
Constant State Variables
state variable은 constant로 선언될 수 있다. 이경우에, 컴파일 시에 확정된 표현을 통해 값이 할당 될 수 있다. 하지만 now, this, blocknumber, msg.value, function return값 등 확정되지 않은 값으로는 표현 할 수 없다.
Functions
View Functions
상태를 변경하지 않음을 약속하는 키워드인 view로 선언되어 질수 있다.
상태를 변경하지 않는 다는 것은
1. state variable을 변경하지 않는다
2. event함수를 호출하지 않는다
3. 다른 contract를 생성하지 않는다
4. selfdestruct를 실행하지 않는다.
5. Ether를 call을 통해 보내지 않는다.
6. view/pure 함수 이외의 함수를 호출하지 않는다.
7. low-level함수를 호출 하지 않는다.
8. opcode가 포함된 inline assembly를 실행하지 않는다.
# 아무리 view로 선언했어도 명시적인 type변경으로 상태변경이 발생할 수도 있음으로 다음과 같은 표기를 하여 컴파일러가 STATICCALL을 사용하도록 할 수 있다.
# pragma experimental "v0.5.0";
# 아직은 컴파일러는 view 를 통해 상태변경을 제약할 수 있는 방법이 없이 warning을 보일 뿐이다.
Pure Functions
상태를 변경하지 않을 뿐만 아니라 state variable에 접근하지도 않음을 약속하는 선언이다.
다음은 상태접근에 해당하는 내용이다.
1. state variable을 읽는 것
2. this.balance, address.balance를 읽는 것
3. block, tx, msg의 맴버를 접근하는 것
4. pure modifier가 붙지 않은 함수에 접근하는 것
5. 이러한 작용을 하는 opcode가 붙은 inline assembly에 접근하는 것
#pure또한 view와 마찬가지로 컴파일러에게 이러한 부분을 강제할 수 없음으로 exterimental을 사용해준다.
'solidity' 카테고리의 다른 글
geth loadScript 확인 할 점 (0) | 2018.03.20 |
---|---|
Fallback Function (0) | 2018.03.14 |
State variable Local variable (0) | 2018.03.14 |
Creating Contract via "new" keyword (0) | 2018.03.14 |
Units and Globally Available Variables (0) | 2018.02.28 |