Antelope Leap 4.0.0-rc2 릴리스 노트 요약

Junhan Kim
NodeONE
Published in
16 min readMar 24, 2023

Release Leap v4.0.0-rc2 Release Notes · AntelopeIO/leap (github.com)

ENF 에서 Leap 4.0.0-rc2 버전을 공개하였습니다. 메이저 버전 업그레이드인 만큼 많은 기능들이 추가/변경되었습니다. 특히 매주 진행하는 노드 운영자 라운드 테이블에서 논의된 내용들이 많이 반영되었습니다.

릴리스 노트에 기록된 내용을 아래와 같이 요약하여 공유드립니다. 오역이나 오타가 있다면 노드원 텔레그램 채널에 제보 부탁드립니다. 확인되는 대로 조치하도록 하겠습니다.

** Leap 4.0.0-rc1 버전에는 이슈가 있어 태깅만 되었고 rc2 가 Leap v4.0.0 의 실질적인 첫 공개 릴리스 버전이 되었습니다.

새로운 기능

읽기 전용(Read-Only) 트랜잭션

읽기 전용 트랜잭션을 보내기 위한 RPC 엔드포인트가 추가되었습니다. 읽기전용 트랜잭션은 온체인 데이터베이스의 상태를 변경시키지 않으며, 블록체인(chainbase 데이터베이스) 에도 추가되지 않습니다.

트랜잭션 형식은 일반 트랜잭션과 같지만 사용자 인증은 하지 않는 점이 다릅니다.

인라인 액션 포함, 읽기 전용 트랜잭션의 액션은 상태를 수정하지 않으며, 딥마인드 로깅도 수행되지 않도록 하는 메커니즘이 포함되어 있습니다.

RPC URL 은 다음과 같습니다.

<URL>/v1/chain/send_readonly_transaction

Cleos 에서 읽기전용 트랜잭션을 보낼 때는 다음과 같이 실행합니다.

cleos push transaction --read <transaction>
cleos push action --read <action>

dry-run(compute_transaction) 과 읽기전용 트랜잭션 같은 일시적 트랜잭션(transient transactions)을 처리하기 위하여 다음과 같이 새로운 producer_plugin 카테고리가 추가되었습니다.

transient_trx_success_tracing 
transient_trx_failure_tracing

기존 transaction_success_tracing 과 transaction_failure_tracing 은 일시적 트랜잭션 로깅을 지원하지 않습니다.

max_action_return_value_size 는 읽기 전용 트랜잭션에 적용되지 않습니다.

스케줄에 근접한 BP(Schedule Proximal BP) 노드와의 자동 피어링

BP 일정에 따라 연결을 자동으로 관리하는 설정 옵션이 추가되었습니다. 어떤 BP 노드에서, 이전 BP의 마지막 블록을 수신하고, 자신이 생성한 마지막 블록을 다음 BP로 보낼 때, 노드의 순서와 피어링이 노드의 지연 시간에 영향을 미칩니다.

BP 노드는 가능한 빨리 이전 BP 가 생산한 마지막 블록을 수신하고, 가능한 한 빨리 자신이 생산한 마지막 블록을 다음 BP 에게 보내야 합니다. 그리고 블록이 늦게 생산되는 상황을 방지해야 합니다.

이러한 목표를 달성하기 위해 v4.0.0에서 다음과 같이 변경되었습니다

BP 계정 이름 및 연결 세부 정보의 연관성

  • --p2p-auto-bp-peer: 노드가 BP 계정 이름을 p2p 연결 세부 정보와 연관시킬 수 있도록 nodeos 옵션에 추가되었습니다. 이 설정을 사용하는 BP 노드가 보류 중(pending)인 스케줄 변경을 감지하면 스케줄 근접에 도달한 BP와 자동으로 피어링을 시도하고 더 이상 스케줄 근접에 있지 않은 자동 피어 BP와의 연결을 끊습니다. 이러한 자동 피어 연결은 --max-clients 옵션에서 설정된 제한의 영향을 받지 않습니다.

net_api 의 BP peer 플래그

  • v1/net/connections API 엔드포인트 응답의 모든 연결 개체(connection object)에 is_bp_peer 플래그가 추가되었습니다.

Snapshot Scheduling API

Leap v4.0.0에 추가된 Snapshot Scheduling API를 사용하면 스냅샷 요청을 미리 예약하고 관리할 수 있으므로 안정성이 향상되고 스냅샷 생성 프로세스에서 오류가 발생할 가능성이 줄어듭니다. 또한 사용자가 블록의 시작점과 끝점 및 블록 간격과 같은 매개 변수를 설정할 수 있으므로 보다 유연하게 스냅샷을 생성하고 관리 할수 있습니다.

다음과 같이 여러 기능을 제공하는 엔드포인트가 있습니다.

/producer/schedule_snapshot: 스냅샷을 작성하는 작업 추가
* Parameters: start_block, end_block, block_spacing, snapshot_description

/producer/get_snapshot_requests: 모든 스냅샷 요청 일정 조회

/producer/unschedule_snapshot: 기존의 스냅샷 작성 일정을 제거
* Parameters: snapshot_request_id

상세한 내용은 Snapshot Scheduling API Design Specs 을 참조 바랍니다.

Prometheus Exporter 플러그인

모니터링 솔루션인 Prometheus 로 데이터를 노출하기 위한 Nodeos 플러그인 입니다. 일단 지표 측정 도입 단계에는 Prometheus 관점에서 보았을 때 지표 측정 기능의 유용성을 평가해 보려 합니다. 또한 초기 단계에는 측정시 계정별 또는 컨트랙트별 지표가 포함되지 않으며, 지표 데이터를 만료시키는 기능도 포함되지 않습니다. 동적으로 지표를 지원하기 위해 각 플러그인의 지표 개체에는 지표 집합이 마지막으로 변경된 시간을 나타내는 표시기가 포함되어 있습니다.

도입 초기 단계에는 다음과 같은 지표를 수집할 것입니다.

Net Plugin
gauge - clients 수
gauge - peers 수
gauge - 드롭된 블록 수

Producer Plugin (Producer plugin 지표는 각 블록이 시작될 때 수집됨)
gauge - 적용되지 않은 트랜잭션 대기열 크기(트랜잭션 수)
counter - 모든 블랙리스트 트랜잭션
counter - 생산된 블록
counter - 생산된 트랜잭션
gauge - 마지막 비가역성(irreversible) 블록
gauge - 현재 블록 번호
gauge - 계정의 주관적 청구(subjective billing) 수
gauge - 블록의 주관적 청구(subjective billing) 수
gauge - 예정된 트랜잭션(scheduled transactions)

더 상세한 내용은 Prometheus Plugin Architecture 를 참조하시기 바랍니다.

로그 분할(Log Splitting)

Leap v4.0.0 에는 노드 운영자가 블록 및 상태에 대한 중요 로그를 관리할 때, 이를 보다 효과적으로 제어할 수 있도록 ‘블록 로그 분할’과 ‘상태 기록 로그 분할’ 두 가지 기능이 포함되어 있습니다. 이 기능들의 장점은 사용자가 보존할 분할 로그 파일 수를 지정하고 오래된 로그를 삭제하거나 다른 디렉터리로 이동하는 식으로 로그 로테이션을 자동화할 수 있다는 것입니다.

블록 로그 분할

블록 로그 분할을 쉽게 사용할 수 있도록 chain_plugin 에 다음과 같은 몇 가지 새로운 옵션을 추가했습니다.

  • blocks-log-stride : 헤드 블록 번호가 스트라이드(stride)의 배수일 때 블록 로그 파일을 분할할 수 있습니다. 스트라이드에 도달하면 현재 블록 로그 및 인덱스의 이름이 ‘blocks — .log/index’로 변경되고 최신 블록으로 새 현재 블록 로그 및 인덱스가 생성됩니다. 이 형식을 따르는 모든 파일은 확장 블록 로그를 구성하는 데 사용됩니다.
  • max-retained-block-files: 해당 파일의 블록을 쿼리할 수 있도록 유지할 블록 파일의 최대 수를 지정할 수 있습니다. 이 값에 도달하면 가장 오래된 블록 파일이 보관 디렉토리로 이동하거나 보관 디렉토리가 비어 있으면 삭제됩니다. 저장된 블록 로그 파일은 사용자가 임의로 조작해서는 안 됩니다.

또한 블록 로그 디렉토리의 위치를 구성할 수 있는 다음 두 가지 새로운 옵션이 추가되었습니다.

  • blocks-archive-dir: 블록 보관 디렉토리의 위치(절대 경로 또는 상대 경로)를 지정할 수 있습니다. 값이 비어 있으면 제한 최대값을 초과하는 블록 파일이 삭제됩니다. 보관 디렉토리의 파일은 더 이상 nodeos 에서 액세스할 수 없습니다.
  • blocks-retained-dir: 블록 저장 디렉터리(절대 경로 또는 상대 경로)의 위치를 지정할 수 있습니다. 값이 비어 있으면 블록 dir 값으로 설정됩니다.

새로 추가된 모든 옵션은 --block-log-retain-blocks 옵션과 함께 지정할 수 없습니다. 블록 로그 분할 기능과 관련 옵션을 사용하면 블록 로그를 보다 효율적으로 관리하고 nodeos 인스턴스의 효율성을 높일 수 있습니다.

SHiP 로그 분할

SHiP 로그 분할을 쉽게 사용할 수 있도록 상태 기록 플러그인(State History Plugin)에 몇 가지 새로운 옵션을 추가했습니다.

  • state-history-stride: 블록 번호가 스트라이드의 배수일 때 상태 기록 로그 파일을 분할할 수 있습니다. 스트라이드에 도달하면 현재 기록 로그 및 인덱스의 이름이 ‘*-history — .log/index’로 변경되고 최신 블록으로 새 현재 기록 로그 및 인덱스가 생성됩니다. 이 형식을 따르는 모든 파일은 확장 기록 로그를 구성하는 데 사용됩니다.
  • max-retained-history-files: 파일의 블록을 쿼리할 수 있도록 유지할 상태 기록 로그 파일 그룹의 최대 수를 지정할 수 있습니다. 이 값에 도달하면 가장 오래된 로그 파일이 보관 디렉토리로 이동하거나 보관 디렉토리가 비어 있으면 삭제됩니다. 저장된 로그 파일은 사용자가 임의로 조작해서는 안 됩니다.
  • state-history-retained-dir: 상태 기록 보존 디렉토리(절대 경로 또는 상태-history dir에 대한 상대)의 위치를 지정할 수 있습니다. 값이 비어 있으면 상태 기록 dir 값으로 설정됩니다.
  • state-history-archive-dir: 상태 기록 보관 디렉토리(절대 경로 또는 상태-history dir에 대한 상대 경로)의 위치를 지정할 수 있습니다. 값이 빈 문자열이면 유지 제한을 초과하는 로그 파일이 삭제됩니다. 보관 디렉토리의 모든 파일은 사용자가 완전히 제어할 수 있습니다. 즉, nodeos 에서 더 이상 액세스할 수 없습니다.

새로 추가된 모든 옵션은 --state-history-retain-num 옵션과 함께 설정 할 수 없습니다. SHiP 로그 분할 기능을 사용하면 상태 기록 로그 파일을 보다 효율적으로 관리하고 nodeos 인스턴스의 효율성을 높일 수 있습니다.

성능 향상

읽기 전용 트랜잭션의 실행 병렬화

Leap v4.0.0 에서 읽기 전용 트랜잭션 실행을 병렬화 하였습니다.
일반 읽기 전용 트랜잭션은 메인 쓰레드에서 순차적으로 실행됩니다. 메인 쓰레드에서 이를 오프로딩(offloading)한 뒤 멀티코어 아키텍처를 활용, 멀티쓰레드로 실행하면 메인 쓰레드에 보다 여유가 생겨 읽기 전용 트랜잭션의 처리량을 향상시킬 수 있습니다.

다음 문서에서 상세한 설계 내용을 확인할 수 있습니다.

이 기능을 활성화하면 노드가 write 구간(window)과 read 구간사이를 전환합니다. write 구간에서는, 읽기 전용 트랜잭션이 나중에 read 구간에서 병렬 실행을 위해 대기열에 들어가 있는 것을 제외하고 노드가 정상적으로 작동합니다. read 구간에서 대기 중인 읽기 전용 트랜잭션은 전용 스레드 풀에서 실행되고 읽기 전용 트랜잭션 실행에 안전한 작업은 메인 스레드에서 실행됩니다.

추가된 새로운 옵션들은 다음과 같습니다.

--read-only-threads arg (=0)  읽기 전용 트랜잭션 실행 스레드 풀에 있는 워커 스레드의 수
--read-only-write-window-time-us arg (=200000) 쓰기 윈도우가 지속되는 시간(ms)
--read-only-read-window-time-us arg (=60000) 읽기 윈도우가 지속되는 시간(ms)
  • --read-only-threads 가 설정되지 않거나 값이 0이면 이 기능은 사용되지 않습니다. 즉, 읽기 전용 트랜잭션이 메인 스레드에서 실행됩니다.
  • --read-only-threads 는 블록 생산 노드에서는 사용할 수 없습니다.
  • --read-only-read-window-time-us 는 --max-transaction-time 보다 커야 합니다.

블록 릴레이 시 검증 작업 경량화

이 기능은 특정 조건이 충족된다는 전제 하에, 노드가 상태를 완전히 검증하거나 계산하기 전에 블록을 릴레이할 수 있도록 하여 블록 전파 지연 시간을 줄일 수 있게 합니다.

이 새로운 기능을 통해 노드는 보류 중인 트랜잭션의 백로그가 있는 경우라도 헤더를 확인한 후 수신된 블록을 즉시 처리할 수 있습니다. 또한 브로드캐스트 블록 동작(broadcast block behaviors) 및 peer_block_state_index 에 대한 최적화가 포함되어 블록 전파 시간이 더욱 향상되도록 이번에 새롭게 구현되었습니다. 블록 릴레이에서 보다 가벼운 유효성 검사를 수행하는 이유는 블록 전파의 지연 시간을 줄이기 위한 것입니다.

그밖의 멀티쓰레드 지원 기능

보다 많은 task 를 메인 쓰레드에서 별도의 쓰레드로 옮겨 처리했습니다.

  • block_log가 쓰레드 안전하게(Thread Safe) 설정되었습니다.
  • net_plugin 가 처리를 위해 메인 쓰레드에 올라가는 대신 net 쓰레드로부터 쓰레드 안전한 block_log 쓰레드를 사용하도록 업데이트 되었습니다.
  • SHiP는 메인 쓰레드의 상태 기록 로그에 기록하지만, 읽을 때는 SHiP 쓰레드의 기록 로그에서 읽습니다. 상태 기록 로그가 쓰레드 안전하게 설정되었습니다.
  • abi 직렬화(serialization)를 메인 스레드에서 들어낸 후 /v1/chain/get_block 의 성능이 크게 향상되었습니다.

기타 변경점

EVM 지원을 위한 더 빠른 이중 선형 그룹 암호화(bilinear group cryptography) 라이브러리

EOS의 이더리움 가상 머신(EVM)은 이중 선형 그룹 암호화 기능이 필요합니다. 이를 위해 libff 와 bn256 라이브러리를 서로 벤치마킹 하였습니다. bn256 라이브러리가 가장 성능이 우수한 것으로 평가되어 Antelope Leap v4.0.0에 포팅 되었습니다.

빌드, 호환성 및 업그레이드

다음과 같이 Leap 3.x 에서 4.0 으로 업그레이드 할 수 있습니다.

  1. Leap 4.0 바이너리 인스톨
  2. Confing.ini 에서 다음 설정 옵션들을 제거
    Nodeos
    ead-mode=speculative, read-mode=read-only, disable-api-persisted-trx, private-key, https-client-root-cert, https-client-validate-peers, https-server-address, https-certificate-chain-file, https-private-key-file, https-ecdh-curve, plugin=eosio::trx_test_gen_plugin, txn-reference-block-lag, txn-test-gen-threads, txn-test-gen-account-prefix, txn-test-gen-expiration-seconds, txn-test-gen-stop-on-push-failed, plugin=eosio::login_plugin, max-login-requests, max-login-timeout.
    keosd
    yubism-url, yubism-authkey, https-server-address, https-certificate-chain-file, https-private-key-file, https-ecdh-curve
  3. 이전 버전과 동일한 데이터 디렉토리 및 업데이트된 구성 파일을 사용하여 nodeos 바이너리를 다시 시작.

Leap v3.1.X 및 v3.2.X에서 사용하는 데이터 파일은 Leap v4.0.0과 호환됩니다.

기능 라이프 사이클 업데이트

V 4.0 에서 제거된 기능

추측성 모드(Speculative mode) 제거

추측성 모드는 특정 노드에서 실행된 트랜잭션의 상태를 사용자에게 잘못 보여주기 때문에 혼란을 야기하여 제거되었습니다. 이제 read-mode 에는 head 와 irreversible 모드만 사용할 수 있습니다.

Nodeos 와 keosd 의 HTTPS 제거

노드 운영자는 일반적으로 프록시에서 TLS 종단점을 설정하고 프록시와 nodeos / keosd 와는 HTTP로 연결합니다. 이 기능도 v4.0 에서 제거되었습니다.

YubiHSM 지원 중단

추가적인 의존성 필요, 복잡한 컴파일 프로세스, 자동화된 테스트의 어려움, 네이티브 ARM 기반 macOS 기기 지원 불가 등의 이유로 YubiHSM 은 v4.0 에서 제거되었습니다.

트랜잭션 생성기(Transaction Generator)

구 txn_test_gen_plugin 플러그인은 deprecated 되었으며, 대신 trx_generator 를 사용할 수 있습니다.

Login Plugin

Login Plugin 은 구 EOSIO 시절부터 사용되지 않았으며 v4.0 에서 완전히 제거되었습니다.

Blocklog Utility

Deprecated 된 blocklog-util 프로그램이 제거되었습니다. 대신 leap-util 의 block-log 를 사용할 수 있습니다.

Nodeos 의 private-key 설정

private-key 설정은 EOSIO 1.0 때 부터 사용하지 않았지만 이제서야 완전히 제거되었습니다.

Cleos 의 send transaction — read-only

Cleos 의 send transaction 명령에서 — read-only 옵션이 제거되었습니다. — dry-run 을 대신 사용할 수 있습니다.

eosio-launcher

eosio-launcher 스크립트가 launcher.py 로 대체되었습니다.

Deprecated 되었지만 아직 제거되지는 않은 기능들

fc 및 wasm-spec-tests 저장소

fc 및 wasm-spec-test는 Leap 저장소에 직접 통합되었습니다. 추가 개발은 Leap 저장소에서 직접 이루어질 것입니다.

Ubuntu 18.04 지원

다음 Leap 버전부터 Ubuntu 18.04 지원이 완전히 끊어집니다. 20.04 와 22.04 로 업그레이드해 주시기 바랍니다.

더 자세한 내용을 다음 링크에서 확인할 수 있습니다.

--

--