web3.js 버전 1.0.0 변경사항

knil nissim
RayonProtocol
Published in
4 min readOct 18, 2018

이글은 현재 v0.2.x와 v1.0.0 베타로 제공되고 있는 web3.js의 주요변경 사항을 살펴보려고 합니다.

이글에 첨부된는 Gist code snippet들은 이 Repository에서 한번에 확인 할 수 있습니다.

truffle에서의 web3.js

현재 truffle 프레임워크 v4.1.14는 아직 web3.js v1.0.0(이하 v1)을 지원하지 않습니다. truffle 프레임워크와 web3.js v1을 동시에 사용하기위해 두가지 방법을 고려할 수 있습니다.

  • truffle v5.0.0 베타 사용
  • 기존 truffle에 web3.js v1을 추가로 사용

이 글에서는 DApp 전체를 web3.js v1으로 마이그레이션하지 않고, 후자의 방법으로 부분적으로 적용한다는 가정하에 아래와 같이 helper를 추가하여 사용하려고 합니다.

WebsocketProvider 사용

`instantiate.js` 2번 행에서 웹소켓 프로토콜의의 엔드포인트로 인스턴스화했습니다. 그 이유는 web3.js v1에서 HttpProvider는 이벤트 subscription을 지원하지 않아 WebsocketProvider를 사용해야하기 때문입니다.

개발환경에서 ganache-cli는 v6.1.0, ganache는 v1.1.0 이상 버전부터 웹소켓을 지원하며 infura는 `wss://{network}.infura.io/ws`의 형식으로 API를 사용할 수 있습니다.

MetaCoin

MetaCoin(이하 메타코인)은 truffle 프레임워크에서 unboxing할때 기본적으로 제공되는 컨트랙트입니다. 상호작용할 메타코인컨트랙트 메서드 인터페이스는 다음과 같습니다.

  • sendCoin(address, uint)
  • getBalance(address)

위 메서드를 사용하여 v0.2와 v1 사이의 몇가지 큰 차이점을 살펴보겠습니다.

잔액 반환 값

  • 컨트랙트 인스턴스에 메서드과 이벤트들은 각각의 네임스페이스에 포함되어 있습니다.
  • getBalance는 uint형 값을 반합니다. 이때 v0.2.x는 Bignumber 인스턴스로 반환되는 반면 v1에서부터는 string 타입으로 반환됩니다.

코인 전송 트랜잭션

  • v1에서는 v0.2.x와 달리 메서드 호출시 컨트랙트의 메서드의 인자만 전달해야합니다. 즉 마지막 객체를 트랜잭션 옵션으로 포함하여 전달하지 않습니다 (10번 행과 28번 행 차이). 트랜잭션 옵션은 체이닝 되는 send 메소드에 인자로 전달합니다.

코인 전송 트랜잭션 Revert

  • 트랜잭션 전송 시 반환값은 PromiEvent입니다. PromiEvent는 Promise에 EventEmitter를 결합하여 블록체인에서 각각의 단계(이벤트)별로 다른 동작을 수행 할 수 있게 합니다. 트랜잭션에서는 on, once 등의 메서드로 이벤트를 리스닝 할 수 있습니다.
    참고로 에러는 PromiEvent에서 error 이벤트로 핸들링한다고해서 catch되지않습니다. `.catch(callback)`를 사용해야합니다.

코인 전송 이벤트 구독

  • 이벤트 구독에서 필터를 만들고 watch하는 v0.2.x와 달리, v1에서 이벤트 구독은 는 EventEmitter를 생성하여 이벤트 리스닝을 합니다.

마치며

정리하자면 다음과 같습니다.

  • WebsocketProvider를 사용
  • 컨트랙트 인스턴스의 메서드, 이벤트는 각각의 네임스페이스에 포함
  • 컨트랙트의 숫자값은 web3에서 string 타입으로 반환
  • 컨트랙트 메서드 호출시 메서드 인자 메서드에 전달, 트랜잭션 옵션은 체이닝 되는 send 메소드에 인자로 전달
  • 트랜잭션은 PromiEvent로 이벤트별로 혹은 이행여부로 처리가능
  • 이벤트는 EventEmitter로 이벤트별로 처리가능

여기까지 향후 릴리즈될 web3.js v1의 주요변경 사항을 살펴봤습니다. v0.2.x와 v.1 두 메이져 버전의 API는 다른 부분이 매우 많습니다. 변경사항 모두를 열거하는것 보단 대표적인 유즈케이스에서 API 사용의 주요 변경사항을 드러내보려고 했습니다.

나누고 싶은 의견이나 피드백이 있으시면 댓글이나 이메일부탁드립니다. 감사하겠습니다.

--

--