Leap v3.1 릴리스 블록체인 소프트웨어는 수개월 간의 연구 개발로 진행된 훌륭한 기능들과 수정사항들로 가득한 네트워크 업그레이드를 정제합니다.

청서는 이러한 기능들 중 일부를 간략히 설명했습니다. API+ 청서는 트랜잭션 손실을 감소시키고 트랜잭션 라이프사이클의 예측 가능성을 개선하기 위해 몇 가지 개선 사항을 권장했습니다.

이전 기사들에서는 주관적 청구 시스템이 어떻게 트랜잭션 손실을 일으킬 수 있는지 살펴보고 트랜잭션 손실과 같은 일반적인 트랜잭션 라이프사이클 문제에 대한 기존 개선 사항들을 간략히 설명했습니다. Leap v3.1 릴리스는 이러한 문제와 기타 사용자가 경험할 수 있는 문제를 해결하기 위한 새로운 도구를 제공합니다.

Leap v3.1 릴리스는 다음과 같은 새로운 트랜잭션 라이프사이클 도구들이 도입됩니다 :
트랜잭션 라이프사이클에 중점을 두지 않는 추가적인 Leap 업그레이드는 다음 사항들을 포함합니다 :
Leap v3.1은 다음 사항들을 제거합니다: 
  • 1.2에서 더 이상 사용되지 않는 히스토리 플러그인
  • MongoDB 플러그인
  • Older Build 스크립트
  • 가역 블록 데이터베이스(Reversible block database)
  • macOS 및 대체 Linux 배포판 지원. Leap v3.1 릴리스는 공식적으로 Ubuntu 18.04, 20.04, 그리고 22.04만 지원합니다. 
  • 또한 the abi_bin_to_jsonabi_json_to_bin 변환 API를 사용하지 않습니다.

EOSIO 1.8과 마찬가지로 Leap v3.1 릴리스에는 조정된 프로토콜 활성화가 필요합니다. 노드들은 반드시 바이너리를 업데이트하고 구성 설정을 변경해야 하며, EOSIO 2.1을 실행하는 노드는 블록 생산자가 새로운 프로토콜 기능들을 활성화하기 전에 추가 단계를 수행해야 합니다. 운영자는 업그레이드 예정 날짜인 2022년 9월 21일까지 이러한 단계를 완료해야 합니다. Leap v3.1 릴리스를 활성화하지 않는 노드는 9월 21일 이후에 나머지 네트워크와 동기화할 수 없습니다.

이러한 업그레이드 단계에 대한 자세한 내용은 저희의 업그레이드 가이드에서 확인하실 수 있습니다.

새로운 Leap v3.1 릴리스 기능들

트랜잭션 실패 추적 및 새로운 트랜잭션 엔드포인트

(세부사항)

Leap v3.1 릴리스는 트랜잭션 실패 시 임베디드 트랜잭션 예외가 있는 상세한 실패 보고서를 포함한 새로운 트랜잭션 엔드포인트 제공합니다. 이 상세 보고서는 트랜잭션 실패 추적입니다. 이 보고서를 성공적인 트랜잭션 추적으로 오해하지 마시기 바랍니다. 트랜잭션 성공을 보장하기 위해 receipt 및 except 필드를 확인할 수 있습니다.

Leap v3.1 릴리스 이전에는 실패한 트랜잭션으로 인해 실패에 대한 세부 정보 없이 트랜잭션 실패 추적이 발생했습니다. Leap v3.1 트랜잭션 실패 추적은 트랜잭션 실패시 발생한 위치를 지정하고 실패가 진행된 작업을 식별합니다. 새로운 Leap v3.1 트랜잭션 엔드포인트에는 이 기능이 기본 값으로 설정되어 있습니다.

트랜잭션 재시도

(세부사항)

트랜잭션 재시도 기능을 통해 API 노드는 손실된 트랜잭션이 블록에 나타나거나 만료될 때까지 추가로 다시 제출할 수 있습니다.

배경 지식을 위해 설명하자면, 사용자가 API 노드에 액세스하여 네트워크에 트랜잭션을 전송할 때 트랜잭션이 성공적으로 블록에 추가될 것이라는 보장은 없습니다.

주관적 청구 또는 지리적 지연(geographic latency)과 같은 다양한 문제로 인해 네트워크를 통해 활성 블록 프로듀서에게 트랜잭션이 전파되지 않을 수 있습니다. 이러한 문제를 해결하는 한 가지 방법은 API 노드가 블록체인에 포함할 트랜잭션을 추적하고, 블록 프로듀서들이 블록에 게시하지 않은 트랜잭션을 다시 시도하도록 허용하는 것입니다.

트랜잭션 재시도 기능은 들어오는 트랜잭션 풀을 생성하고 해당 풀에 트랜잭션들을 임시로 유지합니다. 블록에 포함된 후, 해당 트랜잭션은 설정된 블록 수 동안 또는 해당 블록이 되돌릴 수 없을 때까지 풀에 남아 있게 됩니다.

노드 운영자들은 트랜잭션 풀 매개변수와 누락된 트랜잭션을 정의하는 기준을 개별적으로 설정합니다. 만약 도구가 이러한 기준에 따라 누락된 트랜잭션을 감지할 경우, 트랜잭션을 네트워크에 다시 제출합니다.

트랜잭션 최종성 상태

(세부사항)

트랜잭션 최종성 상태 기능을 통해 노드는 지정된 트랜잭션의 최종성 상태를 공유할 수 있습니다. 이는 또한 현재 체인 상태의 스냅샷을 반환합니다.

개발자가 그들의 스마트 컨트랙트에서 구현하는 가장 일반적인 기능 중 하나는 트랜잭션의 최종성 상태를 확인하는 것입니다. 현재의 도구들로는 각 개발자들이 반드시 맞춤형 솔루션을 구축해야 합니다. 트랜잭션 최종성 상태 구축 및 재구축에 대한 요구로 인해 개발 시간이 늘어나고 스마트 컨트랙트 익스플로잇 및 버그에 대한 벡터가 추가됩니다. 노드들이 이러한 트랜잭션 최종성 정보를 직접 제공할 수 있도록 하는 것에는 엄청난 가치가 있습니다.

트랜잭션 최종성 상태 기능을 통해 노드들은 현재 체인 상태의 스냅샷을 공유할 수 있습니다. 이 기능이 활성화된 노드는 트랜잭션 상태를 저장하고 새로운 엔드포인트를 열어 해당 상태를 쿼리할 수 있습니다. 트랜잭션이 체인에 나타나지 않으면 “UNKNOWN” 상태로 반환됩니다.

트랜잭션 리소스 비용 추정

(세부사항)

트랜잭션 리소스 비용 추정 기능을 통해 노드는 리소스 비용 추정치를 반환하는 읽기 전용 엔드포인트를 오픈할 수 있습니다.

Antelope 체인들에서, 활성 블록 프로듀서는 실행 시간에 트랜잭션 비용을 결정합니다. 블록 프로듀서는 트랜잭션의 서명되지 않은 부분을 실행하는 데 사용되는 CPU 시간을 측정하여 CPU 비용을 결정합니다. 블록 프로듀서 CPU 성능의 차이로 인해 트랜잭션을 전송하기 전에 실제 리소스 비용을 확인하기는 어렵습니다.

트랜잭션 리소스 비용 추정 기능을 사용하면 사용자와 애플리케이션이 트랜잭션의 리소스 비용을 보다 정확하게 추정하는 데 도움이 됩니다. 리소스 비용 추정 기능은 서명되지 않은 트랜잭션을 수신하는 API 엔드포인트를 생성합니다. 이 엔드포인트는 주관적 청구를 가지지 않으며, 따라서 운영자들은 DDOS 공격을 방지하기 위해 조절 기능 및 비율 제한을 둘 필요가 있습니다. 해당 기능이 활성화된 노드는 API 노드가 트랜잭션을 처리하는 데 걸리는 시간을 기반으로 트랜잭션의 리소스 비용 추정치를 반환합니다.

주관적 청구 개선 사항

(세부사항)

Leap v3.1 릴리스의 주관적 청구 개선 사항은 두 가지 기존 도구의 변경으로 구성되었습니다. 첫 번째 변경 사항은 노드가 그 기본값인 24시간에서 주관적 청구 감소 시간을 조정할 수 있도록 합니다. 두 번째 변경 사항은 블록 프로듀서가 사용하는 삼진법 규칙(three-strikes rule)에서 삼진법 매개변수를 조정할 수 있도록 합니다.

Antelope 체인들은 블록 프로듀서가 블록체인에 트랜잭션을 게시할 경우에만 계정에 청구를 진행하기 때문에, 실패된 트랜잭션들은 사실상 무료이며 때로는 남용으로 이어집니다. 삼진법 규칙과 주관적 청구 도구는 노드의 실패한 트랜잭션 로드를 감소시키지만 사용자의 경험에 장애물이 됩니다. Leap는 이러한 사용자 경험 장애를 완화하기 위해 조정 가능한 주관적 청구(adjustable subjective billing) 및 삼진 매개변수(three-strikes parameters)를 도입합니다.

계정 최대 실패(Account max failures): 

주관적 청구 이전에, EOSIO 2.0.9는 블록 프로듀서 노드에 대해 삼진법을 구현했습니다. 삼진법 기능은 계정이 단일 블록 내에서 실패한 트랜잭션을 세번 전송한 경우 계정의 대기중인 나머지 트랜잭션들을 삭제하여 실패한 트랜잭션의 부담을 줄입니다.

이전에 하드 코딩된 제한값 3는 이제 어떤 실패 횟수로도 구성할 수 있습니다.

추가적으로, disable-subjective-account-billing 옵션을 사용하여 화이트리스트에 등록된 계정은 더 이상 최대 트랜잭션 실패 제한을 받지 않습니다.

주관적 계정 소멸(Subjective account decay):

노드는 주관적 청구를 사용하여 각 노드에 대한 계정의 실패한 트랜잭션 CPU 예산을 추적하여 과도한 트랜잭션 실패를 방지합니다. 프로토콜은 주관적 계정 소멸이라고 알려진 기간 동안 이 예산을 계정에 반환합니다. 이전에 24시간으로 하드 코딩되었던 이 소멸시간은 이제 설정 가능합니다.

현재 24시간의 시간 창에서, 6시간 동안 트랜잭션을 푸쉬하지 않은 계정의 경우 노드는 6/24 또는 ¼을 적용하여 계정에서 사용 가능한 리소스의 25%만 제공합니다.

시간 창이 6시간으로 조정되면, 노드는 6/6 또는 1을 적용하여 사용 가능한 리소스의 100%를 동일한 계정에 제공합니다.

창이 1시간으로 설정될 경우, 테스트에서 사용자 경험 문제 없이 실패한 트랜잭션 스팸 완화에 1시간 창이 효과적인 것으로 나타났습니다.

추가 기능들: 

추가되는 새로운 기능에는 암호화 관련 개선사항, 새로운 프로토콜 옵션, 프루닝(pruning) 기능 및 로깅 개선 사항이 포함됩니다. 일부 기능은 EVM 관련 고려 사항들을 최적화하는 반면, 네트워크 참가자들은 워크플로우의 효율성을 개선하기 위한 다른 기능들을 요청했습니다.

CRYPTO_PRIMITIVES는 7개의 새로운 호스트 기능들을 도입한 기능입니다. 호스트 기능은 추상화된 스마트 컨트랙트 레이어가 아닌 기본 코드로 구현되기 때문에 스마트 컨트랙트보다 빠릅니다. 이러한 함수를 사용하면 많은 Solidity 및 EVM 기반 컨트랙트 라이브러리에서 사용되는 암호화 함수를 보다 효율적으로 연산할 수 있습니다. 새로운 기능에는 다음이 포함됩니다.

  • 해싱 알고리즘에 유용한 함수인 ( c=modm(bx) )를 보다 효율적으로 수행하는 알고리즘
  • alt_bn128 타원곡선(elliptic curve) 상의 세 가지 함수:
    • Point addition
    • Scalar multiplication
    • Bilinear functions 

이러한 기능들은 영지식 증명(예.zkSNARKs) 및 다른 개인정보 보호 데이터 검증 방법들에 대해 광범위하게 사용됩니다.

  • 두 가지 새로운 해시 함수:
    • sha3
    • blake2_f
  • libsecp256k 라이브러리로 업그레이드하여, k1 키 복구 33% 향상.

Leap v3.1 릴리스는 블록 로그 및 상태 기록 플러그인을 제거하는 nodeos 옵션이 추가되었습니다. nodeos가 이러한 파일을 정리할 때 로컬 노드 스토리지에서 이전 데이터를 제거하여 성능을 향상시킵니다.

또한 체인 상태 스냅샷에 유용한 특정 블록에서 종료할 수 있는 옵션을 제공합니다.

추가적으로, GELF라는 프로토콜의 트랜잭션 로그에 대한 사용자 정의 필드가 포함되어 있습니다. 이 프로토콜을 사용하면 운영자가 다른 트랜잭션 로그 솔루션과 쉽게 통합할 수 있는 공통 구문을 사용하여 트랜잭션 로그를 공유할 수 있습니다.

GET_BLOCK_NUM은 스마트 컨트랙트가 현재 블록 번호를 직접 가져올 수 있도록 하는 호스트 기능을 도입하는 프로토콜 기능입니다.

Mandel v3.0 릴리스로부터 업데이트 사항

(세부사항)

Mandel v3.0 릴리스에는 테스트, 로그 및 형식에 대한 새로운 기능과 다양한 변경 사항들 외에도 EOSIO v2.1 릴리스의 여러 기능들이 포함되어 있습니다. 이러한 기능은 대부분 EOSIO v2.1 릴리스의 기능으로 Mandel 기능을 최신 상태로 유지하기 위해 크게 추가되었으며 네트워크에 필요하지 않은 EOSIO v2.1 기능들은 생략되었습니다. Leap v3.1 릴리스에서 모두 여전히 지원되는 Mandel v3.0 릴리스에 추가된 프로토콜 기능들은 다음과 같습니다:

  • GET_CODE_HASH
  • ACTION_RETURN_VALUE (이는 EOSIO 2.1에서 백포트되었습니다)
  • CONFIGURABLE_WASM_LIMITS2
  • BLOCKCHAIN_PARAMETERS (이는 EOSIO 2.1에서 백포트되었습니다)

설치

Leap v3.1 릴리스는 핵심 소프트웨어의 설치 절차를 변경합니다. 또한 이전에 릴리스된 업데이트와 비교하여 몇 가지 호환성 차이가 있습니다.

새로운 빌드 절차는 사용자 지정 셸 스크립트 대신 CMake에 의해 진행되는 빌드 프로세스를 사용합니다. 이러한 빌드 스크립트가 없이 소스 코드에서 빌드하려면 필요한 종속성(dependencies)을 설치해야 합니다. Readme에는 이러한 종속성과 권장되는 빌드 절차가 나열되어 있습니다.

Leap v3.1 릴리스는 Ubuntu 20.04 및 22.04용으로 제작되었으며 Ubuntu 18.04를 지원하지만 다른 배포판, 컴파일러, 플랫폼에서도 작동될 수 있습니다.

이전 릴리스에서 업그레이드

스냅샷을 이용하여 노드 업그레이드 하기: 

  1. 먼저 EOSIO v2.0 릴리스의 nodeos 버전과 같이 호환 가능한 이전 버전의 nodeos에서 상태 스냅샷을 생성합니다.
  2. 노드의 상태 파일을 제거합니다
  3. 노드가 EOSIO v2.1 릴리스를 사용하는 경우, 운영자는 SHiP 및 블록 로그를 제거해야 합니다. EOSIO v2.0 릴리스를 실행하는 노드는 이러한 단계를 진행할 필요가 없습니다.
  4. 스냅샷과 함께 nodeos를 시작합니다. 
  5. 평소 처럼 nodeos를 시작하고 중지합니다.

보다 복잡한 상황에 대한 자세한 내용이나 조언은 업그레이드 가이드를 참조하거나 EOS Support에 문의하여 추가 권장 사항을 확인해 주시기 바랍니다.

호환성

(세부사항)

일반적으로 Leap v3.1 릴리스는 EOSIO v2.0 릴리스의 네트워크, 스냅샷, 블록 로그 및 SHiP(상태 기록 플러그인) 로그와 호환되지만 EOSIO v2.1 릴리스는 호환되지 않습니다.

Leap v3.1 릴리스는 이전 소프트웨어 버전의 상태 파일과 호환되지 않습니다.

Leap v3.1 release 사용 중단 및 제거사항(Deprecations & Removals)

(세부사항)

Leap v3.1 릴리스는 ABI 변환 API를 더 이상 사용하지 않으며 사용되지 않는 몇가지 기능을 제거합니다. 

ABI 변환 API는 더 이상 사용되지 않습니다.

abi_bin_to_jsonabi_json_to_bin 변환 API는 직렬화된 데이터를 역직렬화된 데이터로 변환하거나 또는 그 반대로 변환합니다. 둘 다 Leap v3.1 릴리스에서 더 이상 사용되지 않습니다.

다음과 같은 몇 가지 기능들이 제거되었습니다:

  • Old Build Scripts

Leap v3.1 릴리스는 nodeos, cleos, keosd 및 그들의 종속성(dependencies)을 설치하는 빌드 스크립트를 제거합니다. 새로운 CMAKE 스크립트는 nodeos, cleos, and keosd만 설치하며 운영자는 반드시 종속성(dependencies)을 먼저 설치해야 합니다.

  • History Plugin

EOSIO v1.0 릴리스에는 히스토리 플러그인이 포함되어 있지만 EOSIO v1.2는 더 성능이 뛰어난 솔루션을 위해 2018년 8월 14일부터 해당 히스토리 플러그인을 사용하지 않습니다. 이는 Leap v3.1 릴리스에서 제거되며 --plugin eosio::history_plugin을 사용하는 노드는 --plugin eosio::trace_api_plugin 또는 --plugin eosio::state_history_plugin으로 마이그레이션해야 합니다.

  • MongoDB Plugin

EOSIO v1.8 릴리스에서는 노드가 블록체인 데이터를 MongoDB 데이터베이스에 보관할 수 있는 MongoDB 플러그인을 더 이상 사용하지 않습니다. Leap v3.1 릴리스는 이 플러그인을 완전히 제거합니다. 노드 운영자는 state_history_plugin과 같은 히스토리 도구를 대신 사용할 수 있습니다.

  • Reversible Block Database

Leap v3.1 릴리스는 가역 블록 데이터베이스(reversible block database)를 제거하고 대신 포크 데이터베이스에 가역 블록을 저장합니다. 운영자는 config.ini 파일과 모든 스크립트에서 가역블록 데이터베이스에 대한 기존 구성 설정을 제거해야 합니다.

Ubuntu 16.04, Centos 및 MacOS에 대한 지원 중단

Leap v3.1 릴리스는 개발자 리소스를 최적화하기 위해 MacOS, Ubuntu v16.04, CentOS Linux에 배포 지원을 중단합니다. 이제 Ubuntu 18.04(제한된 지원), 20.04 및 22.04 플랫폼에서 지원되며 지원되지 않는 운영 체제를 사용하는 사용자를 위해 DUNE은 모든 Docker 호환 OS에 대한 호환성을 제공합니다.

결론

Leapl v3.1 릴리스에는 EOS 및 기타 EOSIO 기반 블록체인의 기능과 사용자 환경을 개선하기 위한 강력한 도구와 옵션이 포함되어 있습니다. 2022년 9월 21일 프로토콜 업그레이드의 예상 일정이 다가옴에 따라 노드 운영자 간의 조정이 필요합니다. 이 날짜 이후에 블록 프로듀서는 소프트웨어를 업데이트하고 월렛과 애플리케이션은 Leap v3.1 릴리스의 기능을 통합할 수 있습니다. 이번 네트워크 업그레이드가 완료됨에 따라 EOS 네트워크는 블록체인 업계에서 최고의 기술을 더욱 발전시켜 나가며 자기주권(self-sovereign) 네트워크 개발에 첫발을 내디딜 것입니다.

자세한 릴리스 정보

새로운 트랜잭션 엔드포인트

새로운 chain_api_plugin endpoint 기능은 transaction_retry 및 향후 기능을 위한 기타 매개변수가 통합되어 있습니다. 엔드포인트는 다음과 같습니다:

/v1/chain/send_transaction2 (send_transaction_params)

이는 send_transaction 엔드포인트와 비슷하지만 추가 옵션들이 있습니다. 실패 추적을 반환하는 옵션과 트랜잭션을 재시도하는 옵션이 있습니다. 이는 send_transaction과 동일한 형식을 가지며 새로운 구성 인수를 위해 저장합니다(A-1 참조).

트랜잭션 재시도

트랜잭션 재시도 기능에는 nodeos에 대한 새로운 구성 인수 및 cleos 인터페이스에 대한 새로운 명령줄(command-line) 옵션들이 함께 제공됩니다.

구성 인수(Configuration arguments)는 노드의 동작을 조정하는 데 사용되며 config.ini 구성 파일에서 또는 nodeos에서 직접 사용할 수 있습니다. 구성 파일에는 “option = value” 으로 포맷되어야 하며 명령줄 항목은 “--option=value” 또는 “--option value”로 포맷될 수 있습니다. 노드 운영자가 config.ini 파일에서 또는 nodeos 인스턴스를 시작할 때 사용할 수 있는 새로운 트랜잭션 재시도 인수는 다음으로 구성됩니다:

transaction-retry-max-storage-size-gb

이 옵션은 트랜잭션 재시도 기능에 허용되는 최대 저장소 할당(GiB)을 설정합니다. 이 숫자를 0보다 높게 설정하면 이 기능이 활성화됩니다. 해당 기능이 비활성화된 노드는 해당 기능을 요청하는 트랜잭션을 거부합니다.

transaction-retry-interval-sec (defaults to 20)

이 옵션은 블록에서 트랜잭션을 감지하지 못한 경우 노드가 들어오는 트랜잭션을 P2P 네트워크로 재전송해야 하는 빈도(초)를 설정합니다.

transaction-retry-max-expiration-sec (defaults to 90)

이 옵션은 재시도 풀의 트랜잭션에 대해 허용되는 최대 트랜잭션 만료 시간을 설정합니다. 트랜잭션 재시도 도구는 트랜잭션 만료 시간이 이 값을 초과하면 풀에 트랜잭션을 추가하지 않습니다.

p2p-dedup-cache-expire-time-sec (defaults to 10)

이 옵션은 중복 제거 캐시를 설정합니다. 해당 숫자를 조정하면 트랜잭션 풀에서 중복된 트랜잭션을 제거하는 동안 트랜잭션을 추적하는 최대 시간(초)이 조정됩니다.

cleos 를 통해 블록체인과 상호 작용하는 사용자를 위한 새로운 명령줄 옵션은 다음으로 구성됩니다.

--use-old-send-rpc (T/F)

이 옵션은 cleos가 새로운 기능과 함께 send_transaction2 대신 send_transaction을 사용하여 이전 트랜잭션 형식을 사용하도록 합니다. 이는 이전 API를 테스트하고 디버깅하는 데 유용합니다.

-t, --return-failure-trace (T/F)

이 옵션은 실패한 트랜잭션에 대한 정보를 사용자에게 반환합니다. 이는 디버깅을 개선하며, 사용자가 실패한 특정 작업을 확인할 수 있도록 합니다.

--retry-irreversible (T/F)

이 옵션을 사용하면 트랜잭션 서명자가 되돌릴 수 없는 블록에 있거나 트랜잭션이 만료될 때까지 노드가 트랜잭션을 재시도하도록 요청할 수 있습니다. 이는 blocking call입니다. 노드에 해당 기능이 활성화되어 있지 않은 경우 오류가 반환됩니다.

--retry-num-blocks (T/F)

이 옵션을 사용하면 트랜잭션 서명자가 앞서 정의된 블록 수가 있는 블록에 해당 블록이 표시될 때까지 또는 트랜잭션이 만료될 때까지 노드가 트랜잭션을 재시도하도록 요청할 수 있습니다. 이는 blocking call입니다. 노드에 해당 기능이 활성화되어 있지 않은 경우 오류가 반환됩니다.

트랜잭션 최종성 상태

트랜잭션 최종성 상태 기능은 요청에 대한 응답으로 트랜잭션 상태를 보냅니다. 이 도구는 트랜잭션이 만료되거나 지정된 수의 블록에 대해 완료될 때까지 노드가 전파한 트랜잭션을 트랜잭션 풀에 저장합니다.

여기에는 다음과 같은 인수가 포함됩니다:

transaction-finality-status-max-storage-size-gb 

이 옵션은 트랜잭션 최종성 상태 풀의 스토리지 크기(GiB)를 설정합니다. 풀 크기가 이 제한에 도달하면 노드에서 이전 트랜잭션들을 삭제합니다. 0보다 높게 설정하면 이 기능이 활성화됩니다. 기능이 비활성화된 노드는 해당 기능을 요청하는 트랜잭션을 거부합니다.

transaction-finality-status-success-duration-sec

이 옵션은 성공적인 트랜잭션 최종성 상태가 된 후 트랜잭션 최종성 상태 풀에 보관되는 시간(초)을 정의합니다.

transaction-finality-status-failure-duration-sec

이 옵션은 실패한 트랜잭션이 만료시간에 도달한 후 트랜잭션 최종성 상태 풀에 보관되는 시간(초)을 정의합니다.

cleos를 위한 새로운 명령줄 옵션

get transaction-status <id>

이 옵션을 사용하면 트랜잭션 ID가 지정된 노드에서 사용 가능한 경우 최종성 상태를 포함하여 트랜잭션 ID에 대한 정보와 현재 블록체인 상태를 반환할 수 있습니다. 트랜잭션이 발견되지 않으면  “UNKNOWN”을 반환합니다.

새로운 chain_api_plugin 엔드포인트

/v1/chain/get_transaction_status (get_transaction_status_params )

이 엔드포인트는 트랜잭션 ID를 수신하고, 가능한 경우 트랜잭션 최종성 상태 및 해당 트랜잭션에 대한 다른 정보를 반환합니다. 구문은 A-2를 참조 바랍니다.

트랜잭션 리소스 비용 추정

트랜잭션 리소스 비용 추정 기능은 테스트 트랜잭션을 수신하고, 트랜잭션을 체인상에 전송하지 않으면서 그 예상 리소스 비용을 반환합니다.

이 기능은 Greymass가 의도하지 않은 리소스 오버런 실패를 방지하는 데 매우 유용한 도구인 ‘Greymass Fuel’ 리소스 제공자의 리소스 비용을 추정하기 위해 효과적으로 사용해온 솔루션을 복제합니다.

이는 하나의 새로운 구성 옵션 및 새로운 하나의 API 엔드포인트를 포함합니다.

clos를 위한 새로운 명령줄 옵션

--read-only

이 옵션은 트랜잭션이 “읽기 전용”이고 블록체인에 포함되지 않도록 지정합니다. 사용자가 이 옵션이 활성화된 트랜잭션을 보내면 연결된 노드가 트랜잭션을 실행하고 모든 상태 변경을 되돌립니다.

새로운 chain_api_plugin 엔드포인트

compute_transaction

이 노드 엔드포인트는 읽기 전용 트랜잭션을 수락하고 실행한 다음 트랜잭션에 대해 계산된 리소스 비용을 반환합니다. 이전 send_transaction 매개변수와 동일한 트랜잭션 매개변수를 사용합니다. 이 엔드포인트에는 주관적인 청구가 없으므로 운영자는 DDOS 공격을 방지하기 위해 이 끝점을 조절하거나 비율 제한을 해야 합니다.

주관적인 청구 개선 사항

nodeos용 새 구성 인수

subjective-account-max-failures (default 3)

이 구성 인수는 삼진법에 사용되는 매개변수를 제어합니다. 활성화된 경우, 노드는 계정이 한 블록에서 실패한 트랜잭션을 3개를 보낸 후 계정에서 대기 중인 모든 트랜잭션을 삭제합니다. 운영자는 subjective-account-max-failures 매개변수를 사용하여 최대 실패 횟수를 3회에서 변경할 수 있습니다.

subjective-account-decay-time-minutes (default 24 hours)

이 옵션은 주관적 청구 감소 시간, 즉 전체 CPU 시간을 주관적 청구 계정에 반환하는 데 걸리는 시간을 조정합니다. 기존의 주관적 청구 잔액은 24시간 주관적 청구 감소 창을 사용합니다.

이 감소 시간의 정확한 메커니즘은 계정에서 리소스 소비의 지수 이동 평균을 측정하여 나머지 리소스 예산을 결정하는 작업이 포함됩니다. 프로토콜은 계정이 마지막으로 트랜잭션을 푸시한 이후 주관적인 소멸 시간 창의 비율로 이 나머지 리소스 예산을 곱합니다.

해당 공식(A-3 참조)은 데이터가 누락된 경우 선형 외삽(linear extrapolation)과 함께 계정 리소스 사용량의 EMA를 사용하고 현재 누적 평균에 다음을 곱합니다:

테스트 결과 효과적인 비율 제한과 최소 UX 영향 간의 균형을 유지하는 데 1시간(7200블록)이 소요되었습니다.

새로운 terminate-at-block 옵션.

nodeos 명령줄 옵션을 사용하여 운영자는 지정된 블록 번호를 수신하거나 재생하면 nodeos가 종료되도록 구성할 수 있습니다. 지정된 블록에서 나가면 원하는 상태로 자동 진행이 가능하고, 미리 결정된 스냅샷을 쉽게 자동화할 수 있습니다. terminate-at-block 옵션은 nodeos 명령줄에서 사용할 수 있는 하나의 새로운 매개변수를 도입합니다.

nodeos용 새 구성 인수:

--terminate-at-block <block#>(기본값은 0이며, 비활성화를 의미)

이 옵션은 블록 번호가 0보다 높게 설정된 경우, 제공된 블록 번호에 도달한 후 nodeos 인스턴스를 종료합니다. 이 옵션은 명령줄에서만 작동합니다.

컨트랙트 내에서 현재 블록번호 가져오기

Leap v3.1 릴리스에는 새로운 프로토콜 기능인 GET_BLOCK_NUM을 도입하여 체인이 활성화할 때 호스트 함수 get_block_num이 스마트 컨트랙트에 액세스할 수 있도록 합니다. get_block_num 호스트 함수는 현재 블록의 블록 번호 또는 블록 높이를 반환합니다.

Block Log & state_history_plugin (SHiP) Log Pruning

두 가지 새로운 옵션인 block-log-retain-blocksstate-history-log-retain-blocks를 사용할 수 있습니다. 이러한 옵션은 이러한 로그를 가장 최근에 구성된 블록으로 주기적으로 정리하도록 nodeos를 구성합니다. 노드 운영자는 Pruning을 통해 노드를 중지하지 않고 시간이 지남에 따라 nodeos가 사용하는 디스크 공간을 줄일 수 있습니다.

block-log-retain-blocks 옵션은 eosio-blocklog--vacuum 옵션을 추가하여 프루닝된 로그를 프루닝되지 않은 형식으로 변환합니다. 프루닝되지 않은 형식은 프루닝 중에 축소된 파일의 희소 영역을 확장하지만 프루닝된 데이터는 복원하지 않습니다. 노드 운영자가 block-log-retain-blocks 또는 state-history-log-retain-blocks 옵션을 제거하면 vacuum 작업이 자동으로 수행됩니다.

크립토 프리미티브(Crypto Primitives)

Leap v3.1 릴리스에는 CRYPTO_PRIMITIVES라는 새로운 프로토콜 기능이 도입되어 활성화 시 컨트랙트에 7개의 새로운 호스트 기능에 액세스할 수 있습니다. 이러한 기능은 모두 암호화 연산과 관련이 있으며 EVM 사전 컴파일된 컨트랙트를 실행하는 CPU 비용을 줄입니다.

이러한 새로운 호스트 기능을 활용하면 호스트 기능이 스마트 컨트랙트의 오버헤드 없이 네이티브 코드로 구현되기 때문에 연산에 대한 실행 시간을 크게 단축시킬 수 있습니다. 이 기능을 사용하면 이전에 트랜잭션 기한을 초과했던 암호화 기능을 활성화하고 더 낮은 CPU 비용으로 다른 기능에 액세스할 수 있습니다.

  • 모듈식 지수는 c=bx mod(m) 형식을 취합니다. 이는 정수 b를 x제곱으로 올리고 결과를 정수로 나누고 나머지를 반환합니다. 강력한 암호화를 위해 많은 수를 사용할 때 bx가 엄청나게 커지기 때문에 산술 방법을 사용하면 계산이 빠르게 어려워질 수 있습니다.

예를 들어, 1024비트 숫자 51076 을 17승으로 제곱하면 산술적으로 나머지를 찾기 위해 나누어야 하는 1,304자리 숫자가 생성됩니다. 이 프로세스는 많은 수의 경우 느립니다. CRYPTO_PRIMITIVES는 모든 크기 숫자에 대해 이러한 종류의 모듈식 지수를 효율적으로 수행하는 알고리즘을 도입합니다.

  • alt_bn128 타원 곡선이며, 일반 형식 y2=x3+ax+b의 다항식입니다. CRYPTO_PRIMITIVES는 이 곡선에서 세 가지 호스트 기능을 도입합니다: 
    • point addition (alt_bn128_add)
    • scalar multiplication (alt_bn128_mul)
    • bilinear functions (alt_bn128_pair)

이러한 호스트 기능을 사용하면 영지식 증명에 대한 zkSNARKS의 신속한 검증을 가능하게 합니다.

  • 이 기능은 또한 두 개의 새로운 해시 함수인 sha3 및 blake2_f를 도입합니다.  
    • sha3는 길이 확장 공격으로 알려진 특정 유형의 공격에 대해 더 안전한 SHA2 해싱 알고리즘의 확장입니다. 여기서 공격자는 메시지 m1과 그 길이를 사용하여 m1 x m2의 해시 함수에서 다른 메시지 m2를 디코딩합니다. SHA3는 이러한 공격에 훨씬 더 저항력이 강하며 SHA3 알고리즘은 SHA2 알고리즘을 직접 대체할 수 있습니다. 
    • blake2_f는 상대적으로 안전하지 않은 MD5 알고리즘의 속도와 SHA3 알고리즘의 높은 보안 수준을 결합하여 sha3보다 빠른 해싱 속도를 제공하는 해싱 기능입니다.
  • libsecp256k 라이브러리는 EOSIO 공개-개인 키 쌍을 계산하는 데 사용되는 타원 곡선 모음입니다. Mandel 3.1 릴리스에는 공개 키 복구 성능을 33% 향상시키는 이 라이브러리의 최신 버전에 대한 업데이트가 포함되어 있습니다.

Antelope 프로토콜은 지금까지 recover_key라는 호스트 기능을 통해 secp256k1 및 secp256r1 타원 곡선에 대한 ECDSA 공개 키 복구를 지원했습니다.

새로운 k1_recover 호스트 기능은 recover_key에서 개선되었습니다. 이는 일반적인 트랜잭션 중단 실패가 아니라 유효하지 않은 서명이 주어지면 특정 실패 조건을 반환합니다.

추가적으로, 이는 기록된 공개 키를 압축되지 않은 형식으로 반환하여 타원 곡선 계산 단계를 없애고 함수에 대한 컨트랙트 크기 및 CPU 실행 시간을 단축시킵니다.

특히, 이는 K1 타원 곡선만 지원하고 R1 타원 곡선은 지원하지 않습니다.

GELF 로깅 프로토콜을 사용한 사용자 정의 필드 지원

이제 GELF appender는 GELF logging.json 구성 파일에서 임의의 사용자 정의 필드와 값을 지원합니다. 이는 다음과 같은 제약이 있습니다: 사용자 정의 필드 이름은 밑줄로 시작해야 하며 이름에는 문자, 숫자, 밑줄, 선과 점만 사용 가능합니다.

형식 검사 외에도, 사양에 의해 예약되거나 nodeos에서 사용하는 예약된 필드 이름 목록이 있습니다(A-4 참조).

필드 이름 길이, 함께 제공되는 값 또는 사용자 정의 필드 수에 대한 강제 제한은 없습니다. 그러나 기본적으로 서버는 스트림을 각각 512바이트의 128개 조각으로 제한하므로 65536 바이트를 초과하는 메시지는 설정에 따라 서버에 의해 삭제될 수 있습니다.

GELF 프로토콜은 512바이트의 256개 조각으로 총 131072바이트의 유사한 실용적인 최대값을 적용합니다.

Graylog 서버는 선택기(selectors) 및 인터페이스에 표시할 때 사용자 정의 필드의 선행 밑줄을 자동으로 생략합니다.

Mandel v3.0 릴리스 기능

Mandel v3.0 릴리스에는 Mandel v3.0 릴리스로 이식된 EOSIO v2.1 릴리스의 몇 가지 기능이 포함되어 있습니다. 여기에는 작업 추적의 값을 반환하는 기능, WASM 런타임에 대해 구성 가능한 제한 및 기타 구성 가능한 블록체인 매개변수가 포함됩니다. Mandel v3.0 릴리스의 기능은 다음을 포함합니다:

  • GET_CODE_HASH

컨트랙트들이 어떠한 계정이 컨트랙트를 가지고 있는지 여부, 해당 컨트랙트의 해시 그리고 얼마나 많은 코드가 변경되었는지를 확인할 수 있도록 합니다.

  • ACTION_RETURN_VALUE

작업이 작업 추적의 값을 반환하도록 허용합니다.

  • CONFIGURABLE_WASM_LIMITS2

운영자가 WASM 파일에 대한 제한을 늘릴 수 있습니다.

  • BLOCKCHAIN_PARAMETERS

ACTION_RETURN_VALUE에서 지원하는 최대 반환 값과 같은 블록체인 매개변수 구성을 허용합니다.

  • onblock logging

시스템 컨트랙트 실패를 진단하는 데 도움이 됩니다.

이러한 기능들에 대한 자세한 정보는 Mandel v3.0.0 릴리스의 릴리스 페이지에서 확인할 수 있습니다.

3.0은 또한 스마트 컨트랙트가 리소스 비용을 지불할 수 있도록 하는 “컨트랙트 지불(Contract pays)”이라는 기능의 제한된 버전을 구현했습니다. 이 제한된 버전은 즉각적인 서비스 거부 공격 벡터 없이 “공개적으로 임베드된 개인 키” 접근 방식을 사용할 수 있는 해결 방법을 사용합니다.
이 버전의 “컨트랙트 지불” 기능은 프로토콜 자체의 일부로 구현되지 않고 EOS 시스템 컨트랙트에 새로운 기능을 추가하여 구현되었습니다. 이는 최신 시스템 컨트랙트 릴리스의 일부이며 개발자가 선택적으로 권한 변경을 제한할 수 있습니다.
이 접근 방식은 여전히 주관적인 청구를 통해 다른 남용에 취약합니다. 적절한 컨트랙트 지불 솔루션을 위해서는 더 많은 작업이 필요합니다.

기타 릴리스 정보

새로운 빌드 절차

CMake에 의해 구동되는 새로운 빌드 프로세스는 이전에 소프트웨어 빌드에 권장된 셸 스크립트를 대체합니다. 소스 코드에서 빌드하려는 사람들은 이제 필요한 종속성(dependencies)을 설치할 책임이 있습니다. 종속성 목록과 권장되는 빌드 절차는 README.md 파일에 있습니다. readme에는 테스트를 효율적으로 실행하기 위한 지침도 포함되어 있습니다.

Ubuntu 18.04, 20.04 및 22.04만이 지원되는 빌드 플랫폼들입니다. 다른 배포판, 컴파일러 및 플랫폼이 작동하는 것으로 알려져 있습니다. 여러분의 경험은 다를 수 있습니다.

호환성

스냅샷 호환성

노드 운영자는 스냅샷을 사용하여 nodeos를 블록체인의 나머지 부분과 더 빠르게 동기화할 수 있습니다.

Mandel v3.1 릴리스 v6과 함께 도입된 최신 스냅샷 버전은 nodeos v3.1과만 호환됩니다. 이전 v4 스냅샷은 Mandel v3.1 릴리스, EOSIO v2.0 릴리스 및 EOSIO v2.1 릴리스와 호환됩니다.

V5 스냅샷은 지원되지 않는 EOSIO v2.1 릴리스에서 가져온 것이며 EOSIO v2.1 릴리스 기능이 비활성화되지 않는 한 Mandel v3.1 릴리스에서 작동하지 않습니다.

네트워크 호환성

네트워크 호환성은 노드 간의 p2p 연결을 통해 블록 및 트랜잭션을 수락하고 블록 요청에 응답하는 노드의 기능을 나타냅니다.

이 릴리스는 네트워크에서 EOSIO v2.1 릴리스 관련 기능을 활성화하지 않는 한 EOSIO v2.0.x 릴리스를 실행하는 네트워크 및 EOSIO v2.1 릴리스를 실행하는 네트워크와 호환됩니다.

State_history_plugin 호환성.

Leap v3.1 릴리스는 EOSIO v2.0 릴리스에서 생성된 블록 로그 및 SHiP(상태 히스토리 플러그인) 로그와 호환되지만 EOSIO v2.1 릴리스는 호환되지 않습니다.

Leap v3.1 릴리스의 새로운 기능은 상태 기록 ABI에 대한 사항들을 변경해야 했습니다. Leap v3.1 nodeos 인스턴스의 상태 히스토리 소비자는 다음 변경 사항을 처리할 준비가 되어 있어야 합니다.

이전의 _v0 버전 대신 새로운 action_trace_v1chain_config_v1이 전송됩니다. 클라이언트는 Leap v3.1 릴리스로 업그레이드하기 전에 상태 히스토리 로그 항목에서 v0 버전을 계속 수신하므로, v0 또는 v1 변형을 수신할 준비가 되어 있어야 합니다.

상태 파일 호환성(State File Compatibility)

이 릴리스는 이전 릴리스에서 생성된 상태 파일과 호환되지 않습니다. 현재 상태 파일을 다시 빌드하려면 이전 버전의 nodeos에서 생성된 호환 가능한 스냅샷 파일을 사용하십시오.

이전 릴리스에서 업그레이드하기

nodeos에서 상태(state)의 스냅샷을 생성합니다. EOSIO v2.1 릴리스의 스냅샷은 사용할 수 없지만 Mandel v3.0 또는 v3.1 릴리스와 이전 스냅샷 버전의 스냅샷은 작동합니다.

업그레이드하는 노드에서 사용하는 상태 파일을 제거합니다. 노드가 EOSIO 2.1을 사용하고 있는 경우 운영자는 반드시 SHiP도 제거하고 로그를 차단해야 합니다. 노드가 EOSIO v2.0 릴리스에서 업그레이드되는 경우 SHiP 및 블록 로그가 남을 수 있습니다.

스냅샷과 nodeos를 시작합니다. 이후에 nodeos는 평소처럼 시작되고 중지 될 것입니다.

지원 중단 및 제거(Deprecations & Removals)

Leap v3.1 릴리스는 사용되지 않는 일부 기능을 제거합니다. 이 중 history_pluginmongoDB_plugin이 있으며 둘 다 state_history_plugin 또는 trace_history_plugin을 대안으로 사용할 수 있습니다. Leap v3.1 릴리스는 또한 더 성능이 뛰어난 EOS VM을 위해 WABT를 제거합니다. Mac 및 Windows 사용자는 여전히 DUNE을 사용하여 Mandel 블록체인 환경을 가상화할 수 있지만 Mac 지원도 중단됩니다.

새로운 업데이트는 cleos WAST 출력을 더이상 사용하지 않으며, 향후 업데이트에서 이를 제거 할 것입니다.

ABI 변환 API는 더 이상 사용되지 않습니다.

API /v1/chain/abi_bin_to_json/v1/chain/abi_json_to_bin은 이 릴리스부터 더 이상 사용되지 않으며 향후 릴리스에서는 완전히 비활성화되거나 제거됩니다. 이는 악의적인 행위자가 변환 중에 매개변수를 전환하기 위해 악용할 수 있는 이러한 API를 맹목적으로 신뢰하는 보안 위험 때문입니다.

빌드 스크립트 제거

앞서 언급했듯이, Leap v3.1 릴리스는 EOSIO에서 빌드 스크립트를 제거합니다. 빌드를 위한 지침으로 eosnetworkfoundation/mandel Github 저장소에서 README.md를 참조하시기 바랍니다.

history_plugin 제거

history_plugin은 2018년 EOSIO v1.2.0 릴리스의 일부로 더 이상 사용되지 않으며, Leap v3.1 릴리스에서는 이를 완전히 제거합니다. 이후 state_history_plugin 및 Hyperion과 같은 RAM 효율적인 솔루션이 history_plugin을 대체했습니다.

즉, --plugin eosio::history_plugin 옵션으로 초기화하는 노드는 대신 --plugin eosio::trace_api_plugin 또는 --plugin eosio::state_history_plugin 옵션으로 마이그레이션해야 합니다.

mongo_db_plugin 제거

mongo_db_plugin은 EOSIO v1.8.0 릴리스의 일부로 더 이상 사용되지 않으며, 이번 릴리스에서는 완전히 제거합니다.

가역 블록 데이터베이스 제거

chainbase 데이터베이스는 nodeos 작업 중에 활성 가역 블록 세트를 저장하는 데 더 이상 사용되지 않습니다. 가역 블록은 셧다운 시 포크 데이터베이스에 여전히 저장됩니다.

참고: 노드 운영자는 다음을 포함하여 config.ini 파일 및 모든 스크립트에서 가역 블록 Chainbase 데이터베이스에 대한 기존 구성을 제거해야 합니다.

  • reversible-blocks-db-size-mb
  • reversible-blocks-db-guard-size-mb
  • fix-reversible-blocks
  • import-reversible-blocks 
  • export-reversible-blocks

Ubuntu 16.04, Centos 및 MacOS에 대한 지원 중단

(Ubuntu 18.04, 20.04, 22.04 지원) (개발자는 Windows, Mac 및 Docker를 지원하는 모든 Linux 배포에 DUNE를 사용해야 합니다.)

Ubuntu 16.04, Centos, 그리고 macOS

앞서 언급했듯이, 공식적으로 지원되는 플랫폼은 Ubuntu 18.04, 20.04 및 22.04뿐입니다. Leap는 바이너리 패키지 지원 및 코드 수준 변경에서 Ubuntu 16.04, Centos 및 macOS를 포함한 다른 모든 항목을 제거했습니다.

Ubuntu가 아닌 시스템에서 Leap v3.1 릴리스를 실행하는 개발자는 Windows 10 및 11, macOS 및 Docker를 지원하는 모든 Linux 배포를 지원하는 DUNE 사용을 고려해야 합니다.

제안된 사용 중단 사항

블록 프로듀서를 위한 r1 곡선 및 다중 키 제어 중단

향후 릴리스에서는 사용 부족으로 인해 블록 서명에 R1 곡선을 사용하는 블록 생산자를 더 이상 사용하지 않을 수 있습니다.

EOSIO는 원래 여러 가중치 키가 계정을 제어할 수 있는 것처럼 블록 프로듀서가 여러 가중치를 가진 여러 키를 블록 프로듀서로 등록할 수 있도록 허용했습니다. 또한 블록 프로듀서는 k1 또는 r1 곡선으로 키를 등록할 수 있습니다. 이들은 타원 곡선 암호화에 사용되는 다른 곡선들입니다.

공식 문서는 r1 곡선이 “검증 가능한 무작위” 곡선을 사용하도록 지정했습니다. 비트코인 팬들은 비트코인의 창시자인 나카모토 사토시가 잠재적인 백도어가 없는 이 “검증 가능한 무작위” 곡선을 믿지 않았다고 광범위하게 추측합니다. 이러한 불신과 secp256k1 곡선의 효율성 때문에 비트코인은 k1 곡선을 사용합니다.

EOS의 블록 프로듀서는 r1 곡선 또는 다중 키 블록 생산에서 키를 사용하지 않습니다. 피드백을 구하는 이 공개 Github 문제는 r1 타원 곡선의 키에 대한 지원을 중단하고 다중 키 생산자 권한을 중단할 것을 제안합니다.

YubiHSM 지원을 Generic HSM 지원으로 대체

EOSIO v1.7 릴리스에는 사용자가 YubiKey 하드웨어 인증 장치를 사용하여 EOSIO 도구 keosd에서 키를 쉽게 생성할 수 있는 도구가 함께 제공됩니다. 이 제안은 이 도구와 함께 제공되는 불필요한 종속성 및 소프트웨어 통합 장애물을 지적하고 YubiKey를 포함한 모든 일반 하드웨어 인증 장치와 호환되는 대체 도구를 제안합니다.

이 대안을 사용하려면 단일 사용자 keosd 환경에 2명의 사용자 일반 도구를 원활하게 통합할 수 있는 새로운 도구가 필요합니다.

부록

A-1 새로운 send_transaction2 엔드포인트 구조:

엔드포인트는 다음의 구조를 가지고 있습니다:

struct send_transaction2_params {

    bool return_failure_trace = true; ///< Embed transaction exceptions into the returned transaction trace

    bool retry_trx = false; ///< request transaction retry on validated transaction

    std::optional<uint16_t> retry_trx_num_blocks{}; ///< if retry_trx, report trace at specified blocks from executed or lib if not specified

    fc::variant transaction; ///< same format as send_transaction
};

A-2 트랜잭션 최종성 상태 엔드포인트에 대한 구문

엔드포인트는 다음의 구문을 가지고 있습니다:

struct get_transaction_status_params {
      string id; //transaction id to status
 };
 struct get_transaction_status_results {
    string state;
    std::optional<uint32_t> block_number;
    std::optional<chain::block_id_type> block_id;
    std::optional<fc::time_point> block_timestamp;
    std::optional<fc::time_point> expiration;
    uint32_t head_number;
    chain::block_id_type head_id;
    fc::time_point head_timestamp;
    uint32_t irreversible_number;
    chain::block_id_type irreversible_id;
    fc::time_point irreversible_timestamp;
    chain::block_id_type last_tracked_block_id;
};

A-3 리소스 비용 계산

계산은 제한된 데이터가 제공될 때 선형 외삽을 사용하여 계정 체인 활용의 지수 이동 평균을 사용합니다. 이는 현재 누적된 평균에 (창의 블록 수 – 마지막 업데이트 이후의 블록 수) / (창의 블록 수)를 곱합니다.

EMA는 다음과 같이 창의 각 기간에 대해 계산됩니다:

EMA = 지수 이동 평균, 

k = 가중치 승수, k = 2N + 1 여기서 N은 시간 창의 기간(period)의 수.

pc= 이번 기간의 종가(closing price), 

EMAp= 이전 기간의 EMA, 첫번째 기간의 EMA = 시간 창의 SMA.

공식은 다음과 같습니다:

EMA는 첫 번째 기간부터 시작하여 한 번에 한 기간씩 계산됩니다. 첫 번째 기간의 EMA는 SMA와 동일하며, 이는 다음과 같은 전형적인 평균 공식을 사용합니다:

여기서 n은 창에서 기간(period)의 수이고, A는 각 기간의 값입니다.

A-4 GELF 리저브 필드:

예약된 필드의 이름 목록은 다음과 같습니다:

_id
_timestamp_ns
_log_id
_line
_file
_method_name
_thread_name
_task_name

A-5 추가 도구들

Leap 3.1와 함께, 두 가지 관련 도구가 AntelopeIO GitHub organization에 릴리스 되었습니다:

또한 EOS 네트워크 재단은EOS System Contracts v3.1을 릴리스 했습니다.

컨트랙트 개발 툴키트 (CDT)

Contract Development Toolkit(CDT)는 스마트 컨트랙트 개발자가 컨트랙트를 WebAssembly로 컴파일하는 데 사용할 수 있는 도구 모음입니다. CDT 버전 3.0.0은 이 도구에 대한 몇 가지 변경 사항을 구현합니다.

개발자는 이번 릴리스에서 툴키트의 명칭이 “eosio.cdt”에서 “cdt”로 변경되는 점을 알아야 합니다. 개발자는 이 변경 사항을 수용하기 위해 그들의 CMake 파일을 변경하고, “eosio.cdt”의 각 인스턴트를 “cdt”로 변경해야 합니다.

이름 변경에는 다음이 포함됩니다:

  • 바이너리로 이름이 변경되어 “eosio”가 아닌 “cdt”라는 접두사가 붙습니다. 즉, eosio-cppcdt-cpp 등이 됩니다.
  • CMake 프로젝트는 find_package(eosio.cdt) 대신 find_package(cdt)를 사용합니다.
  • 모든 라이브러리 경로 및 네임스페이스는 동일하게 유지되지만, 향후 릴리스에서 더 이상 사용되지 않는 기능에 포함될 수 있습니다.
크립토 익스텐션(Crypto Extensions)

Leap v3.1 릴리스는 현재 블록 번호를 가져오는 호스트 기능과 새로운 크립토 프리미티브 호스트 기능 세트를 추가하는 CRYPTO_PRIMITIVES 프로토콜 기능을 추가하는 GET_BLOCK_NUM 프로토콜 기능에 대한 지원을 추가합니다. 스마트 컨트랙트 개발자가 이를 활용할 수 있도록 CDT v3.0 릴리스에서는 이를 C API에 추가하고 일부는 C++ API에 추가했습니다.

C API 는 현재 다음과 같은 기능들을 가지고 있습니다:

void sha3( const char*, uint32_t, char*, uint32_t , int32_t)
int32_t blake2_f(uint32_t, const char*, uint32_t, const char*, uint32_t, const char*, uint32_t, const char*, uint32_t, int32_t, char* , uint32_t)
int32_t k1_recover( const char*, uint32_t, const char*, uint32_t, char*, uint32_t)
int32_t alt_bn128_add( const char*, uint32_t, const char*, uint32_t, char*, uint32_t)
int32_t alt_bn128_mul( const char*, uint32_t, const char*, uint32_t, char*, uint32_t)
int32_t alt_bn128_pair( const char*, uint32_t)
int32_t mod_exp( const char*, uint32_t, const char*, uint32_t, const char*, uint32_t, char*, uint32_t)
uint32_t get_block_num( void )

C++ API는 현재 다음과 같은 기능들을 가지고 있습니다:

block_num_t current_block_number() - (in system.hpp)
eosio::checksum256 sha3(const char*, uint32_t) - (in crypto.hpp)
eosio::checksum256 keccak(const char*, uint32_t) - (in crypto.hpp)
void assert_sha3(const char*, uint32_t, eosio::checksum256&) - (in crypto.hpp)
void assert_keccak(const char*, uint32_t, eosio::checksum256&) - (in crypto.hpp)

CDT v3.0 릴리스는 SHA3 해시 함수 및 현재 블록 번호를 가져오는 함수에 대한 C++ 래퍼(wrappers)만 추가합니다. 다른 호스트 기능 및 관련 데이터 유형에 대한 C++ 래퍼는 CDT의 이후 릴리스에 추가될 것입니다.

Stack Canary

Stack Canary는 스택이 컨트랙트의 예약된 메모리 부분 끝에 배치될 때 스택 오버플로를 방지하는 새로운 CDT 기능입니다. “스택(stack)”은 추가로 중첩된 함수가 호출될 때 증가하는 메모리 부분입니다.

대규모 스택 크기를 허용하기 위해 -fno-stack-first 플래그를 사용할 때 스마트 컨트랙트 개발자는 예기치 않은 결과나 심각한 버그에 노출될 수 있습니다. 일반적으로, CDT는 주소 지정 가능한 메모리 집합의 시작 부분에 스택을 배치합니다. 이는 스택 오버플로가 컨트랙트 데이터로 유출되고 메모리 액세스 위반을 유발하여 예기치 않은 동작이나 심각한 버그를 일으키는 것 대신 프로그램이 종료되기 때문에 메모리 오버런을 방지하는 이점이 있습니다. 그러나 WASM은 WASM 메모리의 첫 64kb 페이지에서 정적 데이터를 처리하는 것으로 제한됩니다. 컨트랙트는 메모리의 첫 64KiB 내에 있어야 하므로 스택 크기는 64KiB에서 컨트랙트 데이터 크기를 제외한 값으로 제한됩니다.

CDT는 컨트랙트에 주소 지정 가능한 메모리 끝에 스택을 배치할 수 있는 옵션을 제공합니다. 이는 전체 64KiB 첫 페이지를 정적 데이터로 열어 더 큰 스택을 가능하게 합니다. 그러나 이로 인해 스택 오버플로가 범위를 벗어난 메모리를 덮어쓸 가능성이 있습니다.

이를 완화하기 위해 CDT v3.0 릴리스에는 -stack-canary 옵션이 추가되었습니다. 이는 스마트 컨트랙트에 몇몇 보호 기능을 추가하므로, 컨트랙트가 스택을 초과하는 경우 예상치 못한 결과로 이어지는 대신 컨트랙트가 실패합니다.

이를 해결하기 위해, CDT 3.0.0에서는 스택 오버플로가 발생하면 이를 감지하고 프로세스를 종료하는 “Stack Canary”를 도입했습니다. 이렇게 하면 스택이 범위 밖의 메모리를 덮어쓰는 것을 방지하여 스택을 메모리 시작 부분에 유지하는 것과 동일한 이점을 제공하는 동시에 더 많은 초기 메모리(전역 변수 및 문자열)와 더 큰 스택 크기를 허용합니다.

이 작업이 실패할 경우, 8000000000000000002 의 어셜선 코드가 생성됩니다.

버그 수정

빌드 이슈로 인해, CDT v3.0 릴리스는 ccachesccache를 사용하여 CDT를 컴파일하는 기능이 제거되었습니다.

Docker Utilities for Node Execution (DUNE)

DUNE은 macOS, Windows 10, 11 및 Leap v3.1 릴리스에서 직접 지원하지 않는 기타 운영 체제에서 실행되도록 설계된 환경입니다. DUNE에는 Docker 및 Python3이 필요하지만 readme에 각 운영 체제에 대한 지침이 제공되므로 실행이 어렵지 않습니다. nodeos, cleos, cdt 및 기타 Leap v3.1 구성 요소와 동일한 명령을 제공합니다. 또한 이러한 모든 구성 요소를 포함하는 다른 추상화된 명령도 제공합니다. 중요한 것은 Docker-capable 머신을 가진 사람이라면 누구나 EOS 네트워크에서 개발하고 테스트할 수 있다는 것입니다.

EOS 시스템 컨트랙트 업그레이드

EOS 시스템 컨트랙트 v3.1 릴리스는 핵심 컨트랙트를 업데이트 하고 부트 컨트랙트라는 새로운 시스템 컨트랙트를 도입합니다.

부트 컨트랙트는 새로운 블록체인을 부트스트랩하는 데 도움이 됩니다..

PREACTIVATE_FEATURE 이외의 프로토콜 기능에 도입된 모든 호스트 기능은 핵심 컨트랙트와 같은 특권 컨트랙트를 사용하여 해당 기능이 활성화될 때까지 사용할 수 없습니다. 핵심 컨트랙트를 배포하려면 프로토콜 기능을 통해 도입된 특정 호스트 기능을 사용할 수 있어야 합니다. 이는 활성화 역설을 생성하여 핵심 계약의 배포를 방지합니다.

부트 컨트랙트는 이 문제를 우회합니다. 부트 컨트랙트는 스마트 컨트랙트를 사용하지 않고 블록 프로듀서가 활성화할 수 있는 PREACTIVATE_FEATURE 이외의 어떠한 프로토콜 기능에도 종속되지 않습니다. PREACTIVATE_FEATURE 활성화를 통해 권한 있는 컨트랙트에서 사용할 수 있는 preactivate_feature 호스트 기능을 사용하면 권한 있는 부팅 컨트랙트에서 핵심 컨트랙트를 배포하는 데 필요한 각 프로토콜 기능을 활성화할 수 있습니다. 핵심 컨트랙트를 새 체인에 배포하려는 경우 초기 단계에는 블록 프로듀서를 통해 PREACTIVATE_FEATURE 프로토콜 기능을 활성화하고, 부트 컨트랙트를 배포한 다음, 부트 컨트랙트를 사용하여 핵심 컨트랙트에 필요한 다른 모든 프로토콜 기능을 활성화하는 것이 포함됩니다.

핵심 컨트랙트 업그레이드를 위해서는 CONFIGURABLE_WASM_LIMITS2BLOCKCHAIN_PARAMETERS 기능이 활성화되어 있어야 합니다. 이러한 기능이 활성화되면 새로운 핵심 컨트랙트를 온체인에 배포할 수 있습니다. 새로운 핵심 컨트랙트는 이제 다음을 허용합니다.

권한 변경 제한(Restricting Permissions Changes)

핵심 컨트랙트의 한 가지 새로운 작업인 limitauthchg를 통해 계정은 선택적으로 권한 변경을 제한할 수 있습니다. 이를 사용하여 계정은 updateauthdeleteauthlinkauth, 및 unlinkauth 작업에 추가 제약을 둘 수 있습니다.

limitauthchg 작업은 allow_perms 또는 disallow_perms를 사용하여 허용하거나 허용하지 않을 권한을 정의할 수 있습니다. 노드는 기능에 옵트인하기 위해 allow_perms 또는 disallow_perms에 대해 limitauthchg를 호출할 수 있지만, 주어진 호출은 allow_permsdisallow_perms를 모두 포함할 수 없습니다. allow_perms가 정의된 경우 정의된 권한은 업데이트, 삭제, 연결 및 연결 해제 권한 부여 작업을 수행할 수 있습니다. disallow_perms가 정의된 경우 정의된 권한은 이러한 작업을 수행할 수 없습니다.

계정은 비어 있지 않은 allow_perms 또는 disallow_permslimitauthchg 작업을 호출하여 이 기능을 선택할 수 있습니다. 그들은 빈 allow_permsdisallow_permslimitauthchg 작업을 호출하여 다시 옵트아웃할 수 있습니다.

이 기능은 서비스 거부(denial-of-service) 공격을 완화하는 데 유용합니다. 특히 공개적으로 사용 가능한 개인 키를 사용하여 애플리케이션 사용자의 리소스를 관리하는 기존 리소스 관리 솔루션과 관련된 공격을 방지할 수 있습니다.

구성 가능한 WASM 제한

핵심 컨트랙트에는  CONFIGURABLE_WASM_LIMITS2 프로토콜 기능과 WASM 한도를 조정하는 작업 wasmcfg가 포함됩니다. wasmcfg의 유효한 값은 highlowdefault이지만 lowdefault은 동일합니다. 변경 가능한 전역에 사용되는 최대 바이트 수를 8배, 테이블 요소의 최대 수를 8배, 초기화 가능한 최대 메모리 범위를 16배 늘리려면 wasmcfghigh로 설정합니다. 개발자는 컨트랙트가 초기화될 때 이 기능이 high로 설정되어 있는 경우 이 기능을 low 또는 default로 재설정하면 컨트랙트가 새로운 WASM 한도를 초과하여 작동을 중지할 수 있다는 점에 유의해야 합니다.

최근 블록 정보 추정

블록 높이와 가장 최근 블록 10개의 타임스탬프가 포함된 테이블 버전 번호가 포함된 새로운 테이블인 blockinfo가 도입되었습니다.  get_latest_block_batch_info 기능은 지정된 10개 블록 배치의 시작 및 종료 블록의 블록 높이와 타임스탬프를 반환합니다. 이 배치 내의 블록 중 하나가 누락된 경우 “데이터 부족(insufficient data)”을 반환합니다. 첫 번째 블록의 조기 삭제 또는 onblock 액션 실패로 인한 공백으로 인해 블록이 누락될 수 있습니다. 이 오류는 배치 시작 높이가 최신 블록 높이보다 큰 경우에도 발생합니다.

추가 변경사항

이제 setcodesetabi 작업에서 메모 필드를 사용할 수 있습니다. 이를 통해 컨트랙트 개발자는 블록체인에서 직접 컨트랙트 버전 및 릴리스 정보를 지정할 수 있습니다.

setparams 작업에는 ACTION_RETURN_VALUE 프로토콜 기능에서 사용되는 max_action_return_value_size를 포함하여 더 많은 매개변수를 사용할 수 있습니다.

새 시스템 컨트랙트에는 계정에서 REX를 판매하지 못하게 하는 REX의 반올림 오류 버그에 대한 수정 사항이 포함됩니다. 또한 B1의 토큰 베스팅 일정을 동결시킨 시스템 컨트랙트 변경을 통합하는 패치가 있습니다.

이러한 기능들에 대한 더 많은 정보는 다음의 시스템 컨트랙트 릴리스 노트에서 확인 가능합니다.

https://github.com/eosnetworkfoundation/eos-system-contracts/releases/tag/v3.1.0-rc1