블로그 1뉴스 개발자 엔터프라이즈 블록 체인 설명 이벤트 및 컨퍼런스 보도 자료뉴스 레터

뉴스 레터 구독.

이메일 주소

우리는 귀하의 개인 정보를 존중합니다

홈 블로그 블록 체인 개발

이더 리움 스마트 계약의 이벤트 및 로그 가이드

샘플 코드가 포함 된 이더 리움 블록 체인의 이벤트 및 로그 사용 사례에 대한 기술 소개 작성자 : Joseph Chow 6 월 6, 2016Posted on June 6, 2016

ConsenSys Signal 이더 리움 스마트 컨트랙트 히어로의 이벤트 및 로그 안내

이벤트와 로그는 스마트 계약과 사용자 인터페이스 간의 통신을 용이하게하기 때문에 Ethereum에서 중요합니다. 전통적인 웹 개발에서 서버 응답은 프런트 엔드에 대한 콜백으로 제공됩니다. 이더 리움에서 거래가 채굴되면 스마트 계약은 이벤트를 생성하고 프런트 엔드가 처리 할 수있는 블록 체인에 로그를 기록 할 수 있습니다. 이벤트 및 로그를 처리하는 방법에는 여러 가지가 있습니다. 이 기술 소개에서는 이벤트와 관련된 혼동의 원인과 이벤트 작업을위한 샘플 코드를 설명합니다..

이벤트는 다른 방식으로 사용될 수 있기 때문에 혼란 스러울 수 있습니다. 한 이벤트가 다른 이벤트처럼 보이지 않을 수 있습니다. 이벤트 및 로그에 대한 세 가지 주요 사용 사례가 있습니다.

  1. 사용자 인터페이스에 대한 스마트 계약 반환 값
  2. 데이터가있는 비동기 트리거
  3. 더 저렴한 형태의 스토리지

이벤트와 로그 간의 용어는 또 다른 혼동의 원인이며 세 번째 사용 사례에서 설명합니다..

1) 사용자 인터페이스에 대한 스마트 계약 반환 값

이벤트의 가장 간단한 사용은 계약의 반환 값을 앱의 프런트 엔드로 전달하는 것입니다. 설명하기 위해 다음과 같은 문제가 있습니다.

contract ExampleContract {// 일부 상태 변수 … function foo (int256 _value) returns (int256) {// 상태 조작 … return _value; }} 코드 언어 : JavaScript (자바 스크립트)

exampleContract가 web3.js를 사용하는 프런트 엔드 인 ExampleContract의 인스턴스라고 가정하면 계약 실행을 시뮬레이션하여 반환 값을 얻을 수 있습니다.

var returnValue = exampleContract.foo.call (2); console.log (returnValue) // 2 코드 언어 : JavaScript (자바 스크립트)

그러나 web3.js가 계약 호출을 트랜잭션으로 제출하면 반환 값 [1]을 얻을 수 없습니다.

var returnValue = exampleContract.foo.sendTransaction (2, {from : web3.eth.coinbase}); console.log (returnValue) // 트랜잭션 해시 코드 언어 : JavaScript (javascript)

sendTransaction 메서드의 반환 값은 항상 생성 된 트랜잭션의 해시입니다. 트랜잭션이 즉시 채굴되어 블록 체인에 포함되지 않기 때문에 트랜잭션은 프런트 엔드에 계약 값을 반환하지 않습니다..

권장 솔루션은 이벤트를 사용하는 것이며 이는 이벤트의 의도 된 목적 중 하나입니다..

계약 ExampleContract {이벤트 ReturnValue (인덱싱 된 주소 _from, int256 _value); function foo (int256 _value) returns (int256) {ReturnValue (msg.sender, _value); 반환 _value; }} 그런 다음 프런트 엔드는 반환 값을 얻을 수 있습니다. var exampleEvent = exampleContract.ReturnValue ({_ from : web3.eth.coinbase}); exampleEvent.watch (function (err, result) {if (err) {console.log (err) return;} console.log (result.args._value) // result.args._from이 web3.eth.coinbase인지 확인 그런 다음 // UI에 result.args._value를 표시하고 // exampleEvent.stopWatching ()})을 호출합니다. exampleContract.foo.sendTransaction (2, {from : web3.eth.coinbase}) 코드 언어 : JavaScript (javascript)

foo를 호출하는 트랜잭션이 마이닝되면 시계 내부의 콜백이 트리거됩니다. 이를 통해 프런트 엔드가 foo에서 반환 값을 얻을 수 있습니다..

2) 데이터가있는 비동기 트리거

반환 값은 이벤트에 대한 최소 사용 사례이며 일반적으로 이벤트는 데이터가있는 비동기 트리거로 간주 될 수 있습니다. 컨트랙트가 프런트 엔드를 트리거하려고하면 컨트랙트가 이벤트를 생성합니다. 프런트 엔드는 이벤트를 감시하므로 조치를 취하고 메시지를 표시하는 등의 작업을 수행 할 수 있습니다. 이에 대한 예는 다음 섹션에서 제공됩니다 (사용자가 입금하면 UI를 업데이트 할 수 있음).

3) 저렴한 형태의 스토리지

세 번째 사용 사례는 지금까지 살펴본 사례와 상당히 다르며 이벤트를 훨씬 더 저렴한 형태의 스토리지로 사용하고 있습니다. Ethereum 가상 머신 (EVM) 및 이더 리움 옐로우 페이퍼, 이벤트를 로그라고합니다 (LOG opcode가 있음). 스토리지에 대해 말할 때 데이터가 이벤트에 저장되는 것과 달리 데이터가 로그에 저장 될 수 있다고 말하는 것이 기술적으로 더 정확합니다. 그러나 프로토콜보다 높은 수준으로 이동하면 컨트랙트가 프런트 엔드가 반응 할 수있는 이벤트를 내보내거나 트리거한다고 말하는 것이 더 정확합니다. 이벤트가 발생할 때마다 해당 로그가 블록 체인에 기록됩니다. 이벤트와 로그 사이의 용어는 컨텍스트가 더 정확한 용어를 나타 내기 때문에 혼동의 또 다른 원인입니다..

통나무는 계약 저장소보다 가스 비용이 훨씬 적게 드는 저장소 형태로 설계되었습니다. 로그는 기본적으로 [2] 바이트 당 8 개의 가스 비용이 드는 반면 계약 저장은 32 바이트 당 20,000 가스의 비용이 듭니다. 통나무는 엄청난 가스 절약을 제공하지만 어떤 계약에서도 통나무에 접근 할 수 없습니다. [3].

그럼에도 불구하고 프런트 엔드에 대한 트리거 대신 로그를 저렴한 저장소로 사용하는 사용 사례가 있습니다. 로그에 적합한 예는 프런트 엔드에서 렌더링 할 수있는 기록 데이터를 저장하는 것입니다..

암호 화폐 거래소는 거래소에서 수행 한 모든 예금을 사용자에게 보여줄 수 있습니다. 이러한 예금 세부 정보를 계약에 저장하는 대신 로그로 저장하는 것이 훨씬 저렴합니다. 이는 거래소가 계약 저장소에 저장하는 사용자 잔액 상태를 필요로하지만 과거 예금에 대한 세부 정보를 알 필요가 없기 때문에 가능합니다..

계약 CryptoExchange {event Deposit (uint256 indexed _market, address indexed _sender, uint256 _amount, uint256 _time); function deposit (uint256 _amount, uint256 _market) returns (int256) {// 입금 수행, 사용자 잔액 업데이트 등 Deposit (_market, msg.sender, _amount, now); } 코드 언어 : JavaScript (자바 스크립트)

사용자가 입금 할 때 UI를 업데이트한다고 가정합니다. 다음은 데이터 (_market, msg.sender, _amount, now)와 함께 이벤트 (예금)를 비동기 트리거로 사용하는 예입니다. cryptoExContract가 CryptoExchange의 인스턴스라고 가정합니다.

var depositEvent = cryptoExContract.Deposit ({_ sender : userAddress}); depositEvent.watch (function (err, result) {if (err) {console.log (err) return;} // result.args의 세부 사항을 UI에 추가}) 코드 언어 : JavaScript (javascript)

사용자에 대한 모든 이벤트를 가져 오는 효율성을 향상시키는 것이 이벤트에 대한 _sender 매개 변수가 인덱싱되는 이유입니다 : event Deposit (uint256 indexed _market, address indexed _sender, uint256 _amount, uint256 _time).

기본적으로 이벤트 수신은 이벤트가 인스턴스화되는 시점에서만 시작됩니다. UI가 처음로드 될 때 추가 할 예금이 없습니다. 따라서 블록 0 이후의 이벤트를 검색하고 싶습니다. 이벤트에 fromBlock 매개 변수를 추가하여 수행합니다..

var depositEventAll = cryptoExContract.Deposit ({_ sender : userAddress}, {fromBlock : 0, toBlock : ‘latest’}); depositEventAll.watch (function (err, result) {if (err) {console.log (err) return;} // result.args의 세부 사항을 UI에 추가}) 코드 언어 : JavaScript (javascript)

UI가 렌더링되면 depositEventAll.stopWatching ()을 호출해야합니다..

Aside — 색인화 된 매개 변수

최대 3 개의 매개 변수를 색인화 할 수 있습니다. 예를 들어, 제안 된 토큰 표준에는 event Transfer (address indexed _from, address indexed _to, uint256 _value)가 있습니다. 즉, 프런트 엔드는 다음과 같은 토큰 전송을 효율적으로 감시 할 수 있습니다.

  • 주소 tokenContract.Transfer ({_ from : senderAddress})에서 전송
  • 또는 주소 tokenContract.Transfer ({_ to : receiverAddress})에서 수신
  • 또는 특정 주소로 주소로 전송 tokenContract.Transfer ({_ from : senderAddress, _to : receiverAddress})

결론

이벤트에 대한 세 가지 사용 사례가 제시되었습니다. 먼저 이벤트를 사용하여 sendTransaction ()으로 호출 된 계약 함수에서 반환 값을 가져옵니다. 둘째, 이벤트를 데이터와 함께 비동기 트리거로 사용하여 UI와 같은 관찰자에게 알릴 수 있습니다. 셋째, 이벤트를 사용하여 더 저렴한 형태의 스토리지로 블록 체인에 로그를 작성합니다. 이 소개는 아피스 이벤트 작업을 위해. 있습니다 다른 접근법 이벤트, 로그 및 영수증 작업에 대한 자세한 내용은 향후 기사에서 다룰 수 있습니다..

이 기사에 대한 피드백을 주신 Aaron Davis, Vincent Gariepy 및 Joseph Lubin에게 감사드립니다..

참고 문헌

[1] web3.js는 트랜잭션이 블록 체인에 포함되는 것을 감시 한 다음 EVM의 인스턴스에서 트랜잭션을 재생하여 반환 값을 얻을 수 있지만 이것은 web3.js에 추가 할 상당한 양의 논리입니다.

[2] LOG 작업의 경우 가스 비용이 375이고 주제 당 가스 비용이 375이지만 많은 바이트가 저장되는 경우 이러한 비용은 총 스토리지 비용의 중요하지 않은 부분을 나타냅니다..

[3] 로그에 대한 Merkle 증명이 가능하므로 외부 주체가 그러한 증명과 함께 계약을 제공하면 계약은 로그가 실제로 블록 체인 내부에 존재하는지 확인할 수 있습니다..

받은 편지함으로 직접 개발자 가이드를 원함?

ConsenSys의 개발자 뉴스 레터 구독

최신 이더 리움 뉴스, 엔터프라이즈 솔루션, 개발자 리소스 등을 보려면 뉴스 레터를 구독하십시오.성공적인 블록 체인 제품을 구축하는 방법웨비나

성공적인 블록 체인 제품을 구축하는 방법

이더 리움 노드를 설정하고 실행하는 방법웨비나

이더 리움 노드를 설정하고 실행하는 방법

나만의 Ethereum API를 구축하는 방법웨비나

나만의 Ethereum API를 구축하는 방법

소셜 토큰을 만드는 방법웨비나

소셜 토큰을 만드는 방법

스마트 계약 개발에서 보안 도구 사용웨비나

스마트 계약 개발에서 보안 도구 사용

금융 디지털 자산 및 DeFi의 미래웨비나

금융의 미래 : 디지털 자산 및 DeFi

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me