곧 Bitcoin의 Toproot
소프트포크가 진행되는데, 그 전에 프로덕트에서 대응해야할 사항이 있어서 조금 조사를 해보았다.
몇몇 Software wallet은 대응하였지만, signet
이나 regtest
와 같은 testnet의 경우에만 생성해놓았고, mainnet용도로 생성은 아직 막아놓은 상태였다.
bech32m 알고리즘을 적용(Pay to TapRoot) 현황은 아래 페이지에서 확인할 수 있다.
Testnet은 저걸로 어떻게든 해결했는데, mainnet이 문제였다.
testnet이랑 mainnet의 address format은 서로 다른데, 이 mainnet에 taproot이 적용되기 전에 mainnet의 address를 구해서 이것을 Prod환경에서 테스트에서 써야했기 때문.
mainnet의 taproot 대응 address를 생성하는 Software wallet이 없어서 구할 수가 없었다.
뭔가 Descriptors를 설정하면 된다고 하는 것 같긴 한데, 내 수준에서는 너무 어려운 것 같고...
마침 일본에 어느 개발자가, merge대기 중인, Bitcoin core에서 address를 Taproot대응 format으로 기본생성하게끔 수정한 Pull request를 로컬에 내려받아 생성해봤다는 글을 봐서 시도할 수 있었다.
일단 로컬에 Bitcoin core의 소스를 clone한다.
git clone https://github.com/bitcoin/bitcoin.git
이 PR을 손쉽게 받기 위해 Github-CLI를 사용했다.
gh pr checkout 22364
자동으로 알아서해주더라.
관련 의존성 라이브러리를 로컬에 받아주었다.
brew install automake libtool boost miniupnpc libnatpmp pkg-config berkeley-db4 libevent
조금 시간이 걸렸다..
cd bitcoin
./autogen.sh
현재 폴더를 확인하고, bitcoin
폴더로 이동한 후 실행한다.
./configure --without-gui
make
파일들을 컴파일한다.
컴파일 된다면, 빌드를 진행한다.
sudo make install
빌드가 성공한다면, bitcoind
와 bitcoin-cli
를 확인한다.
bitcoind -version
bitcoin-cli -version
bitcoind
는 나의 로컬에서 블록체인 네트워크를 동기화시키기 위해 계속 켜놓을 필요가 있다.
참고로, 아래에서 서술하는 모든 커맨드 들에, 커맨드 후 옵션으로 -testnet
, -signet
을 넣으면 해당 테스트넷으로 동작한다. 기본은 mainnet
이다.
일단 bitcoind
를 켜놓고 작업해야한다.
bitcoind -daemon
bitcoin-cli -named createwallet wallet_name=test descriptors=true
-named
에 createwallet
으로 wallet생성을 진행한다. 이 때, descriptors를 true로 옵션을 넣어주어야한다.
이 것을 true로 함으로 인해, PR에서의, 기본적으로 Taproot 대응 포맷이 address를 생성할 수 있게 된다.
wallet생성이 성공한다면 아래와 같이 출력될 것 이다.
{
"name": "test",
"warning": "Wallet is an experimental descriptor wallet"
}
이어서 Address를 생성한다.
bitcoin-cli -rpcwallet="test" -named getnewaddress address_type=bech32m
Address가 생성될 wallet의 이름을 지정해주고, address의 타입을 지정해준다. Taproot대응 address는 bech32m
이라는 방법으로 생성된다한다.
(자세히는 잘 모르겠다..암호화 기능으로 알고있는중)
생성하면 어드레스가 생성될 것이다.
mainnet의 경우, bc1p
로 시작하는 주소일 것이다. 만일 bc1q
로 시작되는 주소라면, 기존의 Segwit주소이며 이것은 Taproot에 대응하는 주소가 아니다.
Ref