본문 바로가기

블록체인/이더리움

트랜잭션 hash 를 가장 빨리 받는 방법

반응형

웹에서 지갑 어플리케이션을 통해 트랜잭션을 발생했다고 치자 (제발 그냥 그랬다고 치자)

트랜잭션이 정상적으로 종료되고 나발이고 내가 발생시킨 트랜잭션 hash 값을 최대한 빨리 화면에 뿌려주고 싶다.

어떡할래?

 

web3.eth.sendTransaction().on() 등의 async 함수를 await 할 경우, async 함수를 강제 종료시키는 방법은 없다. (자바스크립트 언어의 특성)

방법은 내가 호출하고자 하는 web3 async 함수를 Promise 객체 안에 담는 것이다.

 

addBlockChain: async(u, n, c, e) => {

    const web3 = new Web3(App.web3Provider);
    const signed = await web3.eth.accounts.signTransaction(options, account.privateKey);

    return new Promise(resolve => { // addBlockChain must return a Promise, so it can be "await"ed

        web3.eth.sendSignedTransaction(signed.rawTransaction)
            .on('transactionHash', function(hash_returned) {
                resolve(hash_returned); // now that you have hash_returned, you can return it by resolving the Promise with it
            })
            
            // or more simply (equivalent) :
            // .on('transactionHash', resolve)
    })
}

 

Promise 의 resolve 함수를 호출함으로서 Promise 내부에서 호출했던 async 함수는 강제로 종료되게 된다.

 

출처:https://stackoverflow.com/questions/63939803/how-to-get-a-value-in-async-function-as-soon-as-possible

반응형