ZYCORD 문서
한국어
Zycord문서채굴

채굴

이미 여러분 컴퓨터에 들어 있는 프로세서에서 RandomX로 하는 작업증명. 경쟁해야 할 ASIC 농장도 없고 프리마인도 없습니다 — 코인은 채굴에서 나오며, 다른 어디에서도 나오지 않습니다.

전부#

# A payout address. The node never sees the key behind it.
zcd wallet new --out miner.json

# Mine to it.
zycordd --testnet --dir ./testnet \
  --mine --payout $(zcd wallet address --key miner.json)

공개 testnet과 mainnet에서는 그것이 -randomx 바이너리 — zcd-randomx와 zycordd-randomx입니다. 이 태그 없이 빌드된 바이너리는 개발용 엔진으로 되돌아가는 대신 시작을 거부합니다. 설치를 보세요.

언제든 원할 때 시작하세요#

네트워크의 첫 블록이 예정된 시각보다 먼저 시작된 노드는 일찍 채굴하지 않으며, 그 시각에 맞춰 다시 시작할 필요도 없습니다. 노드는 자기 시계가 아직 도달하지 않은 타임스탬프를 가진 블록 만들기를 거부하고, 기다리다가, 스스로 시작합니다. 기다리는 동안 어떤 시각을 기다리고 있는지, 얼마나 남았는지 함께 알려 줍니다.

waiting to mine: the next block cannot be dated before 2026-10-01T00:00:01Z
(unix 1790812801), and this node's clock reads 2026-09-30T20:12:31Z - 3h47m30s
to wait. Leave this running: mining starts on its own and there is nothing to
restart or reconfigure.

이는 실행을 거부하는 것이 아니라 채굴을 거부하는 것입니다. 노드는 그동안 내내 피어와 연결되고, 동기화하며, RPC를 제공합니다. 긴 기다림이 멈춘 것처럼 보이지 않도록 이 메시지는 10분마다 반복됩니다.

이 말이 그치지 않는다면, 시계가 틀린 것입니다

기다림은 이 컴퓨터의 시계를 기준으로 계산되므로, 며칠 뒤처지게 맞춰진 시계는 며칠을 기다립니다. 다른 무엇을 확인하기 전에 시계부터 확인하세요.

이 거부는 시작 시각을 공개하는 것이 애초에 안전한 이유이기도 합니다. 이것이 없던 시절 채굴기는 대신 헤더의 날짜를 중앙값 하한까지 앞당겨 적었는데, 제네시스 블록 이전에 그 하한은 genesis_time 자신이었습니다 — 그래서 일찍 시작하면 아무도 판단할 수 없는 사설 체인이 만들어졌고, 난이도 규칙이 선언된 풀이 시간을 재기 때문에, 실제로 흐른 시간과 아무 상관 없는 간격을 근거로 목표값이 블록마다 단단해지는 체인이 되었습니다. 그렇게 되는 데 누가 부정직할 필요는 없었습니다. 밤새 켜 두기만 해도 그렇게 되었습니다.

지급 주소는 반드시 영구 주소여야 합니다#

지급 주소는 반드시 영구 주소(0x02)여야 합니다 — zcd wallet address는 기본으로 그런 주소를 출력합니다 — 그리고 zycordd는 경고에 그치지 않고 그 밖의 것을 거부합니다. 노드는 그 주소를 통제하는 키를 결코 보지 못하며, 원한다 해도 보상을 지출할 수 없습니다.

일회성 지급 주소가 왜 소리 없이 돈을 잃게 하는가

일회성(0x01) 지급 주소는 거기서 한 번 지출하기 전까지는 아무 문제 없이 채굴됩니다. 그 차변이 주소를 영원히 사용된 것으로 표시하고, 폴드(fold)는 바로 그 블록부터 그 주소로 향하는 모든 성숙 중인 보상을 소각합니다 — 성숙 링은 그 블록의 인증서(certificate)들이 반영된 뒤에 돌아가므로, 지출이 담긴 블록이 이미 돈을 잃는 첫 블록이고, 최근 coinbase_maturity 블록 중 아직 링에 남아 있는 것들도 함께 사라집니다.

오류는 아무것도 나지 않습니다. 유일한 흔적은 그 노드 자신의 블록 로그 줄에 있습니다. matured=0은 평범하게 비어 있는 링 슬롯도 똑같이 출력하는 값이고, burned=는 평소 보고하던 기본 수수료와 건너뜀(skip) 수수료 옆에서 생산자 몫 전체를 소리 없이 흡수해 버린 값입니다. 어느 필드도 "coinbase"라고 말하지 않습니다. 영구 주소는 사용된 주소 레지스트리에 아예 들어갈 수 없으므로, 이 실패는 좁혀지는 것이 아니라 제거됩니다 — 지갑 규칙 3을 보세요.

coinbase 성숙 기간#

보상은 coinbase_maturity 블록이 지난 뒤에 성숙합니다 — mainnet과 공개 testnet 모두 100입니다. 그때까지 보상은 상태에서는 보이지만 지출할 수 없으며, 이것이 프리마인 없는 체인에서 첫 예치금을 대는 방식입니다. 대략 첫 백 블록 동안은 채굴자만 거래할 수 있습니다.

mainnet에는 faucet이 없고 앞으로도 없을 것이므로, mainnet에서는 그 진입 구간이 배분의 전부입니다. 즉, 참여하려면 채굴해야 합니다. 공개 testnet에는 faucet이 있으며, 그 위의 다른 모든 것과 마찬가지로 채굴로 자금이 조달됩니다. 코인이 아무런 가치도 없는 네트워크는 누군가 채굴기를 시험해 보기 전에 지갑을 먼저 시험해 보게 해 준다고 해서 잃는 것이 없기 때문입니다.

운영 비용#

작업 함수는 설정이 아니라 합의 파라미터입니다. zcd params가 이를 출력합니다.

proof of work    randomx-v1 (re-keyed every 2048 blocks, 64-block lag)

메모리#

검증에는 보유한 키 에포크당 약 256 MiB가 필요하며, 키 경계를 넘나드는 재구성이 블록마다 재구축을 일으키지 않도록 테이블은 두 개를 보유합니다. 그 테이블보다 넉넉하게 예산을 잡으세요. 테이블이 상한이 아니기 때문입니다. 캐시는 할당되는 순간부터 메모리에 상주하고 캐시를 비싸게 만드는 Argon2 채우기는 그 뒤에 옵니다 — 그래서 만들어지는 동안 최대 두 개가 더 살아 있게 됩니다 — 또한 아직 무언가가 사용 중인 상태에서 밀려난 항목은 그 사용자가 놓아 줄 때까지 갖고 있던 것을 그대로 유지하는데, 채굴기가 데이터셋을 채우는 동안 바로 그렇게 합니다.

역할예산이유
검증 노드엔진에 약 1 GiB두 항목짜리 테이블에 대한 최대 캐시 사용량은 두 효과가 동시에 일어날 때 1280 MiB로 측정되었습니다 — 테이블이 시사하는 512 MiB가 아닙니다.
채굴 노드약 3.3 GiB여기에 더해 약 2 GiB의 데이터셋을 할당하며, 채우는 동안 사용자를 붙잡아 두는 바로 그 경우입니다.

여유롭게 검증할 수 있는 컴퓨터라고 해서 반드시 채굴할 수 있는 것은 아닙니다.

스레드#

--mine-threads의 기본값은 코어당 하나입니다. 유효성에 관해서는 아무것도 바꾸지 않으며, 이 노드가 얼마나 빨리 해를 찾는지에만 관계합니다.

키 교체 때 일어나는 일#

작업 함수는 randomx_key_interval 블록마다 다시 키잉됩니다. 채굴 노드는 그때 약 2 GiB의 데이터셋을 재구축하며 재구축하는 동안 채굴을 멈춥니다 — 대략 10초 정도이고 컴퓨터에 따라 다릅니다. 여러분 컴퓨터의 값은 로그의 첫 경계에서 직접 측정하세요.

그동안에도 검증은 계속됩니다. 재구축이 검증을 멈춰 세울 수는 없습니다. 지금 채굴 중인 것이 아닌 다른 키 에포크의 헤더는 그 에포크 자신의 256 MiB 캐시로 검증되며, 데이터셋은 그 캐시를 건드리지 않습니다. 둘은 동일한 다이제스트를 계산하므로, 재구축이 검증에 만드는 차이는 속도뿐입니다. 다음 에포크의 캐시는 그 에포크의 마지막 randomx_key_lag 블록 동안 미리 데워집니다.

네트워크randomx_key_interval채굴 멈춤, 대략
mainnet2048 블록약 17시간마다 한 번
공개 testnet512 블록약 4시간마다 한 번

testnet의 더 짧은 간격은 의도된 것입니다. 그 경계를 더 자주 예행 연습하는 것이 이 네트워크가 측정하려고 존재하는 것의 일부입니다. 다음 에포크의 데이터셋을 미리 만들어 두는 것도 가능하고 — 키는 높이에서 나오므로 경계보다 훨씬 전에 알 수 있습니다 — 의도적으로 그렇게 하지 않습니다. 그렇게 하면 채굴자에게 하루에 몇 초의 비용밖에 들지 않는 멈춤을 아끼려고 데이터셋 두 개, 즉 4 GiB를 들고 있어야 하기 때문입니다.

채굴 노드 멈추기#

SIGTERM(또는 Ctrl-C)이 노드를 멈추며, 즉시 멈춥니다. 신호 하나가 마침 채널에서 대기 중이던 루프 하나가 아니라 모든 루프에 도달합니다.

키 교체 도중에 도착한 정지 요청은 데이터셋 채우기가 끝나기를 기다립니다 — 해시 호출이 아직 읽고 있는 동안에는 엔진이 약 2 GiB짜리 버퍼를 놓아주지 않으며, 그렇게 하면 어떤 Go 도구도 보고해 주지 않을 C의 use-after-free가 되기 때문입니다. 이것은 고정된 사건과 경합하는 기다림이 아니라 그 사건을 기다리는 기다림입니다. 열 번의 실행에서 측정한 결과, 신호가 아무리 일찍 도착해도 종료 시각은 움직이지 않았고 기다리는 시간만 4.5초에서 0.7초로 줄었으며, SIGSEGV는 한 번도 나지 않았습니다.

그러니 정지 타임아웃은 여러분 컴퓨터의 채우기 시간보다 넉넉하게 잡으세요. 두 번째 SIGTERM은 기다리지 않습니다 — 첫 번째 신호가 신호 처리를 운영체제에 되돌려 주므로, 그 멈춤 동안 Ctrl-C를 다시 누르면 프로세스가 즉시 죽습니다.

채굴 풀, 그리고 왜 하나도 없는가#

출시 시점에 존재하는 풀은 없고, 공식 풀도 없습니다. 노드는 기본 상태로 단독 채굴을 하며, 제네시스 블록의 난이도에서는 그것이 합리적인 진입 방법입니다. 풀이 나타난다면 그것은 제3자이니, 어디서든 적용할 만한 회의를 그대로 적용하세요.

봇넷, 부인하지 않고 명시하기#

CPU 채굴은 봇넷을 불러들입니다. CPU로 채굴 가능한 모든 코인이 봇넷과 싸워 왔고, 이 프로젝트도 예외이리라 기대하지 않습니다. 이 절충은 눈을 뜬 채 받아들인 것입니다. 봇넷으로 기울어진 배분이라 해도 판매로 결정된 배분보다는 여전히 넓고, 이미 갖고 있는 노트북을 경쟁력 있게 유지하는 것이 RandomX가 존재하는 이유 전부입니다.

동작 지켜보기#

testnet 익스플로러는 모든 블록과 모든 인증서(certificate)를 표시하며, 다른 어떤 체인의 익스플로러도 표시할 수 없는 화면까지 보여 줍니다. 각 인증서가 적용되었는지, 아니면 건너뜀(skip) 처리되어 청구되었는지, 그리고 어떤 선언된 읽기가 더 이상 성립하지 않게 되었는지 말입니다. 여러분 자신의 노드도 /status, /head, /metrics에서 같은 질문에 답합니다 — 읽기 전용 표면을 보세요.