관리 메뉴

HAMA 블로그

[이더리움 메모] 트랜잭션의 실전적 종류 구분. 본문

블록체인

[이더리움 메모] 트랜잭션의 실전적 종류 구분.

[하마] 이승현 (wowlsh93@gmail.com) 2018.06.05 17:15

이더리움에서는 각종 함수콜에 관련된 용어와 용도가 난무하여 헥깔림을 가중 시키고 있는데요. 일반적으로 트랜잭션은 쓰기를 말하고, 콜은 읽기를 말합니다. 하지만 이것은 너무 대략적으로 말한것이라 좀 더 구체적으로 구분해 볼 필요가 생겨서 본 글을 쓰게 되었습니다. (오류가 있을 수 있으며, 업데이트 될 수 있습니다) 

메모

Message (Internal tranaction)
 
:
  컨트랙트에서 컨트랙트로 호출 하는 것 or 컨트랙트에서 EOA 로 이더전송. 채굴 할 때 까지 대기하지 않으며 즉시 호출.  처음 발생되는 Transaction 호출에 의해 일어나는 부분이다. 따라서  message 에 소모되는 가스 비용은 처음 tranaction 에 포함된다. 최대 1024 Depth 까지 호출될 수 있다.

   컨트랙트 -> 컨트랙트에는 로우레벨적으로 CALL 과 DELEGATECALL (callee 쪽 코드만 가져와 사용. 저장장소,현재주소,잔액은 모두 호출하는 주소를 참조. msg.sender 와 msg.value 값이 변하지 않는다.) 이 있다.  
   컨트랙트에서 이더 전송 에는 SEND/TRANSFER/CALL 이 있다. 모두 OPCODE 로는 CALL 이다. (
 send is now deprecated.) 솔리디티의 call 함수가 value와 함께 호출될 때 call함수는 받은 모든 가스를 전달한다. 즉 send/transfer 는 2300가스 고정이고, call 을 이용하면 set(gaslimit) 할수 있다.

    * 중요 포인트는 call 을 직접적(로우레벨적) 으로 사용해서 컨트랙트를 호출하지 않는것을 권장한다. 그냥 함수이름으로 호출 ㄱㄱ 


Transaction:  EOA 에서 호출하는 것


“Delegatecall은 호출하는 컨트렉트의 맥락에서 타켓 주소의 코드가 실행되고 msg.sender와 msg.value의 값이 변경되지 않는다는 점을 제외하면 메시지 콜과 동일하다.
이는 컨트렉트가 실행될 때 다른 주소로부터 코드를 다이내믹하게 읽어들일수 있다는 것을 의미한다. 저장 장소, 현재 주소, 잔액은 여전히 호출하는 주소를 참조하고, 코드만이 호출된 주소로부터 읽어 들이게 된다.”


* OP 코드에 따라 아래와 같은 가스 소모가든다. 

Operation NameGas CostRemark
step1default amount per an execution cycle
stop0free
suicide0free
sha320 
sload20get from permanent storage
sstore100put into permanent storage
balance20 
create100contract creation
call20initiating a read only call
memory1every additional word when expanding memory
txdata5every byte of data or code for a transaction
transaction500base fee transaction
contract creation53000
changed in homestead from 21000





sendTransaction:  네트워크에 보내지며 채굴에 의해 확인 받아야 한다. 서명이 필요하며, 채굴 받될 때까지 결과를 얻을 수 없다.  가스를 소모하며 보통 상태를 변경하다. ( 새로운 컨트랙트 만들기, 컨트렉트 호출,  다른 EOA 로 이더보내기)

call:  자신의 노드에서만 실행된다. read-only로 실행되며 즉각적으로 결과를 알 수 있으며, 비용이 들지 않는다. 

* yellow paper 에 나오는 "메세지 콜" 이라는 용어는 혼동을 초래하므로 제외. 


아래 3가지 web3 호출 의 차이점

1.testInstance.testfunc({from:eth.accounts[0]}) 2.testInstance.testfunc.sendTransaction({from:eth.accounts[0]}) 3.testInstance.testfunc.call({from:eth.accounts[0]})

  1.  testfunc 가 constant 라벨이 붙었으면, #3번과 같고, 그렇지 않다면 #2와 같다. 
     * 
    solc 0.4.17 부터 제거 되었으며, view 나 pure 를 사용한다. 

  2.  위의 구분에서 sendTransaction 를 말한다. 

  3.  위의 구분에서 call 을 말한다. 

정리 



0 Comments
댓글쓰기 폼