Moonbase Alpha v2 : 새 계약 이벤트 및 Pub / Sub

(Alberto Viera) (2020 년 10 월 13 일)

PureStake에서 방금 발표 한 Moonbase Alpha v2 릴리스 를 통해 Moonbeam이 기본 목표에 더 가까워지는 데 도움이되는 새롭고 흥미로운 기능을 추가합니다. Polkadot 생태계에서 Ethereum의 프로젝트에 원활한 경험을 제공합니다. 추가되는 주요 기능 중 하나는 이더 리움 스마트 계약 이벤트 및 기타 블록 체인 정보를 구독 할 수있는 기능입니다.

계약 이벤트는 스마트 계약과 스마트 계약 간의 통신을 용이하게하기 때문에 이더 리움에서 dApp의 매우 중요한 부분입니다. 그들의 사용자 인터페이스. 이벤트는 데이터가있는 비동기 트리거로 간주 될 수 있습니다. 계약에서 이벤트를 생성하면 결과적으로 프런트 엔드 측에서 작업이 수행 될 수 있습니다.

이벤트 사용 사례

추적 할 수있는 이벤트의 간단한 예는 다음과 같습니다. 이전. 사용자가 dApp의 프런트 엔드를 사용하여 전송을 시작한다고 가정 해 보겠습니다. 여기서 트랜잭션 해시가 제출되면 획득됩니다. 그러나 사용자에게 지불금이 전송되었음을 보장하기 위해 dApp은 트랜잭션이 블록 체인에 커밋 될 때 이벤트 (계약에 의해 발생)를 수신 할 수 있습니다. 결과적으로 사용자에게 자신의 작업이 성공했음을 알리는 표시 메시지를 트리거 할 수 있습니다.

이벤트의 또 다른 강력한 사용 사례는 더 저렴한 저장 공간입니다. 평균적으로 로그 비용은 바이트 당 8 개 가스 인 반면 계약 저장 비용은 32 바이트 당 20,000 개 가스입니다. 따라서 이벤트는 전송 로그와 같은 필요한 정보를 저장하고 검색하는 도구 역할도 할 수 있습니다. 그러나 예를 들어 다른 스마트 계약에서 액세스 할 수 없기 때문에 모든 사용 사례의 저장소로 사용할 수는 없습니다.

Pub / Sub의 중요성

이 모든 맥락을 감안할 때 이제 pub / sub에 대해 이야기 할 준비가되었습니다.

Publish-subscribe 또는 간단히 pub / sub는 메시지 게시자 간의 미들웨어 역할을하는 비동기 메시징 서비스입니다. 구독하는 사람들. 일반적으로 게시자는 이러한 메시지를 클래스로 분류하고 누가 구독하는지 실제로 알지 못하는 상태에서 게시합니다. 마찬가지로 구독자는 관심있는 수업에 등록하고 게시자가 누구인지 모르고 해당 수업과 관련된 메시지 만받습니다.

출시와 함께 이제 Ethereum 스타일 이벤트와 호환되는 pub / sub 서비스 인 Moonbase Alpha v2 를 사용할 수 있습니다.

튜토리얼 : Moonbeam에서 Pub / Sub를 사용하는 방법

사진 이후 천 단어의 가치가 있습니다. Moonbeam에서 pub / sub가 작동하는 방식을 보여주는 몇 가지 예를 살펴 보겠습니다.

이 데모를 따르려면 다음이 필요합니다.

Moonbase에서 이벤트 로그 구독의 첫 부분을 따를 수 있습니다. Alpha v2

ERC-20 토큰 표준을 따르는 모든 계약은 토큰 이전과 관련된 이벤트, 즉 event Transfer(address indexed from, address indexed to, uint256 value)를 내 보냅니다. 이 예에서는 이러한 이벤트의 로그를 구독합니다. Web3 JS 라이브러리를 사용하려면 다음 코드가 필요합니다.

const Web3 = require("web3");
const web3 = new Web3("wss://wss.testnet.moonbeam.network");

web3.eth.subscribe("logs", {
address: "ContractAddress",
topics: ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}, (error, result) => {
if (error)
console.error(error);
})
.on("connected", function (subscriptionId) {
console.log(subscriptionId);
})
.on("data", function (log) {
console.log(log);
});

Moonbase Alpha의 WebSocket 엔드 포인트에 연결하고 있습니다. web3.eth.subscribe("logs", options [, callback]) 메소드를 사용하여 주어진 옵션으로 필터링 된 로그를 구독합니다. 우리의 경우 옵션은 이벤트가 발생하는 계약의 주소와 이벤트를 설명하는 데 사용되는 주제입니다. 주제에 대한 자세한 정보는 (이 매체 게시물)에서 찾을 수 있습니다. 주제가 포함되지 않은 경우 구독합니다. 계약에 의해 생성 된 모든 이벤트에. 그러나 Transfer 이벤트 만 필터링하려면 다음과 같이 계산 된 이벤트의 서명을 포함해야합니다.

EventSignature = keccak256(Transfer(address,address,uint256))

이전 계산의 결과는 이전 코드 스 니펫에 표시된 것과 같습니다. 나중에 주제별 필터링으로 돌아가서 나머지 코드는 콜백 함수를 처리합니다.이 코드를 실행하면 구독 ID를 얻고 터미널은 해당 구독을 통해 이벤트를 기다립니다.

다음으로 ERC20 토큰 전송이 다음 매개 변수와 함께 전송됩니다.

  • 보낸 사람 주소 : 0x6Be02d1d3665660d22FF9624b7BE0551ee1Ac91b
  • 받는 사람 : 0xfcB0B397BB28046C01be6A3d66c7Eda99Fb0f344
  • 값 (토큰) : 10000000000000000000 — 10과 18 개의 0

트랜잭션을 전송하면 트랜잭션에서 발생한 이벤트 로그가 터미널에 나타납니다.

많은 정보가 로그에 제공되지만 스스로에게 물어볼 수 있습니다. 생성 된 이벤트의 정보는 어디에 있습니까? 그리고 그 답은 바로 로그입니다!

우리의 대상 이벤트는 주제처럼 취급되는 “발신자”및 “수신자”주소 (순서대로)의 두 가지 색인 정보를 전송합니다. 이벤트에서 공유하는 다른 데이터는 인덱싱되지 않은 토큰의 수입니다. 따라서 opcode LOG3에 해당하는 총 3 개의 주제 (최대 4 개)가 있습니다.

결과적으로 “보낸 사람”및 “받는 사람”주소가 로그에서 반환 된 주제 내에 포함되어 있음을 알 수 있습니다. 이더 리움 주소는 40 개의 16 진수 문자입니다 (16 진수 1자는 4 비트이므로 160 비트 또는 H160 형식). 따라서 64 개의 16 진수 문자 인 H256의 간격을 채우기 위해 추가로 24 개의 0이 필요합니다.

토큰 수는 어떻습니까? 색인화되지 않은 데이터는 로그의 “데이터”필드에 반환되지만 바이트 32 / hex로 인코딩됩니다. 이를 디코딩하기 위해 예를 들어이 온라인 도구 를 사용하고 “데이터”가 실제로 10 (+ 18 개의 0)인지 확인할 수 있습니다.

이벤트가 색인화되지 않은 여러 값을 반환하는 경우 이벤트에서 생성하는 것과 동일한 순서로 차례로 추가됩니다. 따라서 각 값은 데이터를 개별 32 바이트 (또는 64 개의 16 진 문자 길이) 조각으로 분해하여 얻습니다.

이 예는 특정 계약의 이벤트 로그에만 구독하는 방법을 보여줍니다. 그러나 Web3 JS 라이브러리는 다음 섹션에서 다룰 다른 구독 유형을 제공합니다.

수신 대기중인 트랜잭션 구독

대기중인 트랜잭션을 구독하려면 다음을 사용할 수 있습니다. web3.eth.subscribe("pendingTransactions", [, callback]) 메소드, 동일한 콜백 함수를 구현하여 응답을 확인합니다. 이는 이전 예보다 훨씬 간단하며 보류중인 트랜잭션의 트랜잭션 해시를 반환합니다.

이 트랜잭션 해시가 MetaMask (또는 Remix)에 표시된 것과 동일한 지 확인할 수 있습니다.

수신 블록 헤더 구독

Web3 JS 라이브러리에서 사용할 수있는 또 다른 유형은 새 블록 헤더를 구독하는 것입니다. 이를 위해 web3.eth.subscribe("newBlockHeaders" [, callback]) 메서드를 사용하여 동일한 콜백 함수를 구현하여 응답을 확인합니다. 이 구독은 수신 블록 헤더를 제공하며 블록 체인의 변경 사항을 추적하는 데 사용할 수 있습니다.

이미지에는 하나의 블록 헤더 만 표시됩니다. 이러한 메시지는 생성 된 모든 블록에 대해 표시되므로 터미널을 매우 빠르게 채울 수 있습니다.

노드가 네트워크와 동기화되어 있는지 확인

pub / sub를 사용하는 것도 가능합니다. 가입 한 특정 노드가 현재 네트워크와 동기화되어 있는지 확인합니다. 이를 위해 web3.eth.subscribe("syncing" [, callback]) 메서드를 활용하여 동일한 콜백 함수를 구현하여 응답을 확인할 수 있습니다. 이 구독은 노드가 네트워크와 동기화 될 때 객체를 반환합니다.

현재 제한 사항

Frontier의 게시 / 구독 구현은 아직 개발 중입니다. 이 첫 번째 버전에서는 dApp 개발자 (또는 일반적으로 사용자)가 특정 이벤트 유형을 구독 할 수 있지만 여전히 몇 가지 제한 사항이 있습니다. 이전 예에서 일부 필드가 적절한 정보를 표시하지 않는 것을 발견했을 수 있습니다. 이는 특정 속성이 아직 Frontier에서 지원되지 않기 때문입니다.

또 다른 제한은 로그와 관련된 것입니다. 행사. 이더 리움에서는 와일드 카드를 사용하고 여러 입력 주소를 전달할 수 있습니다 (예 : 특정 로그 필터링). “topic\_1″필드에 두 개의 특정 주소가있는 계약의 모든 이벤트를 구독한다고 가정 해 보겠습니다 (topic\_0는 이벤트 서명에 예약되어 있음을 기억하십시오).그런 다음 다음 주제를 입력으로 전달할 수 있습니다.

topics: [null, [address1, address2]]

여기에서 와일드 카드 null를 사용하여 이벤트 서명의 경우 구독 한 계약에서 발생하는 모든 이벤트를 수신합니다. 그러나이 구성에서는 두 번째 입력 필드 인 topic\_1를 사용하여 앞에서 언급 한대로 주소별로 필터를 정의 할 수도 있습니다.

현재 프론티어 구현은 이러한 기능을 지원하지 않습니다. 대안으로 계약의 모든 이벤트와 다른 주소에 대해 여러 구독을 만들 수 있지만 이렇게하면 수행 할 작업 수가 늘어납니다. 그러나 이것은 Moonbase TestNet의 향후 버전에서 지원 될 예정입니다.

문의하기

Moonbase Alpha v2, pub / sub 또는 기타에 대한 피드백이있는 경우 Moonbeam 관련 주제는 웹 사이트를 방문 하거나 공식 개발 Discord 서버 a를 통해 문의하세요. >.

원래 게시 위치 : https://www.purestake.com 2020 년 10 월 13 일