Create a virtual machine

내 진행 상황 확인하기

/ 10

Install the EOSIO platform on the virtual machine

내 진행 상황 확인하기

/ 10

Create a default wallet

내 진행 상황 확인하기

/ 10

Add the private key of the eosio system account to the wallet

내 진행 상황 확인하기

/ 10

Install the EOSIO Contract Development Toolkit

내 진행 상황 확인하기

/ 10

Build the system contracts and eosio.boot

내 진행 상황 확인하기

/ 10

Start boot node and create system accounts

내 진행 상황 확인하기

/ 10

Create and deploy the eosio.token, eosio.msig contracts, and SYS token

내 진행 상황 확인하기

/ 10

Deploy eosio.boot and eosio.system contracts

내 진행 상황 확인하기

/ 10

Create the block producer accounts

내 진행 상황 확인하기

/ 5

Transition from single node producer to multi node producers

내 진행 상황 확인하기

/ 5

이 실습에는 학습을 지원하는 AI 도구가 통합되어 있을 수 있습니다.

이 실습은 Google Cloud의 파트너인 Block.one과 공동 개발되었습니다. 계정 프로필에서 제품 업데이트, 공지사항, 혜택을 수신하는 데 동의하신 경우 귀하의 개인 정보는 실습 스폰서인 Block.one과 공유될 수 있습니다.

GSP991

Google Cloud 사용자 주도형 실습

개요

이 실습에서는 여러 노드를 사용하기 위해 단일 노드 EOSIO 블록체인을 확장합니다. 다중 노드 EOSIO 블록체인을 설정하기 위해 다양한 EOSIO 소프트웨어 구성요소를 설치합니다. 마지막으로 새 EOSIO 블록체인에서 노드 운영자 작업을 수행합니다.

목표

이 실습에서는 다음 작업을 실행하는 방법을 알아봅니다.

  • 기존 Compute Engine 가상 머신을 로드합니다.
  • EOSIO 시스템 계약을 설치하고 빌드합니다.
  • EOSIO 노드 4개가 있는 다중 노드 블록체인을 배포합니다.
  • EOSIO 다중 노드 블록체인에서 사용자 계정을 만듭니다.
  • 사용자 계정 간에 토큰을 전송하는 작업을 호출합니다.

기본 요건

이 실습을 시작하기 전에 Block.one: EOSIO 블록체인 시작하기 실습을 완료하는 것이 좋습니다.

다음 개념도 숙지하는 것이 좋습니다.

설정 및 요건

실습 시작 버튼을 클릭하기 전에

다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지를 표시합니다.

실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드(권장) 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학습자 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
  • 실습을 완료하기에 충분한 시간(실습을 시작하고 나면 일시중지할 수 없음)
참고: 이 실습에는 학습자 계정만 사용하세요. 다른 Google Cloud 계정을 사용하는 경우 해당 계정에 비용이 청구될 수 있습니다.

실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법

  1. 실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 대화상자가 열립니다. 오른쪽에는 다음과 같은 항목이 포함된 실습 설정 및 액세스 패널이 있습니다.

    • Google Cloud 콘솔 열기 버튼
    • 이 실습에 사용해야 하는 임시 사용자 인증 정보(사용자 이름 및 비밀번호)
    • 필요한 경우 실습 진행을 위한 기타 정보

    실습 타이머는 페이지 상단에 있으며 남은 시간을 표시합니다.

  2. Google Cloud 콘솔 열기를 클릭합니다(Chrome 브라우저를 실행 중인 경우 마우스 오른쪽 버튼으로 클릭하고 시크릿 창에서 링크 열기를 선택합니다).

    실습에서 리소스가 가동되면 다른 탭이 열리고 로그인 페이지가 표시됩니다.

    팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.

    참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다.
  3. 필요한 경우 아래의 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다.

    {{{user_0.username | "Username"}}}

    실습 설정 및 액세스 패널에서도 사용자 이름을 확인할 수 있습니다.

  4. 다음을 클릭합니다.

  5. 아래의 비밀번호를 복사하여 시작하기 대화상자에 붙여넣습니다.

    {{{user_0.password | "Password"}}}

    실습 설정 및 액세스 패널에서도 비밀번호를 확인할 수 있습니다.

  6. 다음을 클릭합니다.

    중요: 실습에서 제공하는 사용자 인증 정보를 사용해야 합니다. Google Cloud 계정 사용자 인증 정보를 사용하지 마세요. 참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다.
  7. 이후에 표시되는 페이지를 클릭하여 넘깁니다.

    • 이용약관에 동의하세요.
    • 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 마세요.
    • 무료 체험판을 신청하지 마세요.

잠시 후 Google Cloud 콘솔이 이 탭에서 열립니다.

참고: Google Cloud 제품 및 서비스에 액세스하려면 탐색 메뉴를 클릭하거나 검색창에 제품 또는 서비스 이름을 입력합니다. 탐색 메뉴 아이콘 및 검색창

배경

이 섹션에서는 이 실습에서 다루는 개념을 간략하게 설명합니다.

EOSIO 블록체인

EOSIO 블록체인은 분산식으로 작동할 수 있는 매우 효율적이고 결정론적인 분산 상태 머신입니다. 블록체인은 교환된 블록 시퀀스 내에서 트랜잭션을 추적합니다. 각 블록은 동일한 체인을 따라 이전 블록에 암호화 방식으로 커밋됩니다. 따라서 특정 블록에 기록된 트랜잭션을 수정하려는 경우 후속 블록의 암호화 검사를 무효화지 않고서는 사실상 수정이 불가능합니다. 이 간단한 사실 때문에 블록체인 트랜잭션은 변경이 불가능하고 안전합니다. 블록 생성 및 블록 검증은 블록 생성자라는 특수 노드에 의해 수행됩니다.

EOSIO 합의

블록 유효성 검사는 분산 노드 그룹에서 문제가 됩니다. 분산 시스템 내에서 내결함성 방식으로 이러한 블록을 검증하려면 합의 모델이 있어야 합니다. 합의는 이러한 분산 노드와 사용자가 블록체인의 현재 상태에 동의하는 방식입니다. 블록체인에서 사용되는 가장 일반적인 합의 모델 두 가지는 작업 증명(PoW)과 지분 증명(PoS)입니다. 지분 증명 방식에서는 특정 자산에 대해 가장 많은 지분 또는 비율을 소유한 노드가 동등한 의사 결정 권한을 갖습니다. 흥미로운 변형 중 하나는 위임형 지분 증명(DPoS)으로, 다수의 참여자 또는 이해관계자가 소수의 대리인을 선출하고, 이 대리인이 참여자 또는 이해관계자를 대신하여 의사 결정을 내립니다. EOSIO는 위임형 지분 증명(DPoS)을 사용하여 블록을 생성하고, 검증하고, 블록에 서명하여 최종적으로 블록체인에 추가할 권한을 부여받는 활성 생성자를 선출합니다.

EOSIO 계정, 키, 권한

계정은 EOSIO 블록체인의 참여자를 식별합니다. 참여자는 계정 내에 할당된 권한에 따라 개인 또는 그룹이 될 수 있습니다. 계정은 또한 블록체인에서 다른 계정으로 작업을 푸시하고 다른 계정에서 작업을 수신하는 스마트 계약 주체를 나타냅니다. EOSIO의 키는 트랜잭션, 블록, 기타 메시지의 서명 및 확인에 사용되는 Base58로 표현된 바이너리 문자열입니다. 키는 계정과 연결된 디지털 지갑 내에서 생성됩니다. 계정 소유권은 계정 이름으로만 정의되므로 보안을 침해하지 않고 계정과 연결된 키를 업데이트할 수 있습니다. 계정, 권한, 권한 테이블이 포함된 새로운 권한 체계는 계정이 수행할 수 있는 작업과 트랜잭션을 구성하는 작업이 승인되는 방식을 결정합니다. 이를 위해 각 계정에는 계층적 권한 구조가 할당되고 각 권한에는 서명 및 확인에 사용되는 공개 키와 비공개 키 쌍이 할당됩니다.

EOSIO 스마트 계약

스마트 계약은 트랜잭션을 구성하는 작업의 구현이 포함된 하위 수준 소프트웨어 라이브러리입니다. 또한 작업에서 액세스하고 처리하는 데이터가 저장되는 방식도 정의합니다. EOSIO에서 스마트 계약은 C++와 같은 고급 언어로 구현되고 WebAssembly(WASM) 바이너리로 컴파일됩니다. 그 후 스마트 계약을 블록체인의 계정 샌드박스 내에서 배포하고 실행할 수 있습니다.

작업 1. 가상 머신 만들기

  1. 탐색 메뉴(탐색 메뉴 아이콘)에서 Compute Engine > VM 인스턴스를 클릭합니다.

  2. 새 인스턴스를 만들려면 인스턴스 만들기를 클릭합니다.

  3. 머신 구성에서

    다음 값을 선택합니다.

    • 이름: instance-1
    • 리전:
    • 영역:
    • 머신 계열 - 범용(기본값)
    • 시리즈 - E2
    • 머신 유형 - e2-standard-2(vCPU 2개, 메모리 8GB)
  4. OS 및 스토리지를 클릭합니다.

    변경을 클릭하여 부팅 디스크 구성을 시작하고 다음 값을 선택합니다.

    • 운영체제: Ubuntu
    • 버전: Ubuntu 22.04 LTS
    • 아키텍처: x86/64

    선택을 클릭합니다.

  5. 만들기를 클릭하여 VM을 만들고 실행합니다.

참고: VM을 실행하고 완전히 사용할 수 있을 때까지 2분 정도 소요됩니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 가상 머신 만들기

작업 2. EOSIO 플랫폼 설치

  1. 탐색 메뉴(탐색 메뉴 아이콘)에서 Compute Engine > VM 인스턴스를 클릭합니다.

생성한 VM 인스턴스가 표시됩니다.

  1. VM instance-1 인스턴스의 명령 프롬프트를 열기 위해 VM 인스턴스 목록의 행에서 SSH를 클릭합니다. 그러면 셸 터미널 창이 열립니다.

  2. 먼저 VM 상자에서 소프트웨어 패키지 목록을 업데이트해야 합니다.

sudo apt update
  1. EOSIO 2.1.0에 필요하지만 Ubuntu 22.04+에 기본적으로 포함되지 않는 libssl1.1 종속 항목을 설치합니다.
wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.24_amd64.deb sudo apt install ./libssl1.1_1.1.1f-1ubuntu2.24_amd64.deb
  1. EOSIO 소프트웨어 바이너리를 가져옵니다. 여기에는 노드 p2p 소프트웨어인 nodeos, CLI 클라이언트인 cleos, 지갑 관리자인 keosd, 기타 도구가 포함됩니다.
curl -LO https://github.com/eosio/eos/releases/download/v2.1.0/eosio_2.1.0-1-ubuntu-20.04_amd64.deb
  1. EOSIO 소프트웨어 바이너리를 설치합니다. 필요한 경우 Enter를 눌러 필수 소프트웨어 종속 항목을 설치합니다.
sudo apt install ./eosio_2.1.0-1-ubuntu-20.04_amd64.deb
  1. nodeos가 설치되었는지 확인합니다.
nodeos --version

응답은 nodeos 버전입니다.

v2.1.0
  1. cleos가 설치되었는지 확인합니다.
cleos version client

응답은 cleos 버전입니다.

v2.1.0
  1. keosd가 설치되었는지 확인합니다.
keosd -v

응답은 keosd 버전입니다.

v2.1.0

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. EOSIO 플랫폼 설치

작업 3. 기본 지갑 만들기

지갑은 계정과 생성자가 각각 트랜잭션과 블록에 서명하는 데 사용하는 암호화 키를 저장합니다. 또한 비공개 키가 지갑을 벗어나지 않도록 서명을 수행하는 보안 엔클레이브를 제공합니다. 블록체인에서 상태를 변경하려면 암호화 키를 저장하고 디지털 서명을 수행할 지갑이 필요합니다.

  1. 먼저 EOSIO 지갑 관리자인 keosd에서 관리하는 모든 지갑에 대해 잠금 해제 시간 제한을 길게 설정합니다.
keosd --unlock-timeout 999999999 &

이렇게 하면 기본 제한 시간인 15분마다 지갑이 잠금 해제되는 것을 방지할 수 있습니다. 또한 keosd 데몬 서비스를 실행합니다. 다음과 비슷한 응답이 표시됩니다.

info thread-0 wallet_plugin.cpp:38 plugin_initialize ] initializing wallet plugin info thread-0 wallet_api_plugin.cpp:84 plugin_startup ] starting wallet_api_plugin info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/wallet/create ... info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/wallet/unlock info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/node/get_supported_apis

필요한 경우 Enter 키를 눌러 셸 프롬프트를 다시 가져옵니다.

  1. 기본 지갑을 만들고 my_wallet_password라는 파일에 지갑 비밀번호를 출력합니다.
cleos wallet create --file my_wallet_password

그러면 default라는 지갑이 생성됩니다. 응답은 다음과 같아야 합니다.

Creating wallet: default Save password to use in the future to unlock this wallet. Without password imported keys will not be retrievable. saving password to my_wallet_password

지갑이 생성되면 keosd가 지갑을 열고 기본적으로 잠금 해제합니다.

  1. 관리되는 지갑을 모두 보려면 다음 명령어를 실행합니다.
cleos wallet list

응답은 다음과 같아야 합니다.

Wallets: [ "default *" ]

지갑 이름 옆에 있는 별표는 지갑이 잠금 해제되었음을 나타냅니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 기본 지갑 만들기

작업 4. EOSIO 시스템 계정의 비공개 키를 지갑에 추가

모든 새 EOSIO 블록체인에는 eosio라는 기본 시스템 계정이 있습니다. 이 계정은 블록체인을 처음 설정할 때 사용됩니다. 기본적으로 비공개 키 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3과 연결됩니다.

이 비공개 키를 지갑으로 가져와 eosio 계정을 대신하여 트랜잭션에 서명합니다.

  1. cleos wallet open 명령어를 사용하여 default 지갑을 엽니다. 지갑은 이미 열려 있고 잠금 해제되어 있습니다. 하지만 지갑이 다시 잠기는 경우 다음 절차를 실행해야 합니다.
cleos wallet open

응답은 다음과 같아야 합니다.

Opened: default
  1. cleos wallet unlock 명령어를 사용하고 my_wallet_password 파일에 저장된 지갑 비밀번호를 전달하여 default 지갑을 잠금 해제합니다.
cleos wallet unlock <my_wallet_password

응답은 다음과 같아야 합니다.

password: Unlocked: default
  1. cleos wallet import 명령어를 사용하여 eosio 비공개 키 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3default 지갑으로 가져옵니다.
cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

응답은 다음과 같아야 합니다.

imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

가져온 비공개 키에 해당하는 공개 키입니다. 기본 지갑 사용에 관한 경고는 무시합니다. 프로덕션 배포에서는 default를 사용하는 대신 지갑 이름을 지정할 수 있습니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. eosio 시스템 계정의 비공개 키를 지갑에 추가

작업 5. EOSIO Contract Development Toolkit(CDT) 설치

EOSIO CDT 툴킷에는 CDT C++ 컴파일러가 포함되어 있으며, 이를 사용하여 시스템 계약을 빌드하고 나중에 자체 C++ 스마트 계약을 빌드할 수 있습니다. 시스템 계약은 추가 기능을 더하고 지원할 수 있는 두 번째 레이어 소프트웨어 기능을 지원하므로 매우 중요합니다.

  1. 먼저 build-essential 패키지를 설치합니다. 이 패키지에는 Linux 박스에서 C/C++ 소프트웨어를 빌드하는 데 필요한 다양한 도구가 포함되어 있습니다.
sudo apt install build-essential
  1. EOSIO CDT 바이너리를 가져옵니다.
curl -LO https://github.com/eosio/eosio.cdt/releases/download/v1.8.1/eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
  1. EOSIO CDT 바이너리를 설치합니다.
sudo apt install ./eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
  1. EOSIO CDT 컴파일러가 설치되어 있는지 확인합니다.
eosio-cpp --version

응답은 EOSIO CDT 컴파일러 버전이어야 합니다.

eosio-cpp version 1.8.1

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. EOSIO Contract Development Toolkit 설치

작업 6. 시스템 계약 및 eosio.boot 빌드

다중 노드 EOSIO 블록체인이 제대로 작동하도록 하려면 EOSIO 시스템 계약을 배포해야 합니다. 시스템 계약은 EOSIO 합의에 필요한 레이어 2 기능, 토큰 스테이킹, 투표, 자체 토큰 생성 등을 제공합니다. 또한 새로운 기능을 지원할 수 있도록 해줍니다.

  1. eosio.contracts 빌드 스크립트에서 사용하는 소프트웨어 종속 항목인 CMake를 설치합니다.
sudo apt install cmake
  1. 최신 시스템 eosio.contracts를 다운로드합니다.
git clone https://github.com/EOSIO/eosio.contracts.git \ --branch release/1.9.x --single-branch
  1. eosio.contracts 시스템을 빌드합니다. 이 단계에서는 eosioeosio.cdt의 설치 디렉터리도 전달해야 합니다.
cd eosio.contracts ./build.sh -e /usr/opt/eosio/2.1.0 -c /usr/opt/eosio.cdt/1.8.1 cd ~

리카르디안 계약 누락에 관한 경고가 표시되면 무시합니다. 다음과 유사한 응답이 표시됩니다(경고 없음).

Using EOSIO.CDT installation at: /usr/opt/eosio.cdt/1.8.1 =========== Building eosio.contracts =========== ... -- Building eosio.contracts v1.9.2 ... -- Unit tests will not be built. To build tests, set BUILD_TESTS to true. -- Configuring done -- Generating done -- Build files have been written to: ./eosio.contracts/build [ 11%] Performing build step for 'contracts_project' [ 18%] Built target eosio.bios [ 18%] Built target eosio.msig [ 36%] Built target powup.results [ 36%] Built target rex.results [ 54%] Built target eosio.token [ 90%] Built target eosio.system [100%] Built target eosio.wrap [ 22%] No install step for 'contracts_project' [ 33%] No test step for 'contracts_project' [ 44%] Completed 'contracts_project' [100%] Built target contracts_project`

EOSIO 시스템 계약이 빌드되는 위치를 기록해 둡니다. 나중에 특정 시스템 계약(~/eosio.contracts/build/contracts)을 배포할 때 필요합니다.

  1. eosio.boot 시스템 계약을 빌드합니다.
git clone https://github.com/EOSIO/eos.git \ --branch release/2.1.x --single-branch cd eos/contracts/contracts/eosio.boot cmake . make cd ~

경고를 무시합니다. 다음과 비슷한 응답이 표시됩니다.

-- Configuring done -- Generating done -- Build files have been written to: ~/eos/contracts/contracts/eosio.boot
  1. eosio.boot 계약이 빌드된 위치를 기록해 둡니다. 나중에 배포해야 합니다(~/eos/contracts/contracts/eosio.boot).

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 시스템 계약 및 eosio.boot 빌드

작업 7. 부팅 노드 시작 및 시스템 계정 만들기

이 작업에서는 부팅 생성 노드를 실행하고 시스템 계정을 만듭니다. 지갑과 달리 계정을 만들려면 블록체인에 트랜잭션을 전송해야 합니다.

따라서 부팅 노드가 실행 중이어야 합니다. 이를 위해 먼저 모든 노드에서 사용할 데이터 디렉터리와 생성 파일을 만들어야 합니다. 프로덕션 환경에서는 모든 노드가 자체 서버에서 호스팅되고 자체 리소스를 사용합니다. 여기서는 모든 노드를 동일한 상자에 배포합니다.

  1. 새 디렉터리 nodes를 만듭니다. 여기에 블록체인 데이터베이스, 로그 파일, 각 노드의 구성 파일이 저장됩니다.
mkdir nodes
  1. nodes 디렉터리에 기본 genesis.json 파일을 만듭니다.
cat >nodes/genesis.json
  1. 다음 JSON 콘텐츠를 복사하여 터미널에 붙여넣고 Enter 키를 누른 다음 Ctrl-D를 눌러 genesis.json 파일을 저장합니다.
{ "initial_timestamp": "2018-06-01T12:00:00.000", "initial_key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", "initial_configuration": { "max_block_net_usage": 1048576, "target_block_net_usage_pct": 1000, "max_transaction_net_usage": 524288, "base_per_transaction_net_usage": 12, "net_usage_leeway": 500, "context_free_discount_net_usage_num": 20, "context_free_discount_net_usage_den": 100, "max_block_cpu_usage": 200000, "target_block_cpu_usage_pct": 1000, "max_transaction_cpu_usage": 150000, "min_transaction_cpu_usage": 100, "max_transaction_lifetime": 3600, "deferred_trx_expiration_window": 600, "max_transaction_delay": 3888000, "max_inline_action_size": 524288, "max_inline_action_depth": 4, "max_authority_depth": 6 }, "initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000" }

'initial_key'는 eosio 계정에서 사용되는 초기 개발 공개 키를 나타냅니다. 여기에서 필요한 경우 자체 개발 키로 재정의할 수 있으며, 이는 프로덕션 배포에 권장됩니다. 이러한 키는 eosio 계정에서 사용하는 지갑에 있어야 합니다. 이 키는 이전 섹션에서 가져왔습니다.

  1. genesis.json 파일이 실제로 생성되고 채워졌는지 확인합니다.
cat nodes/genesis.json

이전 단계와 동일한 콘텐츠가 표시됩니다.

  1. 부팅 노드와 관련된 모든 블록체인 데이터를 저장할 부팅 노드 디렉터리 nodes/00-boot를 만듭니다.
mkdir nodes/00-boot
  1. nodeos 서비스 데몬을 백그라운드 작업으로 시작하고 stdout/stderr00-boot/00.log 파일로 리디렉션하여 부팅 노드를 실행합니다.
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name eosio \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/00-boot/blocks \ --config-dir ~/nodes/00-boot \ --data-dir ~/nodes/00-boot \ --http-server-address 127.0.0.1:8888 \ --p2p-listen-endpoint 127.0.0.1:9876 \ --signature-provider EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 \ >>~/nodes/00-boot/00.log 2>&1 &

이렇게 하면 일부 플러그인이 포함된 부트 노드가 실행됩니다. 생성자 이름은 eosio이고, HTTP 포트 8888, P2P 포트 9876에서 수신 대기하며, 블록 서명에는 기본 개발 키인 EOS6MRy..., 5KQwrP...를 사용합니다. --signature-provider로 재정의하지 않으면 기본 eosio 개발 키가 사용됩니다.

  1. 부팅 노드가 실행 중이고 블록을 생성하는지 확인합니다.
tail -f nodes/00-boot/00.log

출력은 다음과 같이 표시됩니다.

출력:

... info 2021-03-08T02:44:11.900 nodeos producer_plugin.cpp:2333 produce_block ] Produced block e0dc6324ce3c8f35... #588 @ 2021-03-08T02:44:12.000 signed by eosio [trxs: 0, lib: 587, confirmed: 0]

마지막 줄에는 생성된 마지막 블록 번호와 현재 마지막 되돌릴 수 없는 블록(lib)이 표시되며, 이는 최종 블록이자 블록체인의 끝을 나타냅니다.

  1. Ctrl+C를 눌러 tail 프로그램을 종료합니다.

  2. 이제 부팅 노드가 실행 중이므로 체인 데이터베이스에 저장된 eosio 계정에 관한 정보를 확인할 수 있습니다.

cleos get account eosio

응답은 다음과 같아야 합니다.

created: 2018-06-01T12:00:00.000 privileged: true permissions: owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV memory: quota: unlimited used: 2.66 KiB net bandwidth: used: unlimited available: unlimited limit: unlimited cpu bandwidth: used: unlimited available: unlimited limit: unlimited

eosio 계정은 실제로 권한이 있는 계정이며 owneractive 권한과 연결된 키는 지갑으로 가져온 기본 개발 키와 동일한 키입니다. 이렇게 하면 다중 노드 블록체인이 설정될 때 eosio 계정이 트랜잭션을 승인할 수 있습니다.

  1. 추가 시스템 계정을 만듭니다. 이러한 계정도 블록체인 데이터베이스에 저장됩니다.
cleos create account eosio eosio.bpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.msig EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.names EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.ram EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.ramfee EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.saving EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.stake EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.vpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV cleos create account eosio eosio.rex EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

모든 시스템 계정과 owneractive 권한에 동일한 개발 키 쌍을 할당합니다. 프로덕션 배포에서는 보안을 강화하기 위해 각 권한에 다른 키 쌍을 할당하는 것이 좋습니다. 시스템 계정마다 다른 키를 사용할 수도 있습니다.

위 명령어에 대한 응답은 다음과 비슷하게 표시됩니다.

executed transaction: 98f22027c6703e554042b1d4a93beb70b1dc30be0fe65267932155c9d70e6493 200 bytes 153 us # eosio &lt;= eosio::newaccount {"creator":"eosio","name":"eosio.bpay","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfn... warning: transaction executed locally, but may not be confirmed by the network yet ] ... executed transaction: 2f0cb00110374976f3cd9195bccac81fe0ee330c515b4a656d6d41f6181f636d 200 bytes 189 us # eosio &lt;= eosio::newaccount {"creator":"eosio","name":"eosio.rex","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnV... warning: transaction executed locally, but may not be confirmed by the network yet ]

경고를 무시합니다. 다음 작업에서 이 계정을 사용합니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 시스템 계약 및 eosio.boot 빌드

작업 8. eosio.token, eosio.msig 계약 배포 및 SYS 토큰 생성/발행

이 작업에서는 가상의 SYS 토큰을 만들고 발행합니다. 이를 위해 이전에 빌드한 eosio.tokeneosio.msig 시스템 계약도 배포해야 합니다.

  1. eosio.token 계약을 배포합니다. 이 계약을 통해 신규 또는 기존 토큰을 생성, 발행, 이전할 수 있습니다.
cleos set contract eosio.token ~/eosio.contracts/build/contracts/eosio.token/

다음과 비슷한 응답이 표시됩니다.

Reading WASM from ~/eosio.contracts/build/contracts/eosio.token/eosio.token.wasm... Publishing contract... executed transaction: 11aca7fb68e0821cf8f74be0188741964787f830d0918abdfccae4a54c25e291 19360 bytes 4445 us # eosio &lt;= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d010000000180022860000060037f7f7f01... # eosio &lt;= eosio::setabi {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e320008076163636f756e7400010762616c616e63...
  1. eosio.msig 계약을 배포합니다. 이 계약을 통해 계정 간 다중 서명 프로세스가 가능해지고 권한 관리가 간소화됩니다.
cleos set contract eosio.msig ~/eosio.contracts/build/contracts/eosio.msig/

다음과 비슷한 응답이 표시됩니다.

Reading WASM from ~/eosio.contracts/build/contracts/eosio.msig/eosio.msig.wasm... Publishing contract... executed transaction: c2260b7d05bb38d2df097799baedd890ce7560bedbd1b79e7d07e4f6a5b25238 23256 bytes 3684 us # eosio &lt;= eosio::setcode {"account":"eosio.msig","vmtype":0,"vmversion":0,"code":"0061736d0100000001b8022f60000060037f7f7f017... # eosio &lt;= eosio::setabi {"account":"eosio.msig","abi":"0e656f73696f3a3a6162692f312e32001006616374696f6e0004076163636f756e740...
  1. 총 100억 개의 토큰이 분배된 SYS 토큰을 만듭니다.
cleos push action eosio.token create '["eosio", "10000000000.0000 SYS"]' -p eosio.token

위 명령어는 eosio.token 계정의 활성 권한으로 승인된 eosio.token 계약에서 create 작업이 포함된 트랜잭션을 푸시합니다. 다음과 비슷한 응답이 표시됩니다.

executed transaction: 6a4766a00c8fe26343d5eb6c1ad5e53b35064dc6f3a5f55908eff2edba30efca 120 bytes 603 us # eosio.token &lt;= eosio.token::create {"issuer":"eosio","maximum_supply":"10000000000.0000 SYS"}
  1. 보유고에서 SYS 토큰 10억 개를 발행하여 유통시킵니다.
cleos push action eosio.token issue '["eosio", "1000000000.0000 SYS", "memo"]' -p eosio

위 명령어는 eosio 계정의 활성 권한으로 승인된 eosio.token 계약에서 issue 작업이 포함된 트랜잭션을 푸시합니다.

다음과 비슷한 응답이 표시됩니다.

executed transaction: 4613fcff26bc6f96010273b475e839018f0afe2ef2af840d481070c9c54e36f1 128 bytes 405 us # eosio.token &lt;= eosio.token::issue {"to":"eosio","quantity":"1000000000.0000 SYS","memo":"memo"}

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. eosio.token, eosio.msig 계약, SYS 토큰 생성 및 배포

작업 9. 프로토콜 기능 활성화 및 eosio.boot, eosio.system 계약 배포

프로토콜 기능은 EOSIO 블록체인에 추가 선택 기능을 제공합니다. 이 작업에서는 EOSIO 블록체인에 적극 권장되는 일부 프로토콜 기능을 활성화합니다. 이를 위해 먼저 eosio.boot 계약을 배포한 다음 이러한 기능을 활성화합니다. 마지막으로 eosio.system 계약을 배포하여 EOSIO 블록체인의 두 번째 레이어를 완료합니다.

이를 통해 시스템 리소스 (CPU, RAM, NET)를 사용 설정하고, 토큰을 스테이킹 및 언스테이킹하고, 리소스를 구매하고, 잠재적 생성자를 등록하고, 이후에 투표하고, 생성자 보상을 청구하고, 권한 및 한도를 설정하는 등의 작업을 수행할 수 있습니다. 프로토콜 기능은 생성자의 과반수가 EOSIO 합의를 통해 활성화해야 합니다. 이 경우 실행 중인 부팅 노드만 있으면 됩니다.

  1. 먼저 JSON 문자열을 더 읽기 쉬운 형식으로 파싱하기 위해 jq 도구를 설치합니다.
sudo apt install jq
  1. 이제 지원되는 프로토콜 기능을 확인해 보겠습니다.
curl -X POST http://127.0.0.1:8888/v1/producer/get_supported_protocol_features -d '{"exclude_disabled": false, "exclude_unactivatable": false}' | jq | more

위 명령어는 Producer API 플러그인에서 제공하는 get_supported_protocol_features 엔드포인트에 HTTP POST 요청을 보냅니다.

응답에는 현재 EOSIO 네트워크(현재까지는 부팅 노드로 구성된 상태)에서 지원하는 모든 프로토콜 기능이 표시됩니다.

셸 프롬프트가 다시 표시될 때까지 출력을 확인합니다(스페이스바를 여러 번 누름).

출력:

[{"feature_digest": "0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd", "subjective_restrictions": {"enabled": true, "preactivation_required": false, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "64fe7df32e9b86be2b296b3f81dfd527f84e82b98e363bc97e40bc7a83733310", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "PREACTIVATE_FEATURE"}]}, ... {"feature_digest": "ded2e25adcd78cbb94fa7f63a8f80a9af2b1a905e551a6e124e7d7829da1ea02", "subjective_restrictions": {"enabled": true, "preactivation_required": true, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "72ec6337e369cbb33ef7716d3267db9d5678fe54555c25ca4c9f5b9dfb7739f3", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "SECURITY_GROUP"}]}, ... {"feature_digest": "f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d", "subjective_restrictions": {"enabled": true, "preactivation_required": true, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "1eab748b95a2e6f4d7cb42065bdee5566af8efddf01a55a0a8d831b823f8828a", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "GET_SENDER"}]}]
  1. PREACTIVATE_FEATURE 기능을 활성화합니다. 그러면 새로운 기능을 구현할 수 있는 eosio.system 계약의 잠재적 업그레이드를 비롯한 다른 기능을 사용 설정할 수 있습니다. 또한 특정 기능의 기능 다이제스트 또는 해시 코드를 전달하여 프로토콜 기능을 활성화해야 합니다.
curl -X POST http://127.0.0.1:8888/v1/producer/schedule_protocol_feature_activations -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}'

기능 다이제스트 해시코드 0ec7e...는 이전 단계에서 get_supported_protocol_features 엔드포인트가 반환한 feature_digest 필드에서 가져올 수 있습니다. 활성화에 성공하면 응답이 다음과 같이 표시됩니다.

출력:

{"result": "ok"}

기능이 이미 활성화되어 있는 경우에는 다음 응답이 대신 반환되며, 이는 무시해도 됩니다.

출력:

{"code": 500, "message": "Internal Service Error", "error": {"code": 3250000, "name": "protocol_feature_exception", "what": "Protocol feature exception", "details": [{"message": "protocol feature with digest '<hex-value>' has already been activated", "file": "controller.cpp", "line_number": 1650, "method": "check_protocol_features"}]}}
  1. eosio.boot 계약을 배포합니다.
cleos set contract eosio ~/eos/contracts/contracts/eosio.boot/

다음과 비슷한 응답이 표시됩니다.

Reading WASM from ~/eos/contracts/contracts/eosio.boot/eosio.boot.wasm... Publishing contract... executed transaction: a029c644104da357a201f75058fc6772cf63f5fdfa9135be2c3b7c498d81d46d 2752 bytes 852 us # eosio &lt;= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d01000000013e0c60000060027f7f0060017e0060... # eosio &lt;= eosio::setabi {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e32001008616374697661746500010e666561747572655f...
  1. KV_DATABASE, ACTION_RETURN_VALUE 등 추가 프로토콜 기능을 활성화합니다. 이는 eosio.boot 계약을 배포한 후에 수행할 수 있습니다.
# KV_DATABASE cleos push action eosio activate '["825ee6288fb1373eab1b5187ec2f04f6eacb39cb3a97f356a07c91622dd61d16"]' -p eosio # ACTION_RETURN_VALUE cleos push action eosio activate '["c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071"]' -p eosio # CONFIGURABLE_WASM_LIMITS cleos push action eosio activate '["bf61537fd21c61a60e542a5d66c3f6a78da0589336868307f94a82bccea84e88"]' -p eosio # BLOCKCHAIN_PARAMETERS cleos push action eosio activate '["5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4"]' -p eosio # GET_SENDER cleos push action eosio activate '["f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d"]' -p eosio # FORWARD_SETCODE cleos push action eosio activate '["2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25"]' -p eosio # ONLY_BILL_FIRST_AUTHORIZER cleos push action eosio activate '["8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405"]' -p eosio # RESTRICT_ACTION_TO_SELF cleos push action eosio activate '["ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43"]' -p eosio # DISALLOW_EMPTY_PRODUCER_SCHEDULE cleos push action eosio activate '["68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428"]' -p eosio # FIX_LINKAUTH_RESTRICTION cleos push action eosio activate '["e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526"]' -p eosio # REPLACE_DEFERRED cleos push action eosio activate '["ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99"]' -p eosio # NO_DUPLICATE_DEFERRED_ID cleos push action eosio activate '["4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f"]' -p eosio # ONLY_LINK_TO_EXISTING_PERMISSION cleos push action eosio activate '["1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241"]' -p eosio # RAM_RESTRICTIONS cleos push action eosio activate '["4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67"]' -p eosio # WEBAUTHN_KEY cleos push action eosio activate '["4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2"]' -p eosio # WTMSIG_BLOCK_SIGNATURES cleos push action eosio activate '["299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707"]' -p eosio
  1. eosio.system 계약을 배포합니다. 이렇게 하면 두 번째 레이어 기능이 사용 설정되고 단일 노드에서 다중 노드 블록체인으로 전환할 수 있습니다.
cleos set contract eosio ~/eosio.contracts/build/contracts/eosio.system/

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. eosio.boot 및 eosio.system 계약 배포

작업 10. 블록 생성자 계정 만들기

이 작업에서는 최종적으로 EOSIO 블록체인을 인수하고 블록을 생성할 생성자 계정을 만듭니다. 첫 번째 단계는 eosio.msig를 권한이 있는 계정으로 지정하는 것입니다. 이렇게 하면 이 계정이 eosio 계정을 대신하여 승인할 수 있으며, 이후 eosio 계정은 권한을 포기하고 선출된 생성자 그룹을 대표하는 eosio.prods 계정이 블록 생성 및 검증 책임을 인계받게 됩니다.

  1. eosio.msig를 권한이 있는 계정으로 설정합니다.
cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio

다음과 비슷한 응답이 표시됩니다.

executed transaction: 385f0eb3c169898cc7faae46bb4371dbbfc46c5d482249c9933c4f8627fb271c 104 bytes 208 us # eosio &lt;= eosio::setpriv {"account":"eosio.msig","is_priv":1}
  1. SYS 토큰을 버전 0으로 초기화하고 정밀도에 4자리를 할당합니다.
cleos push action eosio init '["0", "4,SYS"]' -p eosio

다음과 비슷한 응답이 표시됩니다.

executed transaction: c537fbd77983104d8dcb1c58b09b433f68a2dd12c876a27b7556d4a722d42939 104 bytes 3467 us # eosio &lt;= eosio::init {"version":0,"core":"4,SYS"} # eosio.token &lt;= eosio.token::open {"owner":"eosio.rex","symbol":"4,SYS","ram_payer":"eosio"}
  1. 생성자가 블록 서명에 사용할 키를 가져옵니다. 프로덕션 배포에서는 이러한 키를 먼저 만든 다음 가져와야 합니다.
cleos wallet import --private-key 5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b cleos wallet import --private-key 5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu cleos wallet import --private-key 5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ cleos wallet import --private-key 5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6

기존 키를 가져오면 이 실습의 리소스 관리가 간소화됩니다. 하지만 프로덕션 배포의 경우 새 키를 만들어야 합니다.

각 명령어의 응답은 다음과 같습니다.

imported private key for: EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz imported private key for: EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC imported private key for: EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 imported private key for: EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d

노드가 분산된 경우 각 키 쌍은 각 서버의 지갑에 독립적으로 저장됩니다. 이 실습에서는 편의를 위해 동일한 지갑에 저장합니다.

  1. 초기 리소스와 공개 키를 사용하여 블록 생성자 계정을 만듭니다.
cleos system newaccount --transfer eosio producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192 cleos system newaccount --transfer eosio producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192 cleos system newaccount --transfer eosio produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192 cleos system newaccount --transfer eosio produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192

위의 명령어를 실행하면 새 계정 producer.one, producer.two, produc.three, produce.four가 생성되고 이전 단계에서 가져온 각 키가 각 계정에 연결됩니다. 또한 NET 및 CPU에 5천만 개의 SYS를 할당 및 스테이킹하고, RAM에 8,000을 할당합니다.

다음과 유사한 응답이 표시됩니다(각 새 계정마다).

executed transaction: 6164d2741433c68edf426d430cb0986b198a6f4c63e7f7a46bcf8343562eacc0 336 bytes 1029 us # eosio &lt;= eosio::newaccount {"creator":"eosio","name":"producer.one","owner":{"threshold":1,"keys":[{"key":"EOS8imf2TDq6FKtLZ8mv... # eosio &lt;= eosio::buyrambytes {"payer":"eosio","receiver":"producer.one","bytes":8388608} # eosio &lt;= eosio::delegatebw {"from":"eosio","receiver":"producer.one","stake_net_quantity":"50000000.0000 SYS","stake_cpu_quantity... # eosio.token &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"} # eosio.token &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"} # eosio &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"} # eosio.ram &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"} # eosio &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"} # eosio.ramfee &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"} # eosio.token &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"} # eosio &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"} # eosio.stake &lt;= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
  1. 새 계정을 생성자로 등록합니다. 각 명령어에는 생성자의 웹 URL도 필요합니다. 설명을 위해 가짜 URL을 사용했습니다.
cleos system regproducer producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz cleos system regproducer producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC cleos system regproducer produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 cleos system regproducer produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d

위 명령어에 대한 응답은 다음과 비슷하게 표시됩니다.

executed transaction: 28ced4a34abd64fb2fc11fbb51d3e4e18d2933a9ab2560fc1c6fb80b0cfc336d 216 bytes 753 us # eosio &lt;= eosio::regproducer {"producer":"producer.one","producer_key":"EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz","u... executed transaction: 06b8be4187c5fbabc3197064ae4c6d55ba553fdbcc8a560f060078e59d5dfc5e 216 bytes 306 us # eosio &lt;= eosio::regproducer {"producer":"producer.two","producer_key":"EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC","u... executed transaction: c23a5164bf0cc1e35dfa3e55fed56e935ceb7d764dbe2e7a3bf4aee446e7d88d 216 bytes 270 us # eosio &lt;= eosio::regproducer {"producer":"produc.three","producer_key":"EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6","u... executed transaction: 081aa8aca08b6d4e8e6bf576b2882f578faa7148e7c550196ff256ab0a9dcca3 216 bytes 224 us # eosio &lt;= eosio::regproducer {"producer":"produce.four","producer_key":"EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d","u...
  1. 현재 생성자 계정을 나열합니다. 총 4개가 있어야 합니다.
cleos system listproducers

응답은 다음과 같아야 합니다.

Producer Producer key Url Scaled votes` **`produc.three`** `EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNj` **`0.0000`** **`produce.four`** `EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8` **`0.0000`** **`producer.one`** `EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8` **`0.0000`** **`producer.two`** `EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuE` **`0.0000`**

아직 투표한 생성자가 없으므로 각 생성자의 득표수는 여전히 0입니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 블록 생성자 계정 만들기

작업 11. 단일 노드 생성자에서 다중 노드 생성자로 전환

이 작업에서는 단일 노드 블록체인에서 다중 노드 블록체인으로 최종 전환합니다. 현재 eosio 계정만 권한이 있으며 블록에 서명할 수 있습니다. 목표는 선출된 생성자들이 관리하는 EOSIO 블록체인을 구축하는 것이며, 2/3 + 1의 과반수 생성자가 블록을 확정하면 합의가 이루어집니다. 그러면 해당 블록 내의 모든 트랜잭션이 확정됩니다.

  1. 나머지 노드 디렉터리 nodes/01-node, nodes/02-node, nodes/03-node, nodes/04-node를 만들어 새 생성 노드 1, 2, 3, 4와 관련된 모든 블록체인 데이터를 저장합니다.
mkdir nodes/01-node nodes/02-node nodes/03-node nodes/04-node
  1. nodeos 서비스 데몬을 백그라운드 작업으로 시작하고 stdout/stderr01-node/01.log 파일로 리디렉션하여 노드 1을 실행합니다.
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name producer.one \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/01-node/blocks \ --config-dir ~/nodes/01-node \ --data-dir ~/nodes/01-node \ --http-server-address 127.0.0.1:8889 \ --p2p-listen-endpoint 127.0.0.1:9877 \ --signature-provider EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz=KEY:5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b \ --p2p-peer-address 127.0.0.1:9876 \ >>~/nodes/01-node/01.log 2>&1 &

이렇게 하면 일부 플러그인이 포함된 노드 1이 실행됩니다. 생성자 이름은 producer.one이고, HTTP 포트 8889, P2P 포트 9877에서 수신 대기하며, 기본 개발 키를 EOS8imf..., 5KLGj1... 등의 자체 키로 재정의하고, P2P 노드 9876(부팅 노드)에 연결됩니다.

  1. 다음 명령어를 실행하여 노드 1 로그에서 부팅 노드(P2P 노드 9876)와 주고받은 메시지가 있는지 검사할 수 있습니다.
cat nodes/01-node/01.log | grep :9876 -C 3

출력은 다음과 비슷하게 표시됩니다.

출력:

info 2021-10-22T21:56:43.161 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block e79c2cc7df2bd7bc... #3040 @ 2021-10-22T21:56:41.500 signed by eosio [trxs: 0, lib: 3039, conf: 0, latency: 1661 ms] ... info 2021-10-22T21:56:43.162 net-1 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync info 2021-10-22T21:56:43.162 net-1 net_plugin.cpp:1132 operator() ] Sending handshake generation 2 to 127.0.0.1:9876- 446609d, lib 3040, head 3041, id 5d69f1fa874933cf info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 3043, blk_num 3043, id b8f3389c52ff416c... info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 3043 target LIB = 3041 next_expected = 3042, id b8f3389c52ff416c..., peer 127.0.0.1:9876 - 446609d info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup info 2021-10-22T21:56:43.164 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 917275dee8c12e57... #3042 @ 2021-10-22T21:56:42.500 signed by eosio [trxs: 0, lib: 3041, conf: 0, latency: 664 ms] ...

노드 1은 아직 블록을 생성하지 않지만 부팅 노드와 같은 다른 노드의 블록을 수신/동기화합니다.

  1. nodeos 서비스 데몬을 백그라운드 작업으로 시작하고 stdout/stderr02-node/02.log 파일로 리디렉션하여 노드 2를 실행합니다.
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name producer.two \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/02-node/blocks \ --config-dir ~/nodes/02-node \ --data-dir ~/nodes/02-node \ --http-server-address 127.0.0.1:8890 \ --p2p-listen-endpoint 127.0.0.1:9878 \ --signature-provider EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC=KEY:5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu \ --p2p-peer-address 127.0.0.1:9876 \ --p2p-peer-address 127.0.0.1:9877 \ >>~/nodes/02-node/02.log 2>&1 &

이렇게 하면 일부 플러그인이 포함된 노드 2가 실행됩니다. 생성자 이름은 producer.two이고, HTTP 포트 8890, P2P 포트 9878에서 수신 대기하며, 기본 개발 키를 EOS8imf..., 5KLGj1... 등의 자체 키로 재정의하고, P2P 노드 9876(부팅 노드) 및 P2P 노드 9877(노드 1)에 연결됩니다.

  1. 다음 명령어를 실행하여 노드 2 로그에서 노드 1(P2P 노드 9877)과 주고받은 메시지가 있는지 검사할 수 있습니다.
cat nodes/02-node/02.log | grep :9877 -C 3

출력은 다음과 비슷하게 표시됩니다.

출력:

info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:9877 - 1a245d2 info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:9877- 1a245d2 info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms] ... info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:9877- 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed... info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:9877 - 1a245d2 info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup ...

노드 2는 아직 블록을 생성하지 않지만 부팅 노드 및 노드 1과 같은 다른 노드의 블록을 수신/동기화합니다.

  1. nodeos 서비스 데몬을 백그라운드 작업으로 시작하고 stdout/stderr03-node/03.log 파일로 리디렉션하여 노드 3을 실행합니다.
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name produc.three \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/03-node/blocks \ --config-dir ~/nodes/03-node \ --data-dir ~/nodes/03-node \ --http-server-address 127.0.0.1:8891 \ --p2p-listen-endpoint 127.0.0.1:9879 \ --signature-provider EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6=KEY:5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ \ --p2p-peer-address 127.0.0.1:9876 \ --p2p-peer-address 127.0.0.1:9877 \ --p2p-peer-address 127.0.0.1:9878 \ >>~/nodes/03-node/03.log 2>&1 &

이렇게 하면 일부 플러그인이 포함된 노드 3이 실행됩니다. 생성자 이름은 produc.three이고, HTTP 포트 8891, P2P 포트 9879에서 수신 대기하며, 기본 개발 키를 EOS5n44..., 5JCStv... 등의 자체 키로 재정의하고 P2P 노드 9876(부팅 노드), P2P 노드 9877(노드 1), P2P 노드 9878(노드 2)에 연결됩니다.

  1. 다음 명령어를 실행하여 노드 3 로그에서 노드 2(P2P 노드 9878)와 주고받은 메시지가 있는지 검사할 수 있습니다.
cat nodes/03-node/03.log | grep :9878 -C 3

출력은 다음과 비슷하게 표시됩니다.

출력:

info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:`**`9878`** `- 1a245d2` info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:`**`9878`** `- 1a245d2` info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms] ... info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:`**`9878`** `- 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed... info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:`**`9878`** `- 1a245d2 info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup ...

노드 3은 아직 블록을 생성하지 않지만 부팅 노드 및 노드 1 및 2와 같은 다른 노드의 블록을 수신/동기화합니다.

  1. nodeos 서비스 데몬을 백그라운드 작업으로 시작하고 stdout/stderr04-node/04.log 파일로 리디렉션하여 노드 4를 실행합니다.
nodeos \ --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \ --contracts-console \ --max-transaction-time=200 \ --chain-state-db-size-mb 1024 \ --enable-stale-production \ --producer-name produce.four \ --genesis-json ~/nodes/genesis.json \ --blocks-dir ~/nodes/04-node/blocks \ --config-dir ~/nodes/04-node \ --data-dir ~/nodes/04-node \ --http-server-address 127.0.0.1:8892 \ --p2p-listen-endpoint 127.0.0.1:9880 \ --signature-provider EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d=KEY:5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6 \ --p2p-peer-address 127.0.0.1:9876 \ --p2p-peer-address 127.0.0.1:9877 \ --p2p-peer-address 127.0.0.1:9878 \ --p2p-peer-address 127.0.0.1:9879 \ >>~/nodes/04-node/04.log 2>&1 &

이렇게 하면 일부 플러그인이 포함된 노드 4가 실행됩니다. 생성자 이름은 produce.four이고, HTTP 포트 8892, P2P 포트 9880에서 수신 대기하며, 기본 개발 키를 EOS5y3T..., 5JJjaK... 등의 자체 키로 재정의하고 P2P 노드 9876(부팅 노드), P2P 노드 9877(노드 1), P2P 노드 9878(노드 2), P2P 노드 9879(노드 3)에 연결됩니다.

  1. 다음 명령어를 실행하여 노드 4 로그에서 노드 3(P2P 노드 9879)과 주고받은 메시지가 있는지 검사할 수 있습니다.
cat nodes/04-node/04.log | grep :9879 -C 3

응답은 다음과 비슷하게 표시됩니다.

info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:9879 - 1a245d2 info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:9879 - 1a245d2 info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms] ... info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:9879 - 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed... info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:9879 - 1a245d2 info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup ...

노드 4는 아직 블록을 생성하지 않지만 부팅 노드 및 노드 1, 2, 3과 같은 다른 노드의 블록을 수신/동기화합니다.

이때 모든 새 노드 1, 2, 3, 4가 실행되고 연결됩니다. 부팅 노드에서 생성한 블록을 수신하고 동기화하지만 아직 생성하지는 않습니다. 생성하려면 새 생성자를 선출해야 합니다. 프로덕션 배포에서 사용자는 일반적으로 투표 명령어에서 후보 생성자 풀의 최대 30명의 생성자에게 투표합니다. 상위 21명의 생성자가 블록 생성자로 선출됩니다.

여기에서 기존 생성자 계정을 사용하여 사용 가능한 생성자 4명만 선출합니다. SYS 토큰 공급량의 15% 가 스테이킹되면 선출된 상위 생성자가 프로덕션에 제안됩니다. 생성자 목록이 포함된 블록이 확정되고 최종 상태가 되면 새 생성자가 예정된 다음 라운드에 블록을 생성하기 시작합니다.

  1. cleos system voteproducer prods 명령어를 사용하여 특정 생성자에게 투표합니다. producer.one 계정은 자신과 생성자 2, 3, 4에게 투표합니다. producer.two는 자신과 생성자 3, 4에게 투표합니다. produc.threeproduce.four의 경우 produc.three는 자신과 produce.four에게 투표하고, produce.four는 자신에게 투표합니다.
cleos system voteproducer prods producer.one producer.one producer.two produc.three produce.four cleos system voteproducer prods producer.two producer.two produc.three produce.four cleos system voteproducer prods produc.three produc.three produce.four cleos system voteproducer prods produce.four produce.four

응답은 다음과 비슷하게 표시됩니다.

executed transaction: 833178bdc9d5b8c86778fa2b2c0f20e976f4c253cb6ebcaa6ade8eb8bf3d0a4f 144 bytes 861 us # eosio &lt;= eosio::voteproducer {"voter":"producer.one","proxy":"","producers":["produc.three","produce.four","producer.one","produc... executed transaction: 9c4961678017bfc2a7fd1398a2e4b33e472a6cadc0340400ebe9207e188d7692 136 bytes 379 us # eosio &lt;= eosio::voteproducer {"voter":"producer.two","proxy":"","producers":["produc.three","produce.four","producer.two"]} executed transaction: d3d23bae8730f18e82da53defaff7184c49b83181bb9b6fa32096684e61ed74d 128 bytes 371 us` # eosio &lt;= eosio::voteproducer {"voter":"produc.three","proxy":"","producers":["produc.three","produce.four"]} executed transaction: 95f63d46554dd436388e36b017b8e350514ef5b407b1c33c5779dc29c862cdb6 120 bytes 304 us` # eosio &lt;= eosio::voteproducer {"voter":"produce.four","proxy":"","producers":["produce.four"]}
  1. 각 생성자의 득표율을 확인합니다.
cleos system listproducers

위 명령어에 대한 응답은 다음과 같이 표시됩니다.

Producer Producer key Url Scaled votes produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8 0.4000 produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNj 0.3000 producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuE 0.2000 producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8 0.1000

생성자 1이 10%, 생성자 2가 20%, 생성자 3이 30%, 생성자 4가 40%의 득표율을 기록했습니다. 모든 생성자가 스테이킹한 SYS 토큰의 총수가 토큰 공급량의 15%를 초과하므로 상위 21명의 생성자(기본값)가 블록 생성자로 제안됩니다.

블록 생성자 목록이 포함된 블록이 최종 확정된 후에 프로덕션 자체가 시작됩니다. 생성자가 4명뿐이므로 모두 생성하며 3명만 있어도 과반수가 됩니다.

  1. 새 생성자가 실제로 블록을 생성하는지 확인합니다.
tail -f nodes/01-node/01.log | grep Produced

위 명령어는 생성자 1이 생성한 마지막 블록을 표시해야 합니다. 아직 출력이 표시되지 않으면 잠시 기다려 주세요. 각각 6초마다 12개의 블록을 생성하는 생성자가 4명 있습니다. 따라서 마지막으로 블록이 생성된 시간과 다음 라운드의 첫 번째 블록이 생성된 시간의 간격은 18초입니다.

응답은 다음과 비슷하게 표시됩니다.

info 2021-10-28T15:31:47.904 nodeos producer_plugin.cpp:2333 produce_block ] Produced block adeb43a9249e0ef8...` **`#7035`** `@ 2021-10-28T15:31:48.000 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 36] info 2021-10-28T15:31:48.400 nodeos producer_plugin.cpp:2333 produce_block ] Produced block 991c7f7addb6006e...` **`#7036`** `@ 2021-10-28T15:31:48.500 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0] ... info 2021-10-28T15:31:52.901 nodeos producer_plugin.cpp:2333 produce_block ] Produced block c947dfab144600f7...` **`#7045`** `@ 2021-10-28T15:31:53.000 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0] info 2021-10-28T15:31:53.300 nodeos producer_plugin.cpp:2333 produce_block ] Produced block c871f71b3ebe9151...` **`#7046`** `@ 2021-10-28T15:31:53.500 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0]`

18초 더 기다리면 다음 라운드에 12개 블록이 생성되는 것을 확인할 수 있습니다. 위 명령어에서 0102, 03, 04로 바꿔서 다른 세 노드에서 실제로 블록을 생성하는지 확인할 수도 있습니다.

  1. Ctrl+C를 눌러 tail 명령어를 종료합니다.

  2. 부팅 노드가 더 이상 블록을 생성하지 않는지 확인합니다.

tail -f nodes/00-boot/00.log | grep Produced

위 명령어는 출력을 생성하지 않아야 합니다. 이는 부팅 노드가 선출된 새 생성자에게 블록 생성을 양도했음을 보여줍니다.

이제 생성자가 4명인 완전히 작동하는 블록체인이 있으므로 기본 eosio 및 관련 eosio.* 계정에서 트랜잭션에 서명하고 블록체인의 상태를 수정할 수 있는 권한을 삭제해야 합니다. 이를 위해 eosioeosio.* 계정에서 사용하는 키를 null로 재설정하여 포기해야 합니다.

  1. eosio 계정 정보를 가져옵니다. owneractive 권한과 연결된 키를 확인합니다.
cleos get account eosio

응답은 다음과 비슷하게 표시됩니다.

created: 2018-06-01T12:00:00.000 privileged: true permissions: owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV memory: quota: unlimited used: 2.989 MiB net bandwidth: used: unlimited available: unlimited limit: unlimited cpu bandwidth: used: unlimited available: unlimited limit: unlimited SYS balances: liquid: 599999509.0258 SYS staked: 0.0000 SYS unstaking: 0.0000 SYS total: 599999509.0258 SYS
  1. eosio 계정에서 사용하는 키를 포기하고 권한을 eosio.prods 계정에 연결합니다.
cleos push action eosio updateauth '{"account": "eosio", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@owner cleos push action eosio updateauth '{"account": "eosio", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@active cleos get account eosio

응답은 다음과 비슷하게 표시됩니다.

created: 2018-06-01T12:00:00.000 privileged: true permissions: owner 1: 1 eosio.prods@active active 1: 1 eosio.prods@active `memory: quota: unlimited used: 2.989 MiB net bandwidth: used: unlimited available: unlimited limit: unlimited cpu bandwidth: used: unlimited available: unlimited limit: unlimited SYS balances: liquid: 599999509.0258 SYS staked: 0.0000 SYS unstaking: 0.0000 SYS total: 599999509.0258 SYS

eosio 계정에는 더 이상 owneractive 권한과 연결된 기본 개발 키가 없습니다. 이제 권한은 상위 eosio.prods@active 권한의 하위 권한입니다. 이는 모든 활성 블록 생성자를 나타내는 동일한 계정 그룹입니다.

따라서 이제 eosio 계정은 기본적으로 eosio.prods 계정에서 제어합니다.

  1. eosio.* 계정에서 사용하는 키를 포기하고 권한을 eosio 계정에 연결합니다.
cleos push action eosio updateauth '{"account": "eosio.bpay", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.bpay@owner cleos push action eosio updateauth '{"account": "eosio.bpay", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.bpay@active cleos push action eosio updateauth '{"account": "eosio.msig", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.msig@owner cleos push action eosio updateauth '{"account": "eosio.msig", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.msig@active cleos push action eosio updateauth '{"account": "eosio.names", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.names@owner cleos push action eosio updateauth '{"account": "eosio.names", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.names@active cleos push action eosio updateauth '{"account": "eosio.ram", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ram@owner cleos push action eosio updateauth '{"account": "eosio.ram", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ram@active cleos push action eosio updateauth '{"account": "eosio.ramfee", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ramfee@owner cleos push action eosio updateauth '{"account": "eosio.ramfee", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ramfee@active cleos push action eosio updateauth '{"account": "eosio.saving", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.saving@owner cleos push action eosio updateauth '{"account": "eosio.saving", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.saving@active cleos push action eosio updateauth '{"account": "eosio.stake", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.stake@owner cleos push action eosio updateauth '{"account": "eosio.stake", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.stake@active cleos push action eosio updateauth '{"account": "eosio.token", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.token@owner cleos push action eosio updateauth '{"account": "eosio.token", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.token@active cleos push action eosio updateauth '{"account": "eosio.vpay", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.vpay@owner cleos push action eosio updateauth '{"account": "eosio.vpay", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.vpay@active cleos push action eosio updateauth '{"account": "eosio.rex", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.rex@owner cleos push action eosio updateauth '{"account": "eosio.rex", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.rex@active

이제 eosio.* 계정에는 더 이상 owneractive 권한과 연결된 기본 개발 키가 없습니다. 대신 권한은 이제 상위 eosio@active 권한의 하위 권한이고, 이 권한은 eosio.prods@active 계정의 하위 권한입니다.

따라서 이제 eosio를 포함한 모든 시스템 계정은 기본적으로 모든 활성 블록 생성자의 계정 그룹을 나타내는 eosio.prods 계정에서 제어합니다. 이제 완전히 작동하는 다중 노드 EOSIO 블록체인이 빌드되었습니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. 단일 노드 생성자에서 다중 노드 생성자로 전환

수고하셨습니다

이 실습에서는 이전에 배포된 단일 노드 EOSIO 블록체인을 다중 블록체인 네트워크로 확장했습니다. 또한 다중 노드 EOSIO 블록체인을 설정하기 위해 다양한 EOSIO 소프트웨어 구성요소를 설치했습니다. 마지막으로 새 EOSIO 블록체인에서 노드 운영자 작업을 실행했습니다.

다음 단계/더 학습하기

Google Cloud 교육 및 자격증

Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.

설명서 최종 업데이트: 2024년 12월 12일

실습 최종 테스트: 2024년 10월 22일

Copyright 2026 Google LLC. All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.

시작하기 전에

  1. 실습에서는 정해진 기간 동안 Google Cloud 프로젝트와 리소스를 만듭니다.
  2. 실습에는 시간 제한이 있으며 일시중지 기능이 없습니다. 실습을 종료하면 처음부터 다시 시작해야 합니다.
  3. 화면 왼쪽 상단에서 실습 시작을 클릭하여 시작합니다.

시크릿 브라우징 사용

  1. 실습에 입력한 사용자 이름비밀번호를 복사합니다.
  2. 비공개 모드에서 콘솔 열기를 클릭합니다.

콘솔에 로그인

    실습 사용자 인증 정보를 사용하여
  1. 로그인합니다. 다른 사용자 인증 정보를 사용하면 오류가 발생하거나 요금이 부과될 수 있습니다.
  2. 약관에 동의하고 리소스 복구 페이지를 건너뜁니다.
  3. 실습을 완료했거나 다시 시작하려고 하는 경우가 아니면 실습 종료를 클릭하지 마세요. 이 버튼을 클릭하면 작업 내용이 지워지고 프로젝트가 삭제됩니다.

현재 이 콘텐츠를 이용할 수 없습니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

감사합니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

한 번에 실습 1개만 가능

모든 기존 실습을 종료하고 이 실습을 시작할지 확인하세요.

시크릿 브라우징을 사용하여 실습 실행하기

이 실습을 실행하는 가장 좋은 방법은 시크릿 모드 또는 시크릿 브라우저 창을 사용하는 것입니다. 개인 계정과 학생 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.

실습을 시작하려면 이 간단한 단계를 완료하세요.