Event 기능 사용 가능한가요?

Smart Contract 의 트랜잭션이 일어나는 경우, 이를 모니터링하고 싶어서 event 기능을 찾아봤더니,
Caver-js API 중에 myContract.events.allEvents([options] [, callback]) 가 있습니다.

설명만으로는 코드를 짜기가 어렵네요. 간단하게 작성해보니…

Error: The current provider doesn’t support subscriptions: HttpProvider

이런 오류가 납니다.

Ethereum 이나 Truffle 에 대한 지식이 아직은 많이 부족해서요.

자료를 찾아보니, EN에 Websocket 방식으로 접속을 해야 하는 것 같습니다.

현재 이 기능을 이용할 수 있는지요?
있다면 간단한 예제 소스나 혹은 관련 자료를 좀 알려주셨으면합니다.

네네, websocket provider를 사용하시면 됩니다. 간단한 예제는 아래에 첨부하겠습니다 :slight_smile:

// Websocket 사용하여 연결    
const caver = new Caver('ws://3.34.133.142:8552/') // Websocket 사용하여 연결
// 사용할 account add
caver.wallet.add(sender) 

// Contract 인스턴스 생성 (두 번째 파라미터는 contract 주소)
const contract = new caver.klay.Contract(abi, '0xb6Bc061eD05e9D3d4E62C6D3f3649455c860db59') 

contract.events
    .allEvents()
    .on('data', event => {
        console.log(event)
    })
    .on('error', console.error)

// test
await contract.methods.transfer(feePayer.address, 10).send({ from: sender.address, gas: 1000000 })
1 Like

답변 감사합니다.
현재 저희는 HTTP의 경우, https://api.baobab.klaytn.net:8651, https://api.cypress.klaytn.net:8651 주소를 이용하고 있는데요.
WebSocket 주소 IP 또는 도메인도 동일한 것을 사용하면 되나요? 아니면 별도의 IP 주소와 Port 번호가 따로 존재하나요?

그리고 위 예제에서는 ws://3.34.133.142:8552 방식인데 혹시, wss://3.34.133.142:8552 형태로 가는 것은 아닌가요?

안녕하세요, WS의 경우에는 아래 endpoint를 사용하시면 됩니다.

wss://api.baobab.klaytn.net:8652
wss://api.cypress.klaytn.net:8652

다만, 저희가 제공하는 EN노드는 SLA를 보장하지 않고, 서비스가 다운될 수 있다는 점 참고 부탁드립니다.

추가 질문있습니다.
Websocket URL을 매개변수로 생성한 Caver object 를 이용한 methods 실행에 한하여 event를 받을 수 만 있는 것인가요?

예를 들어 실서버 앱에서는 HTTP URL로 생성한 Caver object로 전송을 실행하고,
Admin 앱에서는 WebSocket 으로 생성한 Caver object 로 이벤트를 바라보고 있다면, 실서버 앱에서의 트랜잭션 이벤트를 Admin 앱에서 받아 볼 수는 없나요?

아닙니다. 해당 이벤트를 발생시킨 Caver의 Provider와는 무관하게 발생한 이벤트를 받을 수 있는 것입니다.
아래에 예제 코드를 작성했는데, 이것을 말하신 게 맞을까요?

// Admin side
const caver = new Caver('ws://3.34.191.126:8552/')
const contract = new caver.klay.Contract(abi, '0x{contract address}')
contract.events
    .allEvents()
    .on('data', evt => {
        console.log(evt)
    })
    .on('error', console.error)

// App.
const caver2 = new Caver('http://3.34.191.126:8551/')
caver2.klay.accounts.wallet.add('0x{private key}')

const contract2 = new caver2.klay.Contract(abi, '0x{contract address}')
await contract2.methods
    .transfer('0xf5a9079f311f9ec55170af351627aff0c5d2e287', 10)
    .send({ from: '0x17e7531b40ad5d7b5fa7b4ec78df64ce1cb36d24', gas: 1000000 })
1 Like