# Locus Chain — Full Documentation
> This file contains the full text of the Locus Chain documentation, concatenated for LLM/AI consumption. It covers how Locus Chain works (architecture, dynamic sharding, BFT/PoS consensus, ledger, smart contracts/VME) as well as practical guides (wallet, node install/run, developer library usage) and API references. Source: https://docs.testnet2.locuschain.com
---
# 로커스체인 소개
Source: https://docs.testnet2.locuschain.com/docs/introduction/
# 로커스체인 소개
### 로커스 체인 개발자 홈페이지에 오신 것을 환영합니다
저희 개발자 홈페이지를 방문해 주셔서 감사합니다. 로커스 체인의 혁신적인 기술을 제대로 이해하시려면 이 메시지를 먼저 읽어 보시기 바랍니다. 읽으신 후에 이 사이트의 다른 섹션을 자유롭게 둘러봐 주시면 감사하겠습니다.
여기서는 블록체인으로 은행의 지급결제업무에 대신하는 절차와 로커스체인이 적용되었을 때의 수행과정을 예를 들어 설명드려 본 것입니다.
### 로커스 체인으로 은행 결제 시스템을 구성해 보기
블록체인 기술로 은행이 담당하는 기존의 지급 결제 및 정산 시스템을 대체할 수 있다는 발상은 매우 매력적입니다. Locus Chain이 이를 어떻게 실현할 수 있는지 살펴보겠습니다.
### 기존 은행 결제 시스템은 어떻게 작동하나요?
은행은 중앙화된 시스템을 통해 고객의 예금 및 거래 데이터를 관리합니다. 각 고객의 계좌 데이터는 은행 서버에 저장되어 있으며, 이를 통해 즉각적인 송금이 가능합니다.
1. 결제 최종성(Finality of Payment): 송금이 이루어지면 은행은 송금자의 계좌에서 금액을 차감하고, 수신자의 계좌에 해당 금액을 즉시 입금합니다. 이 과정은 몇 초 안에 완료되며, 수신자는 자금을 즉시 사용할 수 있습니다.
2. 확장성(Scalability): 중앙화된 시스템은 높은 트랜잭션 볼륨을 효율적으로 처리할 수 있습니다. 충분히 강력한 서버를 갖춘 경우, 트랜잭션 증가에도 성능 저하 없이 원활히 운영됩니다.
이 중앙집중화된 방식은 속도와 신뢰성을 모두 보장하며, 이는 블록체인이 현대 시스템에서 실질적이고 경쟁력 있는 대안으로 자리잡기 위해서는 이에 버금갈 수 있게 구현해야 합니다.
### 블록체인으로 동일한 성능을 구현하는 데 따른 도전 과제
블록체인으로 은행 시스템을 대체하려는 시도는 블록체인 방식이기에 생겨나는 문제들에 직면하게 됩니다:
• 합의 메커니즘(Consensus Mechanism): 블록체인 네트워크는 모든 참여자가 거래를 검증하고 합의를 이루어야 하며, 이는 네트워크 크기가 증가할수록 속도가 느려질 수 있습니다.
• 네트워크 통신(Network Communication): 거래 검증은 노드 간의 대규모 통신을 요구하며, 참여자가 많아질수록 인터넷 인프라에 과부하를 줄 수 있습니다.
• 분산 스토리지(Distributed Storage): 블록체인은 모든 거래 데이터를 모든 참여자에게 저장합니다. 시간이 지남에 따라 분산 원장은 커지며, 스토리지 비용이 급증하게 됩니다.
이러한 문제들로 인해, 블록체인이 은행 시스템을 대체할 경우 합의 지연, 네트워크 과부하, 저장 비용 증가와 같은 장애 요소가 발생합니다. 또한, 블록체인의 구조에 따라 결제의 최종성이 보장되지 않아 송금된 금액을 즉시 사용하는 것이 어려운 경우가 대부분입니다.
### 로커스 체인이 이러한 문제를 해결하는 방법
로커스 체인은 독창적인 기술을 통해 이러한 문제를 해결하며, 중앙화된 시스템과 견줄 수 있는 성능을 제공합니다.
• 거의 즉시 완료되는 거래(Finality): 개별 거래는 몇 초 안에 처리되며, 결제는 즉시 완료됩니다. 이는 빠른 자금 집행이 중요한 일상 경제 활동에 적합합니다.
• 손실 없는 확장성(Scalability Without Compromise): 로커스 체인은 DAG-AWTC(계정 단위 트랜잭션 체인)와 BFT(비잔틴 장애 허용) 합의 알고리즘을 결합하여 높은 트랜잭션 처리량을 효율적으로 지원합니다. 사용자가 증가하더라도 속도나 보안을 저해하지 않고 무한한 확장성을 구현하는 토대의 핵심입니다. 이 기술은 Network Bandwidth 과부하를 해결하게 하는 로커스체인이 자체 개발한 다이나믹샤딩(Dynamic Sharding) 기술의 적용이 가능하게 한 핵심적인 기술이기도 합니다.
• 비용 효율성(Cost Efficiency): 로커스 체인은 노드의 부담을 줄이도록 최적화된 합의 및 원장 시스템을 갖추고 있어, 분산 결제에 있어 비용 효율적인 솔루션을 제공합니다.
로커스 체인의 DAG-AWTC 및 BFT 기술은 자체 개발되어 특허를 획득했으며, Dynamic Sharding 기술은 8건의 특허 중 4건이 이미 승인되었습니다. 이러한 혁신은 확장성과 효율성을 해결하려는 로커스 체인의 선도적인 성과를 보여줍니다.
Locus Chain은 전 세계에서 손에 꼽힐 정도로 저비용으로 거의 즉각적인 결제의 최종성을 달성할 수 있는 몇 안 되는 퍼블릭 블록체인입니다.
이렇게 실생활에 적용 가능한 수준으로 끌어 올리기 위해 로커스체인은 (1) 거래의 합의 및 블록 생성, (2) 네트워크 밴드위드, (3) 노드의 데이터 저장까지, 블록체인으로 기존의 서버 기반 서비스를 대체하고자 심혈을 기울여 디자인하고 이를 전산으로 구현하였습니다.
지금까지 로커스체인으로 은행의 지급결제 시스템을 대체하는 과정에 대해 설명을 드렸습니다. 그런데 이렇게 개발된 로커스체인은 여러 산업 영역을 넘나들며 기존 퍼블릭 블록체인 기술들이 시도하였으나 확장성 및 속도 면에서 실용성을 확보하지 못했던 다양한 분야에서 실용성을 증명하며 그 대안으로 자리매김하고 있습니다.
### 로커스 체인의 실제 적용 사례
결제 시스템 혁신을 넘어, 로커스 체인의 기술은 다양한 산업에 적용 가능하며, 기존 블록체인이 직면한 한계를 극복합니다. 이들에 대해서는 따로 설명 자료를 올려드리겠지만 우선 비즈니스적인 측면에서 핵심 역량을 중심으로 설명드리면 다음과 같습니다.
• 분산 서비스 지원: 전통적인 서버 없이 분산 인터넷 애플리케이션을 가능하게 합니다.
• 다용도 원장 기능: 결제 데이터뿐만 아니라 다양한 실질적 정보를 안전하게 저장할 수 있습니다.
• 실시간 데이터 기록: 사용자와 디바이스로부터 데이터를 정확한 타임스탬프로 기록하여 신뢰성을 제공합니다.
• 스마트 계약 지원: 자동화된 서비스를 구축할 수 있는 강력한 스마트 계약 기능을 제공합니다.
• 서버리스 애플리케이션: 로커스체인 기반 위에 구현된 실제 비즈니스로는 서버리스 인터넷 게임, 서버리스 화상 회의 시스템 등이 있습니다.
로커스 체인은 거의 즉시 완료되는 결제, 비용 효율성, 탁월한 확장성을 제공하며, 디지털 결제 및 기타 분야에서 블록체인 기술의 역할을 재정의합니다.
### 로커스 체인과 함께 미래를 탐험하세요
로커스 체인은 기존 서버 기반 시스템을 대체할 수 있는 실용적인 대안을 제시하며, 빠른 속도와 확장성을 자랑합니다. 결제 시스템에서 분산 서비스, 혁신적인 서버리스 애플리케이션에 이르기까지 로커스 체인은 새로운 기준을 세우고 있습니다.
Locus Chain의 차세대 블록체인 기술이 어떻게 결제 시스템의 미래를 재정의할 수 있는지 지금 바로 확인해 보세요. 그래서 로커스 체인이 분산 시스템의 미래를 어떻게 형성하는지 확인해 보시기 바랍니다.
---
# 로커스체인의 '서버리스' 솔루션
Source: https://docs.testnet2.locuschain.com/docs/introduction/Serverless
# 로커스체인의 '서버리스' 솔루션
### 로커스 체인 기술만의 서버리스 특성
로커스 체인은 “서버리스(Serverless)”입니다. 세계 곳곳의 독립된 컴퓨터 네트워크에서 분산되어 운영되며, 중앙화된 서버 설비가 필요하지 않습니다. 이 혁신적인 서버리스 구조는 다음과 같은 여러 이점을 제공합니다:
• 전용 하드웨어 설치가 필요 없음: 로커스 체인은 표준 인터넷 연결만 있다면 일반 컴퓨터, 서버, 스마트 기기에서 실행할 수 있습니다. 기본적인 로커스 체인 클라이언트는 이러한 기기에서 구동되며, 기존 애플리케이션 서버도 로커스 체인 클라이언트 라이브러리를 직접 통합할 수 있습니다. 이는 별도의 하드웨어 투자와 추가 비용을 방지합니다.
• 정보 교환 간소화: 애플리케이션 클라이언트는 서버 측 상태 관리의 복잡성 없이 로커스 체인 원장을 통해 통신할 수 있습니다. 이로 인해 통신 및 상태 관리를 위한 전용 서버가 필요 없게 되어 서비스의 전반적인 효율성을 향상시킵니다.
• 장애 없는 운영: 로커스 체인의 분산 아키텍처는 중앙 서버 장애와 단일 취약점 문제를 제거합니다. 이를 통해 네트워크의 신뢰성과 보안성을 보장하며, 잠재적인 공격과 다운타임으로부터 보호합니다.
### 서버리스 인프라의 비즈니스적 이점
서버리스 구조를 채택하면 중앙화된 서버 의존도를 없애 비용 절감 효과를 누릴 수 있습니다. 이를 더 잘 이해하기 위해 게임 산업을 예로 들어보겠습니다.
#### 기존 게임 산업의 중앙 서버 모델
전통적인 게임 산업은 중앙화된 서버 모델에 의존합니다.
• 운영 방식: 게임 개발자는 게임 소프트웨어를 제작하여 서버에서 운영하며, 서버는 사용자 계정, 게임 아이템, 기타 기능을 관리합니다. 플레이어는 서버에 연결하여 게임에 접근하며, 이 과정에서 중앙화된 프로세싱이 필요합니다.
• 문제점:
1. 플레이어 기반이 성장하면 수익이 증가하지만, 서버 유지 비용도 비례하여 증가합니다.
2. 시장 트렌드 변화나 신작 게임의 등장으로 플레이어 관심이 줄어들면 수익이 감소합니다.
3. 서버 비용은 유연하게 줄일 수 없어 수익 감소에도 불구하고 지속적으로 부담이 됩니다.
이 문제는 글로벌 시장에서 성공한 게임에서도 공통적으로 나타나며, 개발자와 퍼블리셔에게 재정적 부담을 초래합니다.
### 로커스 체인의 서버리스 게임체인 기술
로커스 체인의 서버리스 게임체인은 모든 규모의 게임 개발자와 퍼블리셔에게 비용 효율적이고 확장 가능한 인프라를 제공합니다.
• 대형 퍼블리셔를 위한 이점: 신흥 시장은 큰 성장 잠재력을 지니지만, 높은 서버 비용이 수익성을 저해할 수 있습니다. 게임체인은 서버 비용 관리 최적화를 통해 수익성을 유지하며 시장 진출을 가능하게 합니다.
• 중소 규모 개발자를 위한 지원: 높은 운영 비용은 중소형 개발자에게 생존 위협이 될 수 있습니다. 게임체인은 이러한 비용을 절감하여 안정적인 수익 모델을 제공합니다.
• NFT 및 디지털 자산 개발자를 위한 기능: NFT와 디지털 자산 개발자는 게임체인의 분산 네트워크와 스마트 계약을 활용하여 안전하고 투명한 인프라를 구축할 수 있습니다.
• 종료된 구형 게임의 부활: 서버 비용 문제로 중단된 오래된 게임도 게임체인의 비용 효율적인 인프라를 활용하여 시장에 재진입할 수 있습니다.
### 게임을 넘어: 더 넓은 활용 가능성
게임 산업 외에도 서버리스 인프라의 이점은 다양한 플랫폼 기반 비즈니스에 적용됩니다.
• 많은 산업이 서버 비용 문제로 지속 가능성에 영향을 받고 있습니다.
• 로커스 체인의 서버리스 솔루션은 비용 절감뿐만 아니라 더 큰 확장성을 제공하며, 변화하는 시장 환경에 유연하게 적응할 수 있도록 지원합니다.
서버리스 접근 방식은 단순한 비용 절감을 넘어 운영 효율성과 유연성을 제공하며, 여러 산업에서 비즈니스 운영 방식을 혁신합니다.
---
# 동적 샤딩: Locus Chain의 확장성과 보안성 강화
Source: https://docs.testnet2.locuschain.com/docs/introduction/Dynamicsharding
# 동적 샤딩: Locus Chain의 확장성과 보안성 강화
나카모토 합의 메커니즘은 제3자에 의존하지 않고 가치 교환이 가능하게 한 분산형 블록체인 원장을 도입하며 혁신을 가져왔습니다. 하지만 이 설계는 본질적으로 확장성 문제를 안고 있습니다. 거래량이 증가함에 따라 기존 블록체인은 고정 용량의 원장으로 인해 병목현상이 발생하며 처리 속도가 느려집니다. 이는 속도와 확장성이 중요한 실제 비즈니스 환경에서 블록체인 기술의 적용을 어렵게 만드는 주요 장애물로 작용합니다.
공공 블록체인이 확장성, 탈중앙화, 보안이라는 이른바 Blockchain Trilemma를 해결하는 것은 오랫동안 불가능에 가까운 과제로 여겨져 왔습니다. 그러나 이 문제를 해결하기 위한 솔루션 중 샤딩(Sharding)은 가장 혁신적인 접근 방식 중 하나로 주목받고 있습니다.
### 샤딩의 개념
샤딩은 거래 부하를 독립적인 소그룹("샤드")으로 분산 처리하는 기술입니다. 각 샤드는 거래를 처리하고 원장을 유지할 수 있어 중앙화된 합의 메커니즘에서 발생하는 병목현상을 제거합니다. 이를 통해 데이터 무결성을 유지하면서도 더 빠른 거래 처리가 가능해집니다.
• 각 샤드는 독립적으로 합의를 이루며, 네트워크는 전반적으로 안정성과 보안을 유지합니다.
• 샤딩은 확장성 문제를 해결하여 블록체인 기술이 고성능을 요구하는 실제 응용 사례에서도 효과적으로 작동할 수 있도록 만듭니다.
#### Locus Chain의 동적 샤딩
Locus Chain의 동적 샤딩(Dynamic Sharding)은 기존의 접근 방식을 뛰어넘어 모든 네트워크 참가자 간에 거래 처리 작업을 균등하게 분배합니다. 이를 통해 중앙 집중형 통합기가 필요 없이 다수의 TPS(초당 거래 수)를 처리하면서 네트워크의 탈중앙성과 보안을 유지할 수 있습니다.
그러나 기존 블록체인 아키텍처는 전체 거래 내역을 저장하고 처리해야 하는 단일 원장 설계에 의존하여 샤딩에 적합하지 않았습니다.
• 거대한 원장 크기: 기존 블록체인의 원장은 수백 기가바이트에서 수천 기가바이트에 달하며, 이는 일반 소비자 장치에서 처리하기에는 지나치게 큽니다.
### 동적 샤딩을 가능하게 한 혁신
이러한 한계를 극복하기 위해, Locus Chain은 샤딩에 적합한 원장 구조와 고급 처리 알고리즘을 도입했습니다.
• AWTC(계정 기반 트랜잭션 체인): Locus Chain의 원장은 DAG(Directed Acyclic Graph) 기반 구조로 설계되어, 여러 샤드 간에 상호 작용하며 거래를 처리할 수 있습니다.
• 메시지 형태의 트랜잭션: 거래를 메시지로 취급하여 샤드 간 데이터, 코인, 또는 토큰 교환을 원활하게 수행합니다. 이를 통해 이중 지출(Double Spending) 같은 문제를 방지합니다.
• 비잔틴 장애 허용(BFT): Locus Chain은 BFT 기반 블록 생성 메커니즘을 적용하여 샤드 내에서 즉각적이고 불가역적인 거래 확인을 제공합니다. 블록이 생성되면 최종적이고 수정 불가능한 상태가 됩니다.
### Locus Chain의 독창적인 강점
동적 샤딩은 혁신적인 데이터 구조와 고급 알고리즘의 조화를 통해 기존 기술을 능가하는 성능, 확장성, 보안성을 제공합니다.
• 기존 블록체인 시스템의 기술적 한계를 극복함으로써, Locus Chain은 다양한 산업과 응용 분야에 적합한 확장 가능하고 효율적인 인프라를 제공합니다.
이와 같은 혁신은 Locus Chain을 Blockchain Trilemma 과제를 해결하는 선구자로 자리매김하게 하며, 대규모 분산형 솔루션을 가능하게 하는 진정한 혁신의 원동력으로 만듭니다.
---
# 검증 가능한 프루닝(Verifiable Pruning): 모든 사용자를 위한 블록체인 접근성 강화
Source: https://docs.testnet2.locuschain.com/docs/introduction/Verifiablepruning
# 검증 가능한 프루닝(Verifiable Pruning): 모든 사용자를 위한 블록체인 접근성 강화
기존 블록체인은 TPS(초당 거래 수)가 20건 이하로 제한되면서도 수백에서 수천 기가바이트에 달하는 대규모 원장을 관리해야 하는 문제를 안고 있습니다. 이러한 확장성 문제는 표준 컴퓨팅 장치를 사용하는 일반 사용자에게 큰 제약으로 작용합니다.
Locus Chain은 단일 샤드에서 10배 높은 TPS를, 여러 샤드에서는 최대 1,000배 TPS를 제공하도록 설계되었습니다. 그러나 TPS가 증가함에 따라 원장 크기도 기하급수적으로 커질 수 있습니다. 이는 현대 데스크톱 컴퓨터나 소형 디바이스로 처리하기 어려운 수준입니다.
### 검증 가능한 프루닝 소개
검증 가능한 프루닝은 불필요한 데이터를 제거하면서도 블록체인의 무결성을 유지할 수 있도록 하는 혁신적인 솔루션을 제공합니다.
• 선택적 데이터 제거: 일반적인 블록체인에서, 단일 계정은 전체 거래의 99.99%에 대해 관심이 없습니다. 검증 가능한 프루닝을 통해 이러한 불필요한 데이터를 제거하고, 삭제된 데이터를 참조하지 않고도 새 거래를 검증할 수 있는 체크포인트를 생성합니다.
• 압축 저장: 프루닝을 통해 노드의 데이터 요구사항이 몇 백 메가바이트 수준으로 줄어들어 스마트 가전제품과 같은 저비용 소형 디바이스에서도 블록체인 운영이 가능해집니다.
이러한 접근 방식은 강력한 하드웨어에 대한 의존을 없애고, 네트워크의 강력함을 유지하면서도 더 많은 사용자가 블록체인에 참여할 수 있도록 합니다.
### 더 빠른 노드 초기화
기존 블록체인은 새로운 노드가 네트워크에 참여하기 위해 수 시간의 동기화 시간이 필요할 수 있습니다.
• Locus Chain은 검증 가능한 프루닝을 통해 시작 시간을 대폭 단축해, 새로운 노드는 10분 이내에 네트워크에 참여할 수 있습니다.
• 이 빠른 온보딩은 참가자가 추가적인 초기 비용이나 지연 없이 Locus Chain 네트워크에 유연하게 합류할 수 있도록 지원합니다.
#### 검증 가능한 프루닝의 주요 이점
1. 효율적인 데이터 관리: 저장소 요구를 줄여 다양한 디바이스와 사용자에게 블록체인 기술을 실현 가능하게 만듭니다.
2. 접근성 향상: 저렴한 디바이스로도 블록체인 생태계에 완전하게 참여할 수 있습니다.
3. 확장성 지원: 데이터 크기를 관리 가능한 수준으로 유지하면서 높은 TPS 성능을 지원합니다.
4. 새로운 참가자의 유연성 향상: 노드 시작 시간을 대폭 단축해 네트워크 진입 장벽을 낮춥니다.
Locus Chain의 검증 가능한 프루닝은 확장성과 경량 운영 요구사항을 결합하여 블록체인 기술이 포괄성과 효율성을 모두 달성할 수 있음을 보여줍니다.
---
# 계정, 트랜잭션, 지갑
Source: https://docs.testnet2.locuschain.com/docs/technology/
# 계정, 트랜잭션, 지갑
### 계정: 트랜잭션의 발행 주체
- 계정은 로커스 체인 원장의 소유자로, 자신의 AWTC에 트랜잭션을 발행하여 추가할 수 있습니다. 어떤 계정도 다른 계정의 이름으로 트랜잭션을 발행하는 것은 불가능하며, 계정에는 일반 사용자와 스마트 컨트랙트 계정이 포함됩니다. 일반 사용자 계정은 유저의 직접 동작에 의해 트랜잭션을 발행하며, 스마트 컨트랙트 계정은 계정과 연동된 프로그램 코드 실행의 결과로 트랜잭션을 발행합니다.
- 계정은 고유한 계정 주소로 식별되며, 이는 로커스 체인 전체에서 유일한 값입니다. 계정 주소는 동시에 공개키 값의 역할을 하며, 모든 트랜잭션은 계정 비밀키로 서명됩니다. 트랜잭션의 정당성은 계정 주소를 이용한 서명을 통해 검증할 수 있습니다.
### 계정 주소 / 지갑 주소
- 계정 주소는 로커스 체인에서 계정을 구별하는 데 사용되는 고유한 식별자입니다. 이 주소는 네트워크 전체에서 중복되지 않으며, 암호학적 알고리즘을 통해 생성되어 계정의 공개키와 동일한 값으로 표현됩니다. 이를 통해 계정 주소는 트랜잭션의 출처를 명확히 하고, 외부 위조를 방지하는 역할을 합니다.
- 트랜잭션은 발신자와 수신자를 계정 주소를 통해 지정합니다. 발신자는 자신의 비밀키를 이용해 트랜잭션에 서명하고, 이 서명은 계정 주소에 해당하는 공개키로 네트워크 상에서 검증됩니다. 이 과정은 트랜잭션의 신뢰성을 보장하며, 모든 데이터가 무결성을 유지하도록 합니다.
- 계정 주소는 지갑 주소와 같습니다. 계정 주소를 디지털 자산 전송의 목표 지점을 지정하는 데 사용하는 경우 지갑 주소라 부릅니다. 사용자는 지갑 주소를 통해 코인 및 토큰을 송수신하며, 이는 자산의 소유권을 추적하고 명확히 하는 역할을 합니다. 지갑 주소는 사용자의 신원을 드러내지 않으면서도 네트워크에서 자산 이동을 투명하게 유지할 수 있도록 돕습니다.
### 트랜잭션
- 트랜잭션은 어떤 계정이 다른 계정에 대해 송신하는 정보입니다. 트랜잭션은 로커스 체인 네트워크에서 계정 간 데이터를 전송하는 기본 작업 단위입니다. 이는 정보 교환, 자산 전송, 또는 스마트 컨트랙트 실행과 같은 다양한 작업을 포함하며, 모든 트랜잭션은 고유하며 중복될 수 없습니다.
- 트랜잭션을 자기 자신에게 송신하는 것도 가능합니다. 계정은 자기 자신에게 트랜잭션을 발행하여 데이터를 기록하거나 계정 상태를 갱신할 수 있습니다. 이러한 자기 참조 트랜잭션은 스마트 컨트랙트 실행과 같은 특정 목적에 적합하며, 별도의 상대 계정 없이 독립적으로 동작합니다.
- 쉬운 예로 지갑에 대해 코인과 토큰을 보내는 경우, 송금 트랜잭션을 발행합니다. 송금 트랜잭션은 사용자가 자신의 계정에서 다른 계정으로 디지털 자산을 전송할 때 생성됩니다. 트랜잭션 데이터는 서명된 형태로 네트워크에 전달되며, 검증 과정을 거쳐 원장에 기록됩니다. 모든 전송 기록은 디지털 서명을 통해 신뢰성을 보장합니다.
### 지갑
- 지갑은 로커스 체인 계정의 내부 상태를 나타내며, 해당 계정이 보유한 코인과 토큰 잔액을 포함합니다. 지갑은 특정 계정에 소속되어 있으며, 각 계정마다 고유한 지갑 상태를 유지합니다.
- 쉬운 예로 코인 및 토큰 보유 잔액 등이 있습니다. 로커스 체인 지갑은 계정이 소유한 디지털 자산의 잔액 정보를 보여줍니다. 이 잔액 정보는 트랜잭션 발행을 통해 업데이트되며, 모든 트랜잭션 기록을 기반으로 계산됩니다.
- 지갑의 내용은 완전 공개되어 있고 숨길 수 없습니다. 블록체인 네트워크의 특성상, 지갑의 상태 정보는 누구나 조회할 수 있도록 공개됩니다. 모든 트랜잭션은 원장에 기록되며, 이를 통해 지갑의 보유 자산과 잔액 상태를 검증할 수 있습니다.
### 정리
- 로커스 체인의 계정은 기존 블록체인 시스템과 비슷한 구조를 가지고 있습니다. 기존 블록체인을 사용하던 사용자들은 손쉽게 적응할 수 있습니다.
- 로커스 체인 계정은 블록체인의 핵심 역할인 디지털 자산 거래와 스마트 컨트랙트 실행을 모두 지원합니다. 계정을 통해 디지털 자산의 소유권을 관리하고, 계약 조건을 자동으로 실행할 수 있습니다. 이러한 기능은 로커스 체인이 다양한 디지털 서비스와 애플리케이션의 중심 역할을 하도록 합니다.
---
# 노드, 로커스 체인 네트워크
Source: https://docs.testnet2.locuschain.com/docs/technology/NodesandLocusChainNetwork
# 노드, 로커스 체인 네트워크
### 로커스 체인 노드
- 노드는 로커스 체인 프로그램을 실행하는 인터넷 상의 컴퓨터, 스마트폰 등의 장치입니다.
- 로커스 체인 네트워크에 참여하는 노드는 블록체인 데이터를 저장하고, 트랜잭션을 처리하며, 합의 과정에 기여하는 역할을 합니다. 이러한 노드는 특정 운영 체제나 하드웨어에 제한되지 않고, 인터넷에 연결된 모든 장치에서 실행 가능합니다.
- 노드는 로커스 체인 프로그램을 설치한 후, 네트워크와 통신하며 트랜잭션과 블록의 정보를 수집하고 검증합니다. 이를 통해 분산된 데이터 관리와 네트워크 안정성을 유지합니다.
- 노드 운영자는 로커스 체인 네트워크 기여에 따라 보상을 받을 수 있으며, 이를 통해 노드가 로커스 체인 네트워크에서 지속적으로 참여하고 중요한 역할을 수행하도록 독려합니다.
### 노드 운영자 계정
- 노드 운영자 계정은 로커스 체인 네트워크에서 특정 노드를 소유하고 관리하는 계정을 의미합니다. 이 계정은 노드 운영과 관련된 모든 권한과 책임을 가집니다.
- 노드는 로커스 체인 네트워크에 대한 기여에 따라 보상을 받게 되며, 이 보상은 운영자 계정으로 지급됩니다. 보상은 트랜잭션 검증, 블록 생성, 합의 참여와 같은 작업을 통해 획득됩니다.
- 운영자 계정은 네트워크 안정성과 성능을 유지하기 위한 중요한 역할을 수행하며, 다른 사용자들이 이를 신뢰할 수 있도록 정직성이 요구됩니다.
### 로커스 체인 네트워크
- 로커스 체인 네트워크은 중앙 서버가 존재하지 않는 완전 분산 P2P 네트워크입니다. 로커스 체인 네트워크는 모든 노드가 동등한 권한을 가지는 P2P 방식으로 구성되어 있습니다. 중앙 서버가 없기 때문에 단일 장애 지점(Single Point of Failure)이 존재하지 않습니다.
- 각 노드는 트랜잭션과 블록 데이터를 직접 교환하며, 이를 통해 네트워크의 무결성과 분산성을 유지합니다. 이는 데이터를 중앙화된 서버에 의존하지 않고 분산 관리할 수 있게 합니다.
- 완전한 탈중앙화를 통해 네트워크는 중립적이고 투명한 방식으로 운영되며, 특정 주체의 통제 없이 안정적으로 동작할 수 있습니다.
### 정리
- 로커스 체인의 네트워크는 중앙 서버 없이 운영되는 완전한 P2P 분산 구조를 채택하고 있습니다. 이를 통해 모든 노드가 동등한 권한을 가지며, 데이터의 무결성과 신뢰성을 유지할 수 있습니다. 네트워크는 중앙화된 장애 지점이 없어 높은 안정성을 자랑합니다.
- 로커스 체인은 탈중앙화를 통해 공정하고 중립적인 네트워크 환경을 제공합니다. 특정 주체에 의한 통제를 배제함으로써 모든 사용자가 신뢰할 수 있는 시스템을 보장합니다. 이러한 네트워크 구조는 투명성과 보안성을 극대화합니다.
---
# 샤드, 샤드 노드 및 샤드 네트워크
Source: https://docs.testnet2.locuschain.com/docs/technology/ShardsShardNodesandShardNetwork
# 샤드, 샤드 노드 및 샤드 네트워크
### 샤드
- 샤드는 샤드 노드, 샤드 네트워크 및 샤드 원장을 통틀어서 말합니다.
- 샤드는 로커스 체인의 데이터를 분산 관리하기 위한 기본 단위로, 계정 데이터를 효과적으로 관리하고 처리 속도를 향상시키는 역할을 합니다. 각 샤드는 샤드별로 독립된 별도의 데이터 집합과 트랜잭션 기록을 관리합니다.
- 샤드 노드는 해당 샤드에 소속된 데이터를 처리하고, 샤드 네트워크는 샤드 간 통신과 데이터를 유지하는 데 기여합니다. 이를 통해 전체 네트워크의 처리 효율을 높이고 병목 현상을 줄입니다.
- 샤드는 고도로 독립적으로 동작하며, 필요 시 동적으로 재구성될 수 있습니다. 이를 통해 로커스 체인은 네트워크 부하를 효율적으로 분산하고 확장성을 극대화합니다.
### 샤드 원장
- 샤드 원장은 분할된 월드 원장의 일부로, 샤드에 포함되는 특정 계정 및 해당 계정에서 발생한 트랜잭션 데이터를 포함합니다. 다시 말해 샤드 원장은 작은 단위로 분할된 월드 원장 전체 데이터의 한 부분입니다.
- 각 샤드 원장은 독립적으로 관리되며, 샤드 네트워크 내에서 독립적으로 데이터를 처리합니다. 이를 통해 처리해야 하는 데이터 크기가 원장 분할수에 비례하여 줄어들고, 각 노드의 저장 및 처리 부담을 경감시킵니다.
- 샤드 원장은 데이터 분산 관리의 핵심 요소로, 네트워크 성능과 확장성을 유지하는 데 중요한 역할을 합니다.
### 샤드 네트워크
- 샤드 원장을 관리하기 위해, 로커스 체인 네트워크도 샤드 원장과 같은 갯수로 분할됩니다. 분할된 각 샤드 네트워크는 해당 샤드 원장의 데이터를 처리하고 관리합니다.
- 각 샤드 네트워크는 자체적으로 운영되며, 트랜잭션 검증, 블록 생성 및 데이터 교환 작업을 수행합니다.
- 네트워크 분할을 통해 데이터 처리량이 샤드 별로 분산되며, 높은 TPS(초당 트랜잭션 처리량)을 달성하는데 핵심적 역할을 합니다.
### 샤드 노드
- 로커스 체인의 노드는 항상 어떤 한 샤드에 참여합니다. 각 노드는 특정 샤드에 할당되어 그 샤드의 데이터를 처리하고, 블록 생성 및 검증 작업에 참여합니다.
- 샤드에 속한 노드는 주로 해당 샤드 내의 다른 노드와 통신하며, 필요할 경우 다른 샤드의 노드와도 데이터 교환을 수행하는 샤드간 통신을 수행합니다.
### 샤드간 통신
- 샤드 네트워크 간 데이터 교환은 샤드 간 통신을 통해 이루어지며, 이를 통해 다른 샤드에 포함된 계정 사이의 트랜잭션 처리와 데이터 동기화가 가능합니다.
- 각 샤드의 노드는 필요 시 다른 샤드의 노드와 직접 연결하여 데이터를 교환합니다. 이 과정은 계정 이동 및 샤드 간 트랜잭션의 원활한 처리를 지원합니다.
- 샤드 간 통신은 전체 네트워크의 일관성을 유지하며, 샤드 간 협업을 통해 네트워크 성능을 극대화합니다.
### 노드 원장
- 노드 원장은 한 노드가 관리하는, 샤드 원장의 일부 정보입니다. 샤드 내의 모든 노드의 정보를 합하면 샤드 원장이 됩니다.
- 해당 노드에서 당장 필요하지 않은 데이터는 프루닝(Pruning) 과정을 통해 제거되며, 이를 통해 각 노드의 데이터 저장 효율성을 높입니다.
- 신규 노드는 최소한의 데이터만 다운로드하여 빠르게 네트워크에 참여할 수 있습니다.
---
# 다이나믹 샤딩 (동적 샤딩)
Source: https://docs.testnet2.locuschain.com/docs/technology/DynamicSharding
# 다이나믹 샤딩 (동적 샤딩)
### 트랜잭션 처리량 정보
- 각 샤드 및 월드 전체가 일정 시간에 처리한 트랜잭션의 양은 합의 과정에 의해 블록에 기록되고 월드 전체의 모든 노드에 공유됩니다.
- 이 공유된 처리 상태 정보를 통해 각 노드는 자기 자신 및 속한 샤드의 상대적인 기여도를 파악할 수 있습니다.
### 샤드의 동적 재구성
- 로커스 체인의 샤드는 네트워크 부하를 관리하기 위해 트랜잭션 발생량에 따라 자동으로 재구성됩니다. 이는 특정 샤드의 처리량이 한계에 도달하지 않도록 방지하고, 전체 샤드의 부하가 되도록 일정하게 유지하게 하려는 목적입니다.
- 트랜잭션 발생량이 일정 수준을 초과하면 새로운 샤드가 생성되며, 계정과 데이터를 새로운 샤드로 분산시켜 네트워크 부하를 균형 있게 조정합니다.
- 로커스 체인은 각 샤드의 처리량 한계를 설정하고, 어떤 한 샤드가 과부하 상태에 도달하면 동적으로 트랜잭션과 계정 원장을 샤드간에 재분배합니다. 이를 통해 네트워크 성능이 저하되는 상황을 예방합니다.
- 계정 간 트랜잭션은 이동 후에도 일관성을 유지하며, 이 과정은 네트워크의 안정성을 보장합니다.
### 정리
- 로커스 체인은 다이나믹 샤딩 기술을 활용하여 TPS(초당 트랜잭션 처리량) 증가에 능동적으로 대응합니다. 네트워크 상태 변화에 따라 샤드 구성을 자동으로 조정하여 부하를 균형 있게 분산합니다. 이를 통해 항상 안정적이고 효율적인 트랜잭션 처리가 가능합니다.
- 로커스 체인의 다이나믹 샤딩은 각 샤드와 노드의 처리량을 유지하면서 네트워크의 확장성을 극대화합니다. 이를 통해 트랜잭션 처리량 증가에도 기존 성능을 저하시키지 않습니다. 샤드 기반 확장 구조 덕분에 네트워크는 다양한 요구를 유연하게 수용할 수 있습니다.
---
# BFT 합의
Source: https://docs.testnet2.locuschain.com/docs/technology/BFTConsensus
# BFT 합의
### 결정적 BFT 합의
- 로커스 체인은 합의체 (합의 커미티- committee)를 구성하여 블록체인의 트랜잭션을 확정하는 BFT(Byzantine Fault Tolerance) 합의를 채택합니다. 합의 결과는 발생 즉시 확정적이며 불가역적입니다.
- 트랜잭션이 블록에 포함되어 합의되면, 해당 블록은 신뢰할 수 있는 상태로 네트워크에 기록됩니다. 이후 어떤 노드도 이를 변경할 수 없습니다.
- 이 결정적 합의 메커니즘은 트랜잭션 확정의 신속성을 보장하며, 불확실성을 최소화합니다.
### 샤드 합의
- 로커스 체인은 샤드별로 트랜잭션을 처리하며, 각 샤드 내에서 발생한 트랜잭션은 샤드 합의를 통해 블록으로 확정됩니다.
- 샤드 합의는 각 샤드 내의 노드들이 협력하여 수행되며, 모든 트랜잭션의 정확성과 무결성을 보장합니다. 이를 통해 샤드 합의가 완료된 순간, 샤드 내 데이터에 대한 신뢰성을 검증할 수 있습니다.
### 월드 합의
- 각 샤드의 합의 결과는 다시 월드 블록으로 통합되며, 이를 통해 모든 샤드의 상태가 로커스 체인 전체에서 일관성을 갖게 됩니다.
- 월드 블록은 모든 샤드의 데이터를 포함하는 마스터 상태로, 네트워크 전체의 트랜잭션을 검증할 수 있는 기준점 역할을 합니다.
- 월드 합의는 샤드 간 트랜잭션과 데이터 이동이 정확히 처리되었음을 보장하며, 네트워크의 신뢰성과 안정성을 유지합니다.
### 정리
- 로커스 체인은 BFT 결정적 합의를 통해 트랜잭션이 확정된 순간부터 전 세계 누구나 신뢰할 수 있는 투명성을 제공합니다. 합의 결과는 변경될 수 없으며, 네트워크의 무결성을 보장합니다. 이를 통해 로커스 체인은 안정적이고 신뢰할 수 있는 블록체인 환경을 제공합니다.
- 로커스 체인의 합의 메커니즘은 트랜잭션이 합의된 즉시 신뢰할 수 있는 상태로 전환됩니다. 이는 빠른 의사결정과 실행을 가능하게 하여 비즈니스 환경에서 효율성을 극대화합니다. 신속한 처리가 중요한 애플리케이션에서 특히 강력한 이점을 제공합니다.
---
# POS 합의체 구성
Source: https://docs.testnet2.locuschain.com/docs/technology/PoSConsensusCommitteeselection
# POS 합의체 구성
### BFT 합의체 (BFT Consensus Committee)
- 로커스 체인은 BFT합의를 위해 합의 커미티(Consensus Committee)를 구성합니다. 이 커미티는 복수의 노드로 이루어져 트랜잭션과 블록을 검증하고 확정하는 역할을 합니다.
- 커미티 구성은 가중PoS(Proof of Stake)방식 추첨에 기반하여 이루어지며, 추첨된 노드들이 참여하게 됩니다.
### 가중 PoS 추첨
- 합의 커미티 구성 시 PoS 기반 추첨 방식이 사용됩니다. 노드와 그 운영 계정은 보유한 디지털 자산의 양과 네트워크 기여도 등의 복합적 요소에 따라 추첨 확률이 결정됩니다.
- 예를 들어 오래 활동한 노드 또는 네트워크 안정성에 기여한 노드는 추첨 확률이 더 높아질 수 있습니다.
- 추첨에 당선된 노드 운영 계정은 합의에 참여하고, 이 과정에서 발생하는 보상을 받을 수 있습니다.
### PoS / Stake 위탁
- 노드를 직접 운영하지 않는 계정은 자신이 보유한 디지털 자산을 다른 노드 운영 계정에 위탁할 수 있습니다.
- 위탁된 자산은 PoS 합의 과정에서 활용되며, 이에 따라 위탁한 계정도 간접적으로 보상을 받을 수 있습니다.
- 이러한 위탁 시스템은 PoS 기반 합의에 운영자들이 적극적으로 협력하도록 권장하는 역할을 합니다.
### 정리
- 로커스 체인은 PoS 기반 추첨 방식을 통해 에너지 소비를 획기적으로 줄였습니다. 이 방식은 환경친화적인 기술을 추구하며, 탄소 배출을 거의 발생시키지 않습니다. 지속 가능한 블록체인 운영의 선두 주자로 자리 잡았습니다.
- 로커스 체인의 PoS 추첨은 네트워크 참여자 간 공정성을 보장하며, 하드웨어 성능과 무관하게 모든 사용자가 평등한 기회를 가질 수 있습니다. 이는 네트워크 내의 자본 계층 구조를 최소화하고, 참여를 확대하는 데 기여합니다.
- 로커스 체인은 노드를 직접 운영하지 않는 사용자도 채굴 보상을 받을 수 있는 위탁 시스템을 제공합니다. 사용자는 자신의 자본을 신뢰할 수 있는 노드 운영 계정에 위탁하여 네트워크 기여도를 높이고 보상을 받을 수 있습니다. 이는 네트워크 참여를 확대하고, 생태계의 균형을 유지합니다.
---
# 원장 및 원장 분할
Source: https://docs.testnet2.locuschain.com/docs/technology/LedgerandLedgerPartitioning
# 원장 및 원장 분할
### 월드 원장
- 월드 원장은 이론상의 과거의 모든 계정의 모든 트랜잭션의 기록입니다. 로커스 체인 네트워크 전체에서 발생한 모든 트랜잭션 기록을 포함하는 가장 포괄적인 데이터베이스입니다. 새로운 트랜잭션은 합의 과정을 통해 확정된 후 월드 원장에 추가됩니다.
- 월드 원장은 어떤 한 노드 컴퓨터가 관리하기에는 너무 거대합니다. 월드 원장의 데이터 크기는 트랜잭션 처리량에 따라 지속적으로 증가하기 때문에, 단일 노드가 이를 관리하거나 저장하기에는 과도한 부담이 됩니다. 따라서 데이터를 효율적으로 분산하여 처리해야 합니다.
- 로커스 체인은 월드 원장을 분할하여 관리합니다. 로커스 체인은 월드 원장을 샤드라는 작은 단위로 나누어 관리합니다. 각 샤드는 특정 계정 집합과 그 계정에서 발생한 모든 트랜잭션을 포함하며, 노드 간 작업을 분산시켜 효율성을 높입니다.
### 월드 원장 분할
- 월드 원장은 트랜잭션 데이터가 끊임없이 추가되며, 그 크기가 기하급수적으로 증가합니다. 단일 노드가 모든 데이터를 처리하고 저장하는 것은 비현실적이며, 네트워크 및 노드 성능 저하의 주요 원인이 될 수 있습니다.
- 로커스 체인은 월드 원장을 분할하여 관리합니다. 로커스 체인은 데이터를 샤드라는 작은 단위로 나누어 관리하며, 이를 통해 데이터를 분산 저장 및 처리합니다. 샤드 원장은 각각 독립적으로 관리되며, 샤드에 포함되는 특정 계정의 트랜잭션만을 포함합니다.
- 로커스 체인의 샤드 원장은 계정 단위로 데이터를 관리합니다. 한 계정이 발행한 모든 트랜잭션은 동일한 샤드에 속하며, 계정의 이동이 발생할 경우 해당 데이터도 함께 이동됩니다
### 정리
- 로커스 체인의 원장은 처음부터 샤딩 기술을 고려하여 설계되었습니다. 로커스 체인은 샤딩 기술을 기반으로 트랜잭션 처리량을 무한대로 늘릴 수 있는 잠재력을 가지고 있습니다. 트랜잭션 처리량 증가에도 안정적인 성능을 유지할 수 있음을 의미합니다.
---
# 스마트 컨트랙트 및 VME
Source: https://docs.testnet2.locuschain.com/docs/technology/SmartContractsandVirtualMachineEnvironment
# 스마트 컨트랙트 및 VME
### 자발적 스마트 컨트랙트 실행 모델
- 스마트 컨트랙트 운영에는 CPU 용량 및 저장 공간의 부담이 큽니다. 스마트 컨트랙트는 실행 시 높은 연산 성능과 저장소를 요구하며, 이는 네트워크 노드에 상당한 부담을 줄 수 있습니다.
- 따라서 로커스 체인에서의 스마트 컨트랙트의 운영은 선택적이고 비강제적입니다. 노드는 필요에 따라 스마트 컨트랙트를 실행할 수 있으며, 모든 노드가 동일하게 이 작업을 수행할 필요는 없습니다.
- 스마트 컨트랙트 실행에는 추가 리소스를 부담할 수 있는 고성능 노드가 자발적으로 참여합니다. 이러한 노드는 네트워크 내에서 더 많은 리소스를 제공하며, 스마트 컨트랙트 실행을 지원합니다.
- 그럼에도 불구하고 어떤 한 노드가 실행할 수 있는 스마트 컨트랙트의 양은 한계가 있습니다. 각 노드는 자신이 처리할 수 있는 리소스 범위 내에서만 스마트 컨트랙트를 실행하며, 과부하를 방지합니다.
### 스마트 컨트랙트 가상 머신 환경 (Virtual Machine Environment / VME)
- 로커스 체인의 스마트 컨트랙트 VM(Virtual Machine)은 한 노드가 부담 없이 실행할 수 있는 양의 스마트 컨트랙트를 실행하는 가상 그룹 단위입니다. 이를 통해 노드의 리소스 사용 부담을 제한하고 최적화합니다.
- VME(Virtual Machine Environment)는 여러 VM을 로커스 체인 상에서 동시 실행 및 상호작용할 수 있도록 지원하는 기능입니다. 이를 통해 로커스 체인 전체의 스마트 컨트랙트 실행 능력을 향상시키면서 동시에 스마트 컨트랙트 간의 협력 및 복잡한 작업이 가능해집니다.
### VM 생성: VME 상에 VM을 추가
- 로커스 체인 VME 상에 여러 VM이 동시에 존재할 수 있습니다. 각각의 VM은 독립적으로 동작하며, 특정 목적에 맞게 구성됩니다.
- VM은 발기인에 의해 창립됩니다. 발기인은 초기 자본과 참여 노드를 모아 VM 실행을 신청하며, 이를 통해 VM의 운영 조건과 실행 환경을 설정합니다.
- VM의 실행 언어, 환경 및 조건은 발기인에 의해 결정됩니다. 이를 통해 발기인은 VM이 특정 요구 사항을 충족하도록 설계할 수 있습니다. 예를 들어 로커스 체인의 디폴트 이더리움 호환 VM에는 원하는 모든 노드가 참여할 수 있으며, 누구나 필요한 스마트 컨트랙트를 등록 및 실행할 수 있습니다.
- VM의 존재 목적은 스마트 컨트랙트의 실행입니다. 모든 스마트 컨트랙트 실행이 종료되고 더이상 새로운 실행이 발생하지 않는다면, 필요에 따라 VM을 청산하고 자본을 환수할 수 있습니다.
### 노드의 VM 참여
- 스마트 컨트랙트 실행을 위한 충분한 추가 능력을 가진 노드는 원하는 VM에 참여할 수 있습니다. 이 참여는 자발적으로 이루어지며, 각 노드의 리소스 여유에 따라 자발적으로 결정할 수 있습니다.
- VM 참여 및 이탈 조건은 각 VM마다 별도로 정의됩니다. 노드는 특정 VM의 규칙에 따라 참여하거나 작업 종료 후 VM을 떠날 수 있습니다.
- VM에 참여하는 노드는 VM 실행을 지원하기 위해 추가적인 CPU와 저장소 리소스를 제공하며, 이에 따라 로커스 체인 채굴 보상 외에도 VM 운영 보상을 추가로 받을 수 있습니다.
### VM 트랜잭션
- VM의 스마트 컨트랙트 계정은 로커스 체인의 계정을 그대로 사용합니다. 이는 스마트 컨트랙트가 별도의 주소 체계를 필요로 하지 않고, 기존 로커스 체인의 계정 구조를 사용함을 의미합니다.
- 스마트 컨트랙트 실행 중 발생하는 모든 트랜잭션은 직접 로커스 체인의 원장에 기록하는 것이 권장됩니다. 이를 통해 스마트 컨트랙트 실행 이력이 명확히 남고, 투명성이 유지됩니다.
- 스마트 컨트랙트 호출 실행은 로커스 체인 원장을 통한 트랜잭션 발행 형태로 이루어집니다. 즉 스마트 컨트랙트 트랜잭션은 기존의 데이터 전송과 동일한 방식으로 처리됩니다.
- 실행 결과 역시 로커스 체인 원장에 기록되고, 따라서 다른 계정 및 VM이 실행 결과를 확인할 수 있습니다. 이를 통해 서로 다른 VM 간의 스마트 컨트랙트 실행이 심리스하게 수행됩니다.
### 정리
- VME는 로커스 체인의 혁신적인 신개념으로, 대규모 스마트 컨트랙트 실행을 위해 설계된 고성능 환경을 제공합니다. 이 시스템은 스마트 컨트랙트의 실행 부담을 분산하여 네트워크 효율성을 극대화합니다. 차세대 블록체인 기술을 선도하는 강력한 도구입니다.
- 로커스 체인은 스마트 컨트랙트 데이터를 고성능 원장에 직접 기록하여 중간 처리 과정 없이 데이터를 관리합니다. 이 접근 방식은 데이터의 무결성을 유지하면서 처리 속도를 크게 향상시킵니다. 투명하고 신속한 데이터 처리가 필요한 환경에 최적화된 솔루션입니다.
- 로커스 체인의 VME는 다양한 스마트 컨트랙트 언어를 지원하며, 서로 다른 스마트 컨트랙트 간의 상호 통신을 효율적으로 제공합니다. 사용자는 유연하고 강력한 인터페이스를 통해 복잡한 작업을 쉽게 수행할 수 있습니다. 이로써 로커스 체인은 다양한 애플리케이션을 포괄하는 강력한 플랫폼이 됩니다.
---
# 로커스체인 시작하기
Source: https://docs.testnet2.locuschain.com/docs/guides/
# 로커스체인 시작하기
## 로커스체인 설치
- [OS에 맞는 노드를 다운로드하여 설치하세요.](node/node-install)
## 지갑 설치
- [로커스 지갑을 설치하세요.](wallet/wallet-install)
## 컨트랙트 개발하기
- [Remix for Locus Chain](https://remix.testnet2.locuschain.com/)
## 관련 링크
- [Locus Chain Official website](https://www.locuschain.com/)
- [Locus Explorer](https://explorer.testnet2.locuschain.com/)
- [Locus Chain Youtube Channel](https://www.youtube.com/@locuschainfoundation4531)
- [Introduction of Locus GameChain](https://locuschain.com/projects/locus-gamechain)
---
# 단위
Source: https://docs.testnet2.locuschain.com/docs/guides/unit
# 단위
| 이름 | 값 (로커스)
| ---- | ------
| EXA | 1018
| PETA | 1015
| TERA | 1012
| GIGA | 109
| MEGA | 106
| KILO | 103
| LOCUS | 1
| MILLI | 10-3
| MICRO | 10-6
| NANO | 10-9
| PICO | 10-12
| REMTO | 10-15
| ATO | 10-18
---
# 지갑 설치 방법
Source: https://docs.testnet2.locuschain.com/docs/guides/wallet/wallet-install
# 지갑 설치 방법
## 크롬 익스텐션 지갑
1. 크롬 웹브라우저를 실행합니다.
2. 기존에 개발자버전(zip 파일)으로 설치된 지갑이 있으면 삭제 하세요.
2.1 주소창에 chrome://extensions/ 를 입력하여 이동합니다.
2.2 기존에 설치된 개발자버전(zip 파일)으로 설치된 지갑을 찾아서 삭제 합니다.
3. 크롬 웹 스토어에서 로커스체인 지갑을 설치 합니다.
아래 링크를 클릭하세요.
https://chromewebstore.google.com/detail/locuschain-wallet/dfkmnjfjnnogbemhicejpopkpkbfaabe
4. 웹브라우저 확장프로그램에 로커스지갑 아이콘이 추가된 것을 확인합니다.

5. 아이콘을 클릭하여 지갑을 실행합니다.
## 모바일 지갑
### Android
- 준비중입니다.
### Apple
- 준비중입니다.
---
# 지갑 사용법
Source: https://docs.testnet2.locuschain.com/docs/guides/wallet/how_to_use_wallet
# 지갑 사용법
## 로컬 노드와 지갑 연결
### 노드 실행
1. 노드가 설치되어있지 않다면 [노드 설치 페이지](../node/node-install.mdx)에서 자신의 PC에 맞는 버전을 다운로드 받아 설치합니다.
2. 설치된 노드를 실행합니다. 자세한 내용은 [노드 실행 방법](../node/node-run.mdx)을 참조해주세요.
### localhost 선택
지갑 상단의 네트워크를 `localhost`로 선택하세요.

:::tip
**노드가 STABLE 상태가 아닐때는 아직 준비중이므로 지갑에서 연결이 되지 않을수 있습니다.**
지갑이 연결되지 않는다면 노드가 준비될때까지 대기 한 후 다시 시도해주세요.

::::
## 지갑 생성 & 자동 오픈 어카운트
1. 최초 설치후 실행하면 아래와 같이 지갑 생성 페이지로 이동됩니다.
`새 지갑 생성` 버튼을 클릭하세요.

2. 지갑 잠금 해제를 위한 패스워드를 입력하세요. `동의` 란 체크를 선택후 `새 지갑 생성` 버튼을 클릭하세요.
패스워드를 분실시 복구할 수 없으므로 주의하세요.

3. 자동으로 오픈 어카운트가 진행됩니다. 완료될때까지 잠시 기다려주세요.
2단계로 진행되며 완료까지 최대 2 분 정도 걸릴수 있습니다.
1. 오픈 어카운트를 하기위해 트랜잭션이 필요합니다. 테스트를 위해 수도꼭지에서 코인을 충전하여 transfer 트랜잭션을 생성합니다.

2. 오픈 어카운트를 진행됩니다.

:::tip
오픈어카운트가 완료되지 않은 상태에서 지갑 창을 닫고 다시 열면 오픈어카운트 진행할지 묻는 박스가 표시됩니다. `진행하기`버튼을 클릭하여 계속 진행해주세요.

:::
4. 계정이 생성된것을 확인 할수 있습니다.

## 로그아웃
1. 오른쪽 상단의 햄버거 버튼를 클릭하여 메뉴를 엽니다.
`로그아웃`버튼을 클릭합니다.

2. 로그아웃되어 로그인 화면으로 이동됩니다.

## 사이트 연결 하기
1. 로커스체인 연동 서비스를 제공하는 사이트 내에서 `연결하기` 버튼을 클릭합니다.
:::tip
[로커스체인 익스플로어](https://explorer.testnet2.locuschain.com/) 에서 연결 해보세요 !

:::
2. 팝업창이 뜨면 로그인 합니다.

3. 사이트와 연결하려는 계정을 선택하고 `다음`버튼을 클릭합니다.

4. 사이트에 허용되는 기능을 확인하고 `다음`버튼을 클릭합니다. 연결이 완료되면 창이 자동으로 닫힙니다.


5. 사이트에 연결되면 지갑에서 계정명의 왼쪽에 `연결됨`상태가 표시됩니다.

## 사이트 연결 해지 하기
1. 계정명 왼쪽에 `연결됨`상태를 클릭하면 연결된 사이트 목록이 표시됩니다.
대상 계정의 오른쪽 버튼을 클릭하여 연결을 해지 할수 있습니다.

2. 계정명 왼쪽에 `연결되지 않음`상태가 표시되면 연결이 해지된 것입니다.

## 키 파일 import
1. 오른쪽 상단의 햄버거 버튼을 클릭하여 메뉴를 열고 `키 파일로 계정 가져오기` 메뉴를 선택합니다.

2. `Keystore 파일 선택` 버튼을 클릭하고 import 할 키 파일을 지정합니다.
import할 키 파일의 패스워드와 지갑에 표시할 계정명을 입력 후 확인 버튼을 클릭합니다. (계정명은 등록 후 수정 가능합니다.)

3. import한 계정이 확인됩니다

## 코인 보내기
1. 자산 목록에서 보내고자 하는 코인의 오른쪽에 있는 `>` 버튼을 클릭합니다.

2. 정보를 입력 후 `보내기` 버튼을 클릭합니다.
- **주소:** 코인을 받을 주소
- **자산:** 보낼 자산 종류. 이미 선택되어있음
- **수량:** 보내고자 하는 코인 수량

## 시스템 토큰 생성
1. 자산 목록 하단에 `시스템 토큰 생성` 버튼을 클릭합니다.

2. 생성할 토큰 수량을 입력 후 `확인` 버튼을 클릭합니다.

## 토큰 가져오기
1. 자산 목록 하단에 `토큰 가져오기` 버튼을 클릭합니다.

2. 지갑에 표시할 토큰 정보를 입력합니다.
- **컨트랙트 주소:** 토큰의 컨트랙트 주소
- **토큰 기호:** 토큰의 화폐 기호
- **토큰 데시멀:** 토큰 소수점 자릿수

## 네트워크 추가
1. 지갑 상단에 표시된 네트워크명을 클릭하면 선택가능한 네트워크 목록이 표시됩니다.
목록 하단의 `네트워크 추가` 버튼을 클릭하세요.

2. 네트워크 정보를 입력하고 `확인`버튼을 클릭합니다.
- **네트워크 이름:** 지갑에 표시할 네트워크 이름
- **RPC URL:** 지갑에서 RPC를 호출할 URL
- **통화 기호:** 기본 통화 기호
- **익스플로어 URL:** 익스플로어 URL
- **충전 URL:** 자동 충전시 사용되는 URL

## 내 체인에 데이터 기록
1. 오른쪽 상단 햄버거 버튼을 클릭하여 메뉴를 열고 `내 체인에 데이터 기록` 메뉴를 선택합니다.

2. 체인에 기록할 데이터를 파일이나 직접 텍스트로 입력합니다.
입력 후 `확인`버튼을 클릭합니다.

:::info
내용 입력란 하단에 표시되는 hex 값이 data로 저장됩니다.

:::
3. `활동`탭 에서 발행된 `Record data` 트랜잭션을 확인 할 수 있습니다.
기록한 데이터를 상세 페이지의 `Data`항목에서 확인 가능합니다.


---
# 노드 설치 방법
Source: https://docs.testnet2.locuschain.com/docs/guides/node/node-install
# 노드 설치 방법
## 노드 다운로드
- Windows (UI mode) 다운로드
>
:::tip
If the node installation process asks for the ".NET 6.0 Desktop Runtime (v6.0.36) - Windows x64 Installer", please refer to the URL below to install it.
- https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-6.0.36-windows-x64-installer
:::
## 노드 실행
다운로드 받은 프로그램을 OS에 맞게 원하는 위치에서 압축을 해제 후 실행 파일을 실행합니다.
Node Execution Guide >>
---
# 노드 실행 방법
Source: https://docs.testnet2.locuschain.com/docs/guides/node/node-run
# 노드 실행 방법
## Windows (UI mode)
### 다운로드
다운로드 받은 파일의 압축을 풉니다.

### 실행
`LocusChain` 폴더에서 `LocusChain.exe` 파일을 실행합니다.
최초 한번 다음과 같이 알림창이 뜹니다. 추가정보 를 누르고 `실행` 버튼을 클릭 합니다.


방화벽 알림창이 뜰 경우 `허용` 버튼을 클릭합니다.

### 비밀번호 입력
새로운 계정을 만들고 계정을 노드에서 호스트 계정으로 사용됩니다.
호스트 계정에 사용할 비밀번호를 입력하고 `OK` 버튼을 클릭합니다.

### 상태 확인
노드가 정상적으로 실행된것을 확인 할 수 있습니다

:::tip
노드가 준비중에 다음과 같이 표시됩니다. 최대 몇 분의 시간이 소요될수 있습니다.

:::
## 노드 계정을 지갑에서 사용
### 지갑 설치
지갑이 설치되지 않았다면 [지갑 설치 페이지](../wallet/wallet-install.mdx)를 참고하여 설치를 진행합니다.
지갑을 실행하여 새 지갑 만들기를 진행합니다.


:::note
복구를 위해 니모닉을 클릭하여 안전한곳에 저장하세요.
:::
### 네트워크 선택
지갑 상단의 네트워크를 `localhost`로 선택하세요.

### 키스토어 가져오기
#### 키 파일 선택
지갑 상단의 계정명을 선택하고 `Add Account` 버튼을 클릭합니다.

팝업에서 `Import Account from Key File` 버튼을 클릭합니다.
`LocusChain.exe` 을 실행한 폴더에서 `hostAccount.keystore`를 찾아 선택합니다.


:::tip
노드 zip 파일의 압축을 풀면 아래와 같은 구조입니다. hostAccount.keystore을 찾으세요.
[#위치 참고](#다운로드)

:::
#### 노드의 계정확인
노드의 표시된것을 확인하세요.
선택된 네트워크가 `localhost`이고 지갑에 불러온 계정명이 노드의 하단의 HostID와 일치하는지 확인하세요.


---
# 지갑 네트워크 추가
Source: https://docs.testnet2.locuschain.com/docs/guides/developer/add-network
# 지갑 네트워크 추가
## React Library
이 예제에서는 '네트워크 추가' 함수를 호출하여 신규 네트워크를 지갑에 추가 합니다.
### 1. 프로젝트 생성
터미널에서 다음과 같이 프로젝트를 생성합니다.
```shell
npx create-react-app locuschain-example-addnetwork --template typescript
```
### 2. App.tsx 수정
App.tsx 파일에 다음 내용을 업데이트 하세요.
```typescript
// @ts-nocheck
function App() {
const [result, setResult] = useState();
const addNetwork = () => {
if (!window.locus) {
alert('Locus wallet is not installed on this device.');
return;
}
const network = {
name: 'localhost1',
rpcUrl: 'http://localhost:9595',
currencySymbol: 'LOCUS',
explorerUrl: 'http://gamechain.locuschain.com:8003/#/accounts/${addr}',
}
const result = window.locus.request('addNetwork', network).catch((err) => {
console.error(err);
});
setResult(result)
}
return <>
result: {`${result}`}
>
}
export default App;
```
지갑의 `addNewtork`함수에 네트워크 정보를 파라미터로 실행합니다.
네트워크 추가 작업의 성공 여부를 boolean으로 반환받습니다.
:::info
사용 가능한 함수 목록은 [여기](/docs/references/wallet)에서 볼 수 있습니다.
:::
### 3. 실행
터미널에서 다음과같이 프로젝트를 실행합니다.
```shell
npm run start
```
---
# 지갑 연결 감지
Source: https://docs.testnet2.locuschain.com/docs/guides/developer/connect
# 지갑 연결 감지
## React Library
이 예제에서는 지갑의 이벤트를 감지하여 연결된 계정의 주소와 연결여부를 표시합니다.
### 1. 프로젝트 생성
터미널에서 다음과 같이 프로젝트를 생성합니다.
```shell
npx create-react-app locuschain-example-connection --template typescript
```
### 2. App.tsx 수정
App.tsx 파일에 다음 내용을 업데이트 하세요.
```typescript
// @ts-nocheck
function App() {
const [connected, setConnected] = useState();
const [connectedAccount, setConnectedAccount] = useState();
const initHandler = (data) => {
const { connectedAccount, address, connected } = data
setConnectedAccount(connectedAccount?.addr)
setConnected(connected)
}
const connectHandler = async (data) => {
const { addr } = data
setConnectedAccount(addr)
setConnected(!!addr)
}
const disconnectHandler = (data) => {
setConnectedAccount(undefined)
setConnected(false)
}
const unlockWalletHandler = async (data: any) => {
const addr = await window.locus.request('getAccount').catch((e: any) => undefined);
setConnectedAccount(addr)
setConnected(!!addr)
}
useEffect(() => {
const locus = window.locus;
if(locus) {
console.warn('Locus wallet is not installed on this device.');
return;
}
locus.on('init', initHandler)
locus.on('connect', connectHandler)
locus.on('disconnect', disconnectHandler)
locus.on('unlockWallet', unlockWalletHandler);
return () => {
locus.off('init', initHandler);
locus.off('connect', connectHandler);
locus.off('disconnect', disconnectHandler);
locus.off('unlockWallet', unlockWalletHandler);
}
}, [])
const connect = () => {
if (!window.locus) {
alert('Locus wallet is not installed on this device.');
return;
}
window.locus.request('connect', {}).catch((err) => {
console.error(err);
});
}
return <>
account: {connectedAccount}
connected: {`${connected}`}
>
}
export default App;
```
지갑이 정상적으로 설치되어 사용이 가능한 상태일때 `init` 이벤트가 한번 발생합니다.
`init` 이벤트의 데이터에서 선택된 계정과 네트워크 정보, 연결 여부를 얻을수 있습니다.
연결 상태가 변경됬을때 `connect`, `disconnect` 이벤트로 연결 여부를 업데이트 합니다.
:::info
발생하는 이벤트 목록은 [여기](/docs/references/wallet)에서 볼 수 있습니다.
:::
### 3. 실행
터미널에서 다음과같이 프로젝트를 실행합니다.
```shell
npm run start
```
---
# 로커스 라이브러리 사용
Source: https://docs.testnet2.locuschain.com/docs/guides/developer/lclib-usage
# 로커스 라이브러리 사용
## React Library
이 예제에서는 로커스 라이브러리를 설치하고 rpc호출로 nft를 생성하는 방법을 소개합니다.
### 1. 프로젝트 생성
터미널에서 다음과 같이 프로젝트를 생성합니다.
```shell
npx create-react-app locuschain-example-locuschainlib --template typescript
```
### 2. Locus library 설치
터미널에서 다음과같이 로커스 라이브러리를 설치합니다.
```shell
npm i @locuschain/lib
```
### 3. App.tsx 수정
index.tsx 파일에 다음 내용을 업데이트 하세요.
```typescript
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
function App() {
const [result, setResult] = useState('executing...')
const [error, setError] = useState()
useEffect(() => {
// rpcUrl must be changed to match the actual environment.
const rpcUrl = 'http://[IP_ADDRESS]/';
const web3 = new Web3(rpcUrl);
// testAccount must be changed to match the actual environment.
const testAccount = new Account({
address: 'GAST567Y42J5VZFXLNW4W...',
nsk: 'AFNZZPKVBP7AS46SSX....'
});
web3.accounts.add(testAccount);
const createNft = async () => {
try {
const params = {
account: testAccount.address,
assetType: 'asset4',
amount: '0',
operator: '',
metaData: convertStringToData(
'{"name":"testname", "image":"https://iam-test-free270.s3.ap-northeast-2.amazonaws.com/logo.png", "decimals":18, "symbol":"symbol1"}'
),
feeType: 0
};
// 3. Request asset object creation (includes signing process internally)
// @ts-ignore
const ret = await web3.provider.locus_createAssetObject(params);
setResult(JSON.stringify(ret, null, 2));
} catch (e: any) {
if (e.name !== 'AbortError') {
setError(e.message);
}
}
};
createNft();
}, [])
return <>
Result:
{result}
{error &&
{`${error}`}
}
>
}
(async () => {
await loadLocusWasm();
root.render(
);
})();
```
### 4. 실행
터미널에서 다음과같이 프로젝트를 실행합니다.
```shell
npm run start
```
---
# 코인 전송 Tx 생성
Source: https://docs.testnet2.locuschain.com/docs/guides/developer/transfer-coin
# 코인 전송 Tx 생성
## React Library
이 예제에서는 코인 전송 Tx를 생성하여 코인을 전송합니다.
### 1. 프로젝트 생성
터미널에서 다음과 같이 프로젝트를 생성합니다.
```shell
npx create-react-app locuschain-example-transfercoin --template typescript
```
### 2. Locus library 설치
터미널에서 다음과같이 로커스 라이브러리를 설치합니다.
```shell
npm i @locuschain/lib
```
### 3. App.tsx 수정
App.tsx 파일에 다음 내용을 업데이트 하고 정의된 변수를 사용자에 맞게 수정하세요.
```typescript
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
function App() {
const [result, setResult] = useState('executing...')
const [error, setError] = useState()
useEffect(() => {
// rpcUrl must be changed to match the actual environment.
const rpcUrl = 'http://[IP_ADDRESS]/';
const web3 = new Web3(rpcUrl);
// testAccount must be changed to match the actual environment.
const testAccount = new Account({
address: 'GAST567Y42J5VZFXLNW4W...',
nsk: 'AFNZZPKVBP7AS46SSX....'
});
web3.accounts.add(testAccount);
const transferCoin = async () => {
try {
const params = {
from: testAccount.address,
to: 'QRO5DMWKPKX5RKEBAWNYJGWBKJMWGUVAURENCABGCY',
amount: '0.000001',
tokenAmounts: [],
feeType: 0,
};
const ret = await web3.provider.locus_transferCoin(params);
setResult(JSON.stringify(ret, null, 2));
} catch (e: any) {
if (e.name !== 'AbortError') {
setError(e.message);
}
}
};
transferCoin();
}, [])
return <>
Result:
{result}
{error &&
{`${error}`}
}
>
}
(async () => {
await loadLocusWasm();
root.render(
);
})();
```
`locus_transferCoin` RPC를 호출하여 코인 전송 트랜잭션을 생성 및 전송합니다.
:::info
로커스 라이브러리에 대한 자세한 정의는 [여기](../../references/lclib)에서 볼 수 있습니다.
:::
### 4. 실행
터미널에서 다음과같이 프로젝트를 실행합니다.
```shell
npm run start
```
---
# Locus Chain TestNet V2 Release Notes
Source: https://docs.testnet2.locuschain.com/docs/guides/release-notes
# Locus Chain TestNet V2 Release Notes
## **2026.06.26**
### :pushpin: 로커스 테스트넷 V2는 안정성과 성능 개선을 위해 재부팅될 예정입니다.
이 과정에서 이전 테스트 단계에서 생성된 NFT 및 토큰을 포함한 모든 데이터가 초기화됩니다.
네트워크 초기화 이후, 모든 참여자는 테스트를 계속하기 위해 노드와 지갑을 업데이트하고 새로운 계정을 생성해야 합니다.
## **2026.06.08**
### :pushpin: 로커스 테스트넷 V2는 안정성과 성능 개선을 위해 재부팅될 예정입니다.
이 과정에서 이전 테스트 단계에서 생성된 NFT 및 토큰을 포함한 모든 데이터가 초기화됩니다.
네트워크 초기화 이후, 모든 참여자는 테스트를 계속하기 위해 노드와 지갑을 업데이트하고 새로운 계정을 생성해야 합니다.
## **2026.04.23**
### :pushpin: 로커스 테스트넷 V2는 안정성과 성능 개선을 위해 재부팅될 예정입니다.
이 과정에서 이전 테스트 단계에서 생성된 NFT 및 토큰을 포함한 모든 데이터가 초기화됩니다.
네트워크 초기화 이후, 모든 참여자는 테스트를 계속하기 위해 노드와 지갑을 업데이트하고 새로운 계정을 생성해야 합니다.
## **2026.04.20**
### 안정성을 위해 Locus 테스트넷 V2가 재부팅될 예정입니다.
이 과정에서 모든 데이터가 초기화됩니다.
체인 재시작에 따라 이전 테스트 단계에서 생성된 모든 NFT와 토큰이 소멸되오니 유의하시기 바랍니다.
네트워크 초기화로 인해 모든 참여자는 지속적인 테스트를 위해 노드와 지갑을 업데이트하고 새로운 계정을 생성해야 합니다.
:gear: 추가 업데이트: 이제 지갑 계정 생성 시 마스터 키 서명 알고리즘을 기존의 NIST 표준 알고리즘 (Dilithium, Falcon) 에 더해 KpqC 표준 알고리즘 (Haetae, AIMer) 중에서도 선택할 수 있습니다.
Locus Chain 네트워크의 지속적인 개선을 지원해 주셔서 감사합니다.
## **2026.03.27**
### Locus Testnet V2는 안정성 향상을 위해 재부팅됩니다.
모든 데이터가 초기화됩니다.
이전 테스트 단계에서 생성된 모든 NFT와 토큰은 체인이 재시작됨에 따라 삭제됩니다.
네트워크 초기화로 인해 모든 참여자는 테스트를 계속 진행하기 위해 노드와 지갑을 업데이트하고, 새로운 계정을 생성해야 합니다.
Locus Chain 네트워크의 지속적인 개선을 지원해 주셔서 감사합니다. :rocket:
## **2026.02.26**
### Locus Chain Testnet V2 Update
- 13일 Testnet V2 출시 이후, 지난 주말에 확인된 버그가 성공적으로 해결되었습니다.
- 이번 업데이트의 일환으로 네트워크 상태가 초기화(reset)됩니다.
체인이 재시작됨에 따라, 이전 테스트 기간 동안 생성된 모든 NFT와 토큰은 삭제됩니다.
네트워크 초기화로 인해 모든 참여자는 테스트를 계속 진행하기 위해 노드와 지갑을 업데이트하고, 새로운 계정을 생성해야 합니다.
- Locus Chain 네트워크의 지속적인 개선을 지원해 주셔서 감사합니다. :rocket:
## **2026.02.13**
### Testnet 2: Protocol Hardening & High-Performance Architecture
### 1. 차세대 보안 엔진 및 프라이버시 (Advanced Security & Privacy)
공격자의 예측 가능성을 최소화하고, 네트워크 진입부터 활동까지의 경로를 비식별화했습니다.
- **Agile Sub-epoch Reshuffling (1-step)**
기존의 에포크 단위 재배치(2-step)를 넘어, 에포크 내에서도 더 세분화된 하위 단위로 노드를 즉각 교체하는 1단계(1-step) 프로세스를 구현했습니다. 이를 통해 공격자가 특정 샤드 내에서 공모(Collusion)를 모의할 시간적 여유를 차단합니다.
- **Zero-Entry Privacy Layer (New)**
채널 진입 단계부터 암호화 절차를 적용하여, 외부 관측자가 특정 노드의 신원이나 활동 여부를 쉽게 파악할 수 없도록 설계했습니다.
- **Post-Quantum Secure Channel**
P2P 계층에 PQC(양자 내성 암호) 키 교환 절차를 선제적으로 도입하여, 미래의 양자 컴퓨팅 위협으로부터 통신 채널의 기밀성을 보호합니다.
- **Committee Anonymity (Ring Signatures)**
위원회 내부 통신에 링 서명을 적용, 개별 노드의 활동 이력을 비식별화하여 타겟형 DoS 공격의 리스크를 낮추었습니다.
### 2. 고성능 네트워크 아키텍처 (Network Topology & Performance)
구조적 혁신과 전송 알고리즘의 최적화를 통해 실전 환경에서의 확장성을 증명합니다.
- **Patent-Pending 'Patricia Hypercube'**
샤드 경계와 관계없이 특정 노드 간의 고속 통신 경로를 확보하는 오버레이 네트워크에 사용되는 토폴로지로, 샤드 간 데이터 전파 및 동기화 지연을 획기적으로 단축했습니다. _(특허 출원 중)_
- **Optimized Push-Pull Gossip (New)**
가십 전파 알고리즘을 Push-Pull 방식으로 고도화하여 불필요한 네트워크 부하를 제거하고, 대규모 노드 환경에서도 동기화 정밀도와 속도를 동시에 달성했습니다.
- **Partition Resilience (Integrity Channel)**
글로벌 네트워크 분단 상황을 실시간 감지하고 대응하는 전용 채널을 통해, 극단적인 네트워크 환경에서도 가용성을 보장합니다.
### 3. 거버넌스 및 미래 확장성 (Governance & Future-Proofing)
진입 장벽을 낮추고 장기적인 레이어 확장을 위한 기술적 초석을 다졌습니다.
- **VRF-based Meritocratic Selection**
VRF 기반의 위원회 선출 및 순환 시스템을 통해 최소 스테이킹 장벽을 제거하고, 모든 참여자에게 공정한 인센티브 기회를 제공하는 진정한 탈중앙화를 실현했습니다.
- **State Management Efficiency (Retire/Revive)**
휴면 계정의 퇴출(Retire) 및 복구(Revive) 기능을 통해 네트워크 상태값(State)의 비대를 막고 시스템 리소스를 최적으로 관리합니다.
- **Next-Gen Consensus Foundation**
멀티레이어 샤딩 확장을 위한 **Cascading BFT** 합의 알고리즘을 구축하여 향후 대규모 확장을 위한 학술적/기술적 토대를 마련했습니다. _(논문 발표 예정)_
---
# References Overview
Source: https://docs.testnet2.locuschain.com/docs/references/
# References Overview
## Locus JSON-RPC
[Locus JSON-RPC](rpc)
## Locus library
[Locus library](lclib)
## Locus Core Script
[Locus Core Script](corescript)
## Locus Wallet API
[Locus Wallet API](wallet)
---
# Locus JSON-RPC
Source: https://docs.testnet2.locuschain.com/docs/references/rpc
# Locus JSON-RPC
## JSON RPC가 무엇일까요?
JSON-RPC는 클라이언트가 JSON 형식의 요청 메시지를 노드에 전송하여 노드는 이를 처리하고 결과를 JSON 형식의 응답 메시지로 반환합니다.
원격 프로시저 호출(Remote Procedure Call) 프로토콜의 약자로써, 통신을 위한 방식입니다.
## 로커스체인 RPC
Locus Chain 노드는 JSON-RPC API를 제공합니다. 개인이 실행하거나 몇몇의 공적인 서비스로 제공되는 노드를 통해 사용자는 쉽게 블록체인 네트워크의 정보를 조회할 수 있습니다.
## 호출
### 단순 조회용 RPC 호출
한 번의 호출로 결과를 받을 수 있습니다.
### Tx를 생성하는 RPC 호출
파라메트에 'Sig'가 포함되어 있으면 Tx를 생성하는 RPC입니다.
동일한 RPC를 두 번 호출합니다.
아래와 같이 4단계로 진행하십시오.
- [STEP1: 첫번째 호출] 노드에서 Tx와 Hash를 받습니다.
- [STEP2: Tx 검증] 받은 Tx를 로커스 라이브러리의 VerifyTx 함수로 검증합니다.
- [STEP3: 서명] Tx에 이상이 없으면 로커스 라이브러리나 지갑을 통해 서명을 합니다.
- [STEP4: 두 번째 호출] 첫번째 호출 파라메트에 서명을 추가하여 두번째 호출을 하면 Tx가 생성됩니다.
## RPC 호출 예시
```json
{
"jsonrpc": "2.0",
"method": "locus_getAccountDetail",
"params": [{ "account": "D4YLP5B3NC3RWVXYDWFPCT6IG2ASCVP32ANLOAD73I" }],
"id": 1
}
```
## 공통 응답 형식
기본적인 응답값은 다음과 같은 형식을 가집니다.
호출된 Function에 따라 `result` 값이 변경됩니다.
**성공**
```json
{
"jsonrpc": "2.0",
"id": 1, // int
"result": {} // any
}
```
**실패**
```json
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": 1, // int
"message": "" // string
}
}
```
## 함수 목록
---
### locus_echo
RPC 호출에 대해 노드가 응답을 잘 하는지 확인하는 용도로 사용할 수 있습니다.
입력값에 현재 시간을 추가하여 응답합니다.
#### Request
| Key | Type | Description |
| --- | ------ | ----------- |
| str | string | 문자열 |
#### Response
| Key | Type | Description |
| --- | ------ | ----------------------- |
| - | string | 입력 문자열 + 현재 시간 |
---
### locus_getSyncState
노드의 현재 동기화 상태를 구합니다.
#### Request
[없음]
#### Response
| Key | Type | Description |
| --------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| syncState | string | NODE_STATE_IN_INIT NODE_STATE_IN_SYNC NODE_STATE_IN_RESYNC NODE_STATE_SYNC_COMPLETE NODE_STATE_STABLE Unknown NodeState |
---
### locus_getGenesisAccount
제네시스 계정의 주소를 구합니다.
#### Request
[없음]
#### Response
| Key | Type | Description |
| ------- | ------ | -------------------- |
| genesis | base32 | 제네시스 계정의 주소 |
---
### locus_openAccount
계정을 로커스체인 네트워크에 등록합니다.
#### Request
| Key | Type | Description |
| ------------ | -------- | ----------------------- |
| account | base32 | 대상 계정 주소 |
| sender | base32 | 코인을 보낸 계정 |
| index | int | 코인을 보낸 Tx의 height |
| args | []string | Arguments |
| pk | base32 | Normal public key |
| keySign | base32 | Key signature |
| mpk | base32 | Master public key |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_becomeHost
지정한 계정을 해당 노드의 호스트로 설정합니다.
지정한 계정은 게스트가 없어야 하고, 해당 노드는 호스트가 없는 빈 노드여야 합니다.
#### Request
| Key | Type | Description |
| ------------ | ------ | ----------------------- |
| account | base32 | 호스트가 될 계정 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_becomeGuest
지정한 계정을 해당 노드의 게스트로 설정합니다.
지정한 계정은 게스트가 없어야 하고, 해당 노드는 호스트가 존재해야 합니다.
#### Request
| Key | Type | Description |
| ------------ | ------ | ----------------------- |
| account | base32 | 게스트가 될 계정 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_changeKey
계정의 노말키를 변경합니다.
#### Request
| Key | Type | Description |
| --------------- | ------ | ----------------------------------------------------- |
| account | base32 | 키를 변경할 계정 |
| masterPkey | base32 | Master public key |
| newNormalPkey | base32 | New Normal public key |
| signByMasterKey | base64 | New Normal public key를 Master public key로 서명한 값 |
| sign | base64 | 서명 |
| signedHeight | int | 두번째 호출 파라미터에 포함될 tx height |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_transferCoin
코인을 다른 계정에 보냅니다.
#### Request
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| from | base32 | 보내는 계정 |
| to | base32 | 받는 계정 |
| amount | string | 보낼 수량 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_getTx
계정의 특정 Height의 Tx 정보를 구합니다.
#### Request
| Key | Type | Description |
| ------- | ------ | ------------- |
| account | base32 | 계정 |
| height | int | 계정의 Height |
#### Response
| Key | Type | Description |
| --- | ------ | ----------- |
| tx | string | Tx 정보 |
---
### locus_getAccountHistory
계정의 Tx 목록을 구합니다.
#### Request
| Key | Type | Description |
| ------- | ------ | -------------------------------------------------------------- |
| account | base32 | 계정 |
| height | int | 구하고자 하는 시작 Height Height가 -1이면, 최상위 Tx 부터. |
| count | int | 구하고자 하는 Tx 갯수 (시작 위치에서 이전 몇개) |
#### Response
| Key | Type | Description |
| --- | -------- | -------------- |
| txs | []string | Tx string list |
---
### locus_getAccountDetail
계정의 상세정보를 구합니다.
#### Request
| Key | Type | Description |
| ------- | ------ | ----------- |
| account | base32 | 계정 |
#### Response
| Key | Type | Description |
| -------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| identity | string | Host : 해당 노드의 호스트 계정 Guest : 해당 노드의 게스트 계정 Neighbor : 해당 노드가 속한 샤드의 이웃 계정. 질의 당시의 상태이며, 동기 상태에 따라서 부정확한 값일 수도 있다. no identity : 위의 것에 아무 것도 해당되지 않음, 즉 존재하지 않거나, 다른 샤드에 속했거나 |
| fromNoAlive | bool | OpenAccount 를 했지만, 아직 합의에 포함되지 않은 경우에 이 flag 가 true 가 된다. |
| balance | string | 보유한 로커스 코인 |
| unactBalance | string | 아직은 Activate 되지 않아 사용할 수 없는 Balance |
| representative | base32 | 위임한 계정 (Host 계정) |
| grant | uint64 | 보유한 Grant |
| publicKey | base32 | 계정의 Normal public key |
| txChainHeight | int | 계정의 Height |
| txLink | string | 마지막 Tx link |
---
### locus_getWorldRoundStatesList
World Round State (WRS) 목록을 구합니다.
#### Request
| Key | Type | Description |
| ----- | ---- | ------------------------------------------------------ |
| round | int | 구하고자 하는 시작 Round |
| count | int | 구하고자 하는 갯수 (시작 위치에서 이전 몇개), Max 500. |
#### Response
| Key | Type | Description |
| ------------- | ----- | ----------- |
| nextRoundList | []int | WRS 목록 |
---
### locus_getWorldRoundState
World Round State (WRS) 상세 정보를 구합니다.
#### Request
| Key | Type | Description |
| ----- | ---- | ------------------- |
| round | int | 구하고자 하는 Round |
#### Response
| Key | Type | Description |
| ---------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| nextRound | int | Round |
| addShardRound | int | 0 : 샤드 분할 예정 없음. 1 : 샤드 분할해야 하는 상황이지만, 언제인지 정해지지 않았음. 2 이상 : 해당 Round에 샤드 분할 예정됨. |
| rootAcctHash | string | |
| worldInfoHash | string | |
| currentHash | string | |
| prevLink | string | |
| prevNextRound | int | |
| sigHash | string | 아래 서명 정보의 해시값. 아래의 서명 정보는 프루닝 될 수 있다. |
| validatorsWeight | int | Validator의 Weight 총합 |
| validators | []types.Validator | `{Validator's Addr, Weight, Sign}` |
**types.Validator**
| Key | Type | Description |
| --- | --- | --- |
| addr | base32 | 검증자 주소 |
| weight | uint16 | 가중치 |
| sign | string | 서명 |
---
### locus_getInactiveTxList
계정의 아직 Activate되지 않은 Tx 목록을 구합니다.
#### Request
| Key | Type | Description |
| ------- | ------ | ----------- |
| account | base32 | 계정 |
#### Response
| Key | Type | Description |
| --------------- | -------------------------------- | ----------------------------------------------------------------- |
| timeOutTxs | []types.ListTx | 1차 Target 이 Activation 하지 않아, Time out 되어 들어온 Tx 목록. |
| txs | []types.ListTx | Sender 쪽의 합의가 완료된 Tx 목록. |
| unconfirmedTxs | []types.ListTx | Sender 쪽의 합의를 대기중인 Tx 목록. |
| pendingTxs | []types.ListTx | Propose 된지 10초 미만의 Tx 목록. |
| unspreadTxs | []types.ListTx | Unspread Tx 목록. |
| conflictedTxs | []types.ListTx | 충돌난 Tx 목록. |
| contractResults | types.ContractResults | Contract results |
**types.ListTx**
| Key | Type | Description |
| --- | --- | --- |
| sender | base32 | 보낸 계정 |
| index | int | 인덱스 |
| tx | string | Tx 내용 |
| vtx | object | 상세 Tx 정보 |
**types.ContractResults**
| Key | Type | Description |
| --- | --- | --- |
| pending | []types.ListTx | Pending 상태의 Tx 목록 |
| conflicting | []types.ListTx | 충돌난 Tx 목록|
---
### locus_getMontInfoList
계정의 Mont(MOnitoring seNT) 목록을 구합니다.
노드의 호스트/게스트 계정의 것만 구할 수 있습니다.
#### Request
| Key | Type | Description |
| ------- | ------ | ----------- |
| account | base32 | 계정 |
#### Response
| Key | Type | Description |
| ---------- | --------------- | ---------------------------------- |
| proofedTxs | []types.MontTx | Sender 쪽의 합의가 완료된 Tx 목록. |
| pendingTxs | []types.MontTx | Propose만 된 Tx 목록. |
**types.MontTx**
| Key | Type | Description |
| --- | --- | --- |
| index | int | 인덱스 |
| tx | string | Tx 내용 |
---
### locus_createToken
시스템 토큰을 생성합니다.
계정당 하나의 시스템 토큰을 생성할 수 있습니다.
#### Request
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| account | base32 | 토큰을 생성할 계정 |
| tokenBalance | string | 생성할 토큰 갯수 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_transferToken
토큰을 다른 계정에 보냅니다.
#### Request
| Key | Type | Description |
| ------------ | -------------------------- | ----------------------- |
| from | base32 | 토큰을 보내는 계정 |
| to | base32 | 토큰을 받을 계정 |
| amount | string | 보낼 수량 |
| tokenAmounts | []types.TokenAmount | 보낼 토큰 목록 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
| source | types.Source | Source |
**types.TokenAmount**
| Key | Type | Description |
| --- | --- | --- |
| tokenId | string | 토큰 ID |
| amountToken | string | 토큰 수량 |
**types.Source**
| Key | Type | Description |
| --- | --- | --- |
| owner | string | 소유자 |
| height | int | 높이 |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_getAccountTokenList
계정이 소유한 토큰 목록과 Balance를 구합니다.
#### Request
| Key | Type | Description |
| ------- | ------ | ------------------ |
| account | base32 | 토큰을 생성할 계정 |
#### Response
| Key | Type | Description |
| --------- | ----------------- | ------------------------ |
| tokenList | map[base32]string | \{\"TokenID\": Balance\} |
---
### locus_hasSystemToken
계정이 생성한 시스템 토큰이 존재하는 여부와 존재하면 토큰 ID를 구합니다.
#### Request
| Key | Type | Description |
| ------- | ------ | ----------- |
| account | base32 | 계정 |
#### Response
| Key | Type | Description |
| ------- | ------ | --------------------------------------------- |
| having | bool | 시스템 토큰이 존재하는지 여부 |
| tokenId | string | Having 이 true 이면, 시스템 토큰 ID를 돌린다. |
---
### locus_postData
데이터를 게시합니다.
#### Request
| Key | Type | Description |
| ------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| account | base32 | 계정 |
| label | int | 체인 내에서 같은 라벨의 Tx끼리 링크됨. 해당 Tx에 대해 Proof를 Verify할 때 같은 라벨의 더 최신의 Tx가 있는지를 확인하는 용도로 사용됨. |
| data | base64 | 게시할 데이터 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_readTxListWithProof
계정의 Tx 목록과 Proof를 함께 구합니다.
#### Request
| Key | Type | Description |
| ---------- | ------ | -------------------------------------------- |
| account | base32 | 계정 |
| baseHeight | int | 시작 Height |
| count | uint | 구하고자 하는 갯수 (시작 위치에서 이전 몇개) |
#### Response
| Key | Type | Description |
| ------------ | -------- | ----------------------------- |
| account | base32 | 계정 |
| txs | []string | Tx string 목록 |
| proof | string | 요청한 Tx 목록의 Merkle Proof |
| checkRoundP1 | int | Proof 가 생성된 Round + 1 |
---
### locus_verifyTxListWithProof
Tx 목록의 Proof를 검증합니다.
#### Request
| Key | Type | Description |
| ------------ | ----------- | ----------------------------- |
| account | base32 | 계정 |
| txs | []string | 검증할 Tx 목록 |
| proof | MerkleProof | 검증할 Tx 목록의 Merkle Proof |
| checkRoundP1 | int | proof 가 생성된 Round + 1 |
#### Response
| Key | Type | Description |
| --- | ---- | -------------- |
| - | bool | 검증 성공 여부 |
---
### locus_generateLatestStoredDataProof
특정 label의 TxPostData가 가장 최신인지 증명하는 Proof를 생성합니다.
#### Request
| Key | Type | Description |
| ------- | ------ | ----------------------------------------- |
| account | base32 | 계정 |
| height | int | Proof를 생성할 첫번째 TxPostData의 height |
#### Response
| Key | Type | Description |
| ----------- | ------ | ------------------------------------------------ |
| account | base32 | 계정 |
| latestProof | string | Tx가 최신 StoredDataHash에 포함되어 있다는 Proof |
---
### locus_verifyLatestStoredDataProof
locus_generateLatestStoredDataProof RPC로 생성한 Proof를 검증합니다.
#### Request
| Key | Type | Description |
| ----------- | ------ | ------------------------------------------------ |
| account | base32 | Tx 목록의 Proof를 생성할 계정 |
| latestProof | string | Tx가 최신 StoredDataHash에 포함되어 있다는 Proof |
#### Response
| Key | Type | Description |
| --- | ---- | -------------- |
| - | bool | 검증 성공 여부 |
---
### locus_lockStake
Stake를 Lock합니다.
#### Request
| Key | Type | Description |
| ------------ | ------ | ----------------------------------------------- |
| account | base32 | 계정 |
| vmeId | base32 | VME ID |
| lockAmount | uint32 | Lock할 Stake 수량 (1 UnitStakeLock = 100 Locus) |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_unlockStake
Stake를 unlock합니다.
#### Request
| Key | Type | Description |
| ------------ | ------ | -------------------------------------------- |
| account | base32 | 계정 |
| vmeId | base32 | VME ID |
| unlockAmount | uint32 | Unlock할 Stake (1 UnitStakeLock = 100 Locus) |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_provideScript
Core Script를 배포합니다.
#### Request
| Key | Type | Description |
| ------------------- | -------------------------- | ---------------------------------------------------------------------------------------------- |
| provider | base32 | 배포할 계정 |
| target | base32 | Time lock 이내에 Core script를 실행하여, provider가 send한 coin 이나 token을 activation할 계정 |
| targetAfterTimeLock | base32 | Time lock 이후에 provider가 send한 coin 이나 token을 자동으로 activation할 계정 |
| timeLock | int | Time lock 이 걸리는 round duration, 현재 Max = 30, Min = 3 으로 설정되어 있음. |
| args | []hex | Target이 provider의 script (ScriptSig)를 실행할 때, 사용될 아규먼트, 최대 4개까지 입력가능. |
| scriptProvide | hex | Target이 실행할 provider의 script, 현재 MaxSize = 32 bytes |
| scriptAccept | hex | Target이 실행할 target의 script, 현재 MaxSize = 32 bytes |
| amount | string | Target이 Core script 실행에 성공할 경우, activation 시킬 수 있는 coin amount |
| tokenAmounts | []types.TokenAmount | Target이 Core script 실행에 성공할 경우, activation 시킬 수 있는 token amounts |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
**types.TokenAmount**
| Key | Type | Description |
| --- | --- | --- |
| tokenId | string | 토큰 ID |
| amountToken | string | 토큰 수량 |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_acceptScript
Core Script를 실행합니다.
#### Request
| Key | Type | Description |
| ------------ | ------ | --------------------------------------------------------------------------------------------------------------------- |
| acceptor | base32 | TxProvideScript에서 Target으로 지정된, Core Script를 activation 시킬 계정 Time lock 이내에만 activation이 가능함. |
| provider | base32 | TxProvideScript를 배포한 계정 |
| index | int | LeadTx(TxProvideScript)의 height |
| args | []hex | Target이 Target의 script (ScriptSig)를 실행할 때 사용될 아규먼트., 최대 4개까지 입력가능. |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_queryAddress
Key Address로 Full Address를 조회합니다.
#### Request
| Key | Type | Description |
| ---- | ------ | ----------- |
| addr | base32 | Key Address |
#### Response
| Key | Type | Description |
| ---- | ------ | ------------ |
| addr | base32 | Full Address |
---
### locus_accountHeightsToDownload
동기화할 계정 블록 높이 목록 조회
#### Request
| Key | Type | Description |
| ------------ | ----------------------- | ----------------- |
| account | base32 | 계정 |
| heightChunks | []types.HeightChunk | Height Chunk 목록 |
**types.HeightChunk**
| Key | Type | Description |
| --- | --- | --- |
| bottom | int | 하한 |
| top | int | 상한 |
#### Response
| Key | Type | Description |
| ------------ | ----------------------- | ----------------- |
| heightChunks | []types.HeightChunk | Height Chunk 목록 |
---
### locus_accountHeightsToUpload
업로드할 계정 블록 높이 목록 조회
#### Request
| Key | Type | Description |
| ------------ | ----------------------- | ----------------- |
| account | base32 | 계정 |
| heightChunks | []types.HeightChunk | Height Chunk 목록 |
**types.HeightChunk**
| Key | Type | Description |
| --- | --- | --- |
| bottom | int | 하한 |
| top | int | 상한 |
#### Response
| Key | Type | Description |
| ------------ | ----------------------- | ----------------- |
| heightChunks | []types.HeightChunk | Height Chunk 목록 |
| validTop | int | 유효한 Top |
| validBottom | int | 유효한 Bottom |
---
### locus_calculateSpentByExpress
Express로 소비된 금액 계산
#### Request
| Key | Type | Description |
| ---------- | ------ | ----------- |
| account | base32 | 계정 |
| sender | base32 | 보낸 계정 |
| sentHeight | int | 보낸 Height |
#### Response
| Key | Type | Description |
| ------ | ------ | ----------- |
| amount | string | 수량 |
---
### locus_changeVkey
검증자 키(VKey) 변경
#### Request
| Key | Type | Description |
| ------------ | ------ | ----------------------- |
| account | base32 | 계정 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_checkAddressExist
주소 존재 여부 확인
#### Request
| Key | Type | Description |
| ------- | ------ | ----------- |
| keyAddr | base32 | Key 주소 |
#### Response
| Key | Type | Description |
| ----- | ------ | ----------- |
| addr | base32 | Address |
| exist | bool | 존재 여부 |
---
### locus_clientMessage
클라이언트 메시지 전송
#### Request
| Key | Type | Description |
| --- | ------ | ----------- |
| msg | string | 메시지 |
#### Response
| Key | Type | Description |
| --- | ---- | ----------- |
| - | any | 결과 |
---
### locus_closeAccount
계정 폐쇄
#### Request
| Key | Type | Description |
| ------------ | ------ | ----------------------- |
| from | base32 | From Account |
| to | base32 | To Account |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_createAssetObject
자산 객체 생성
#### Request
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| account | base32 | 계정 |
| assetType | string | 자산 타입 |
| amount | string | 수량 |
| operator | string | 운영자 |
| metaData | string | 메타데이터 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_createVme
VME(Virtual Machine Environment) 생성
#### Request
| Key | Type | Description |
| ------------ | ------ | ----------------------- |
| account | base32 | 계정 |
| sysId | base32 | 시스템 ID |
| sysType | string | 시스템 타입 |
| lockAmount | string | Lock 수량 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_downloadAccountTxs
계정 트랜잭션 다운로드
#### Request
| Key | Type | Description |
| ------------ | ----------------------- | ----------------- |
| account | base32 | 계정 |
| heightChunks | []types.HeightChunk | Height Chunk 목록 |
**types.HeightChunk**
| Key | Type | Description |
| --- | --- | --- |
| bottom | int | 하한 |
| top | int | 상한 |
| heights | []int | Heights |
#### Response
| Key | Type | Description |
| ------- | -------- | ----------- |
| heights | []int | Height 목록 |
| txs | []string | Tx 목록 |
---
### locus_findDuplicateSubscriber
중복 구독자 확인
#### Request
| Key | Type | Description |
| --------- | ------ | ----------- |
| published | string | 게시자 |
#### Response
| Key | Type | Description |
| ----- | ---- | ----------- |
| exist | bool | 존재 여부 |
---
### locus_getAccountAssetList
계정 자산 목록 조회
#### Request
| Key | Type | Description |
| -------- | ------ | ----------- |
| account | base32 | 계정 |
| maxCount | int | 최대 갯수 |
#### Response
| Key | Type | Description |
| --------- | ------------------------------------------------------- | ----------- |
| assetList | []types.AccountAsset | 자산 목록 |
**types.AccountAsset**
| Key | Type | Description |
| --- | --- | --- |
| assetId | string | 자산 ID |
| amount | string | 수량 |
| objects | []types.AssetObject | 자산 객체 목록 |
| unactAmount | string | 비활성 수량 |
| unactObjects | []types.AssetObject | 비활성 자산 객체 목록 |
**types.AssetObject**
| Key | Type | Description |
| --- | --- | --- |
| id | string | 자산 객체 ID |
| value | string | 값 |
| owner | base32 | 소유자 |
| operator | base32 | 운영자 |
| rentStart | int | 임대 시작 Height |
| rentEnd | int | 임대 종료 Height |
---
### locus_getAccountAssetObject
계정 자산 객체 조회
#### Request
| Key | Type | Description |
| ------- | -------- | ------------ |
| account | base32 | 계정 |
| assetId | []string | 자산 ID 목록 |
#### Response
| Key | Type | Description |
| ------------ | --------------- | ---------------- |
| objects | []types.AssetObject | 객체 목록 |
| unactObjects | []types.AssetObject | 비가용 객체 목록 |
**types.AssetObject**
| Key | Type | Description |
| --- | --- | --- |
| id | string | 자산 객체 ID |
| value | string | 값 |
| owner | base32 | 소유자 |
| operator | base32 | 운영자 |
| rentStart | int | 임대 시작 Height |
| rentEnd | int | 임대 종료 Height |
---
### locus_getConciseNodeStatus
간략한 노드 상태 조회
#### Request
[없음]
#### Response
| Key | Type | Description |
| -------------- | ------ | ---------------- |
| nodeId | base32 | 노드 ID |
| host | base32 | 호스트 |
| reliable | bool | reliable 여부 |
| round | int | 라운드 |
| epoch | int | Epoch |
| shardId | int | 샤드 ID |
| networkId | int | 네트워크 ID |
| totalHeight | string | 총 Height |
| intraPeerCount | int | 내부 피어 수 |
| interPeerCount | int | 외부 피어 수 |
| syncState | string | 동기화 상태 |
| detailState | string | 상세 상태 |
| presyncState | string | 사전 동기화 상태 |
| buildTime | string | 빌드 시간 |
| rsNextRound | int | RS 다음 라운드 |
| wrsNextRound | int | WRS 다음 라운드 |
---
### locus_getNodeStatus
노드 상태 조회
#### Request
[없음]
#### Response
| Key | Type | Description |
| -------------- | ------ | ---------------- |
| nodeId | base32 | 노드 ID |
| baseTime | int | 기준 시간 |
| host | base32 | 호스트 |
| reliable | bool | reliable 여부 |
| roundTime | int | 라운드 시간 |
| roundCycle | int | 라운드 주기 |
| prunedRound | int | Pruned 라운드 |
| round | int | 라운드 |
| epoch | int | Epoch |
| shardId | int | 샤드 ID |
| homeShardId | int | 홈 샤드 ID |
| totalShard | int | 총 샤드 수 |
| networkId | int | 네트워크 ID |
| totalHeight | string | 총 Height |
| intraPeerCount | int | 내부 피어 수 |
| interPeerCount | int | 외부 피어 수 |
| syncState | string | 동기화 상태 |
| detailState | string | 상세 상태 |
| presyncState | string | 사전 동기화 상태 |
| buildTime | string | 빌드 시간 |
| avgTxTime | string | 평균 Tx 시간 |
| rsNextRound | int | RS 다음 라운드 |
| rsf | int | RSF |
| vmInfo | string | VM 정보 |
| wrsNextRound | int | WRS 다음 라운드 |
| wrsHeight | int | WRS Height |
---
### locus_getOwnerBalance
소유자 잔액 조회
#### Request
[없음]
#### Response
| Key | Type | Description |
| --- | ---------------------------------- | ---------------- |
| - | []types.OwnerBalance | 소유자 잔액 목록 |
**types.OwnerBalance**
| Key | Type | Description |
| --- | --- | --- |
| account | string | 계정 |
| balance | string | 잔액 |
---
### locus_getRoundState
라운드 상태 조회
#### Request
| Key | Type | Description |
| ----- | ---- | ----------- |
| round | int | Round |
#### Response
| Key | Type | Description |
| ---------------- | --------------- | ------------------- |
| nextRound | int | 다음 라운드 |
| prevNextRound | int | 이전 다음 라운드 |
| hash | string | 해시 |
| totalHeight | int | 총 Height |
| proposer | base32 | 제안자 |
| validatorsWeight | int | 검증자 가중치 |
| validators | []types.VoteInfoRPC | 검증자 목록 |
| incentiveExist | bool | 인센티브 존재 여부 |
| totalIncentive | string | 총 인센티브 |
| startRound | int | 시작 라운드 |
| endRound | int | 종료 라운드 |
| newEpoch | int | 새로운 Epoch |
| newEpochRound | int | 새로운 Epoch 라운드 |
**types.VoteInfoRPC**
| Key | Type | Description |
| --- | --- | --- |
| addr | base32 | 검증자 주소 |
| weight | uint16 | 가중치 |
| sign | string | 서명 |
---
### locus_getRoundStatesList
라운드 상태 목록 조회
#### Request
| Key | Type | Description |
| ----- | ---- | ----------- |
| round | int | Round |
| count | int | 갯수 |
#### Response
| Key | Type | Description |
| --- | ---------------------- | ---------------- |
| - | []types.RoundStateAbstract | 라운드 상태 목록 |
**types.RoundStateAbstract**
| Key | Type | Description |
| --- | --- | --- |
| round | int | 라운드 |
| hash | string | 해시 |
| totalHeight | int | 총 Height |
---
### locus_getShardOfAccount
계정의 샤드 정보 조회
#### Request
| Key | Type | Description |
| ------- | ------ | ----------- |
| account | base32 | 계정 |
#### Response
| Key | Type | Description |
| ---------- | ---- | -------------- |
| shard | int | 샤드 |
| acceptable | bool | 수용 가능 여부 |
---
### locus_makeTxProof
트랜잭션 증명 생성
#### Request
| Key | Type | Description |
| ------- | -------- | ----------- |
| account | base32 | 계정 |
| txs | []string | Tx 목록 |
| count | int | 갯수 |
#### Response
| Key | Type | Description |
| ------------ | -------- | ----------------------------- |
| account | base32 | 계정 |
| txs | []string | Tx string 목록 |
| proof | string | 요청한 Tx 목록의 Merkle Proof |
| checkRoundP1 | int | Proof 가 생성된 Round + 1 |
---
### locus_requestDataTrade
데이터 거래 요청
#### Request
| Key | Type | Description |
| ------------ | ------ | ----------------------- |
| requester | base32 | 요청자 |
| dataType | int | 데이터 타입 |
| reqHash | string | 요청 해시 |
| reward | string | 보상 |
| key | string | 키 |
| trader | base32 | 거래자 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
| key | string | 키 |
| target | string | 타겟 |
---
### locus_setHost
호스트 설정
#### Request
| Key | Type | Description |
| ------- | ------ | ----------- |
| account | base32 | 계정 |
| otp | string | OTP |
#### Response
| Key | Type | Description |
| --- | ---- | ----------- |
| - | bool | 성공 여부 |
---
### locus_subscribeAddress
구독
#### Request
| Key | Type | Description |
| --------- | ------ | ----------- |
| published | string | 게시자 |
| add | bool | 추가 여부 |
#### Response
[없음]
---
### locus_transferAssetObject
자산 객체 전송
#### Request
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| from | base32 | 보내는 계정 |
| to | base32 | 받는 계정 |
| assetId | string | 자산 ID |
| amount | string | 수량 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_transferCoinExpress
Express 코인 전송
#### Request
| Key | Type | Description |
| ------------ | -------------------------- | ------------------------------- |
| from | base32 | 보내는 계정 |
| to | base32 | 받는 계정 |
| amount | string | 수량 |
| sign | base64 | 서명 |
| signedHeight | int | 1차 응답의 signedHeight |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
| source | types.Source | 자금 출처 |
**types.Source**
| Key | Type | Description |
| --- | --- | --- |
| owner | string | 소유자 |
| height | int | 높이 |
#### Response
| Key | Type | Description |
| ------------ | ------ | ------------------------------- |
| hash | base64 | Tx Hash |
| tx | object | 생성된 Tx |
| success | bool | 성공 여부 |
| signedHeight | int | 서명된 tx height |
| feeType | int | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### locus_uploadAccountTxs
계정 트랜잭션 업로드
#### Request
| Key | Type | Description |
| ------- | -------- | ----------- |
| account | base32 | 계정 |
| txs | []string | Tx 목록 |
#### Response
| Key | Type | Description |
| --- | ----- | ----------- |
| - | []int | 결과 |
---
# Locus Library
Source: https://docs.testnet2.locuschain.com/docs/references/lclib
```mdx-code-block
```
# Locus Library
서비스에 로커스 체인을 적용할때 필요한 함수가 포함된 라이브러리를 제공합니다
다음과 같은 기능이 포함되어 있습니다.
- 키를 생성하거나 불러옵니다.
- 데이터를 형식을 변환합니다.
- 트랜잭션을 검증합니다.
- 프라이빗 키로 서명합니다.
## 설치 방법
```bash npm2yarn
npm i @locuschain/lib
```
## 사용 방법
LocusLib.`function`(`param1`, `param2`, ... )
- **function:** 함수명
- **param:** 매개 변수
```typescript
const result = getLibraryVersions()
console.log(result)
```
## Functions
---
### getLibraryVersions
GetLibraryVersion은 이 wasm 라이브러리의 버전을 반환합니다.
#### Input
getLibraryVersions( )
[None]
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| LibraryVersion | int | 라이브러리 버전
| KeyStoreVersion | int | 키스토어 버전
| KeyStoreVersionMin | int | 호환되는 최소 키스토어 버전
| GoBuildVersion | string | Library를 빌드한 Golang 버전
---
### createAccountAndKeystore
마스터 키와 노멀 키를 위한 두 개의 별도 키스토어 파일을 생성합니다.
#### Input
createAccountAndKeystore( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.passwordMaster | string | 마스터 키 비밀번호
| params.passwordNormal | string | 노멀 키 비밀번호
| params.algoMaster | string | 마스터 키 알고리즘
| params.algoNormal | string | 노멀 키 알고리즘
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | 마스터 및 노멀 키스토어 문자열
---
### createNormalKey
주어진 주소에 대한 새로운 노멀 키를 생성합니다.
#### Input
createNormalKey( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.addrStr | string | 주소 |
| params.keyAlgo | string | 노멀 키 알고리즘 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | 노멀 키 문자열 |
---
### createMasterKeystore
주어진 주소에 대한 마스터 키스토어를 생성합니다.
#### Input
createMasterKeystore( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.addrStr | string | 주소 |
| params.password | string | 마스터 키 비밀번호 |
| params.mskStr | string | 마스터 비밀 키 |
| params.mpkStr | string | 마스터 공개 키 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | 마스터 키스토어 문자열 |
---
### createNormalKeystore
주어진 주소에 대한 노멀 키스토어를 생성합니다.
#### Input
createNormalKeystore( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.addrStr | string | 주소 |
| params.password | string | 노멀 키 비밀번호 |
| params.nskStr | string | 노멀 비밀 키 |
| params.npkStr | string | 노멀 공개 키 |
| params.mpkStr | string | 마스터 공개 키 |
| params.keySign | string | 키 서명 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | 노멀 키스토어 문자열 |
---
### loadMasterKeystore
마스터 키스토어에서 마스터 키를 반환합니다.
#### Input
loadMasterKeystore( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.passStr | string | 마스터 키 비밀번호 |
| params.ksJson | string | 마스터 키스토어 문자열 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | 마스터 키 문자열|
---
### loadNormalKeystore
노멀 키스토어에서 노멀 키를 반환합니다.
#### Input
loadNormalKeystore ( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.passStr | string | 노멀 키 비밀번호 |
| params.ksJson | string | 노멀 키스토어 문자열 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | 노멀 키 문자열 |
---
### convertToData
다양한 값을 기본 인코딩(base64)으로 디코딩합니다.
#### Input
convertToData( value, valueType )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| value | string |
| valueType | int | valueType : 0(raw string), 1(hex), 2(crc16-base32), 3(base64)
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string |
---
### convertDataTo
기본 인코딩(base64)된 값을 다양한 타입으로 변환합니다.
#### Input
convertDataTo( value, retType )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| value | string |
| retType | int | valueType : 0(raw string), 1(hex), 2(crc16-base32), 3(base64)
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertStringToData
문자열 값을 기본 인코딩(base64)으로 디코딩합니다.
#### Input
convertStringToData( raw )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| raw | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertDataToString
기본 인코딩(base64)된 값을 문자열 값으로 디코딩합니다.
#### Input
convertDataToString ( str )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| str | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertAddressToHex
base32 인코딩된 주소를 hex 값으로 디코딩합니다.
#### Input
convertAddressToHex( addrEncoded )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| addrEncoded | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertHexToAddress
hex 값을 base32 인코딩된 주소로 인코딩합니다.
#### Input
convertHexToAddress( hexString )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| hexString | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string |Result |
---
### convertAddressToData
base32 인코딩된 주소를 기본 인코딩으로 디코딩합니다.
#### Input
convertAddressToData( addrEncoded )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| addrEncoded | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string |Result |
---
### convertDataToAddress
기본 인코딩된 값을 base32 인코딩된 주소로 인코딩합니다.
#### Input
convertDataToAddress( str )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| str | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertBase32ToHex
base32 인코딩된 값을 hex 값으로 디코딩합니다.
#### Input
convertBase32ToHex( encoded )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| encoded | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertHexToBase32
hex 값을 base32 인코딩된 값으로 인코딩합니다.
#### Input
convertHexToBase32( hexString )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| hexString | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertHexToData
hex 인코딩된 값을 기본 인코딩(base64)으로 디코딩합니다.
#### Input
convertHexToData( encoded )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| encoded | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertDataToHex
기본 인코딩(base64)된 값을 hex 인코딩된 값으로 인코딩합니다.
#### Input
convertDataToHex( str )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| str | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertBase32ToData
base32 인코딩된 값을 기본 인코딩(base64)으로 디코딩합니다.
convertBase32ToData( encoded )
#### Input
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| encoded | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertDataToBase32
기본 인코딩(base64)된 값을 base32 인코딩된 값으로 인코딩합니다.
#### Input
convertDataToBase32( str )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| str | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### signByMasterKey
마스터 비밀 키와 메시지로 서명을 생성합니다.
#### Input
signByMasterKey ( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.msk | string | 마스터 비밀 키 |
| params.message | string | 사인할 메시지 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### sign
노멀 비밀 키와 메시지로 서명을 생성합니다.
#### Input
sign( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.sk | string | 노멀 비밀 키 |
| params.message | string | 사인할 메시지 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### verify
메시지와 노멀 공개 키로 서명을 검증한 결과를 반환합니다.
#### Input
verify( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.pk | string | 노멀 공개 키 |
| params.message | string | 검증할 메시지 |
| params.sign | string | 검증할 서명 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### verifyTx
RPC로 생성된 모든 유형의 트랜잭션을 검증합니다.
#### Input
verifyTx( jsonTx )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| jsonTx | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### compileCoreScript
CompileCoreScript는 코어 스크립트 소스 코드를 바이트 코드로 컴파일합니다.
#### Input
compileCoreScript( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.code | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### disCompileCoreScript
DisCompileCoreScript는 코어 스크립트의 바이트 코드를 디컴파일합니다. DisCompileCoreScript는 구문 오류를 감지하지 않습니다.
#### Input
disCompileCoreScript( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.code | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### testCoreScript
TestCoreScript는 TxDataProvide 및 TxDataAccept와 함께 ScriptProvide 및 ScriptAccept를 테스트합니다.
#### Input
testCoreScript( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.scriptProvide | string | 제공 스크립트 코드|
| params.scriptAccept | string | 수락 스크립트 코드|
| params.txDataProvide | types.ParamTxData | 제공 스크립트의 파라미터 |
| params.txDataAccept | types.ParamTxData | 수락 스크립트의 파라미터 |
**types.ParamTxData**
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| round | uint32 |
| height | int32 |
| args | []string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### getDefFromCoreScript
GetDefFromCoreScript는 바이트 코드에서 정의를 가져옵니다.
#### Input
getDefFromCoreScript ( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.code | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### encodeTxNumber
EncodeTxNumber는 숫자 타입 데이터를 []byte로 인코딩합니다.
#### Input
encodeTxNumber ( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.number | string |
| params.type | int |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### encodeTxCurrency
EncodeTxCurrency는 통화를 []byte로 인코딩합니다.
#### Input
encodeTxCurrency( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.currency | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### hash
Hash는 해시 유형에 따라 데이터를 해싱합니다.
#### Input
hash ( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.data | string |
| params.type | int |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### verifyMerkleProof
VerifyMerkleProof는 Hash와 GoalHash로 Proof를 검증합니다.
#### Input
verifyMerkleProof ( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.proof | string |
| params.hash | string |
| params.goalHash | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| | bool | Result |
---
### calculateTxLinkHash
TxLink 해시를 계산합니다.
#### Input
calculateTxLinkHash( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.tx | string | Tx 문자열
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### decodeTxs
DecodeTxs는 노드에서 다운로드한 base64 인코딩된 트랜잭션을 디코딩합니다.
#### Input
decodeTxs ( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.txs | []string | Tx 문자열 배열
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### gzipAndEncode
문자열을 압축한 다음 base64로 인코딩합니다.
#### Input
gzipAndEncode ( str )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| str | string |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### convertCurrency
통화 값을 한 단위에서 다른 단위로 변환합니다.
#### Input
convertCurrency( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.v | string | 값 |
| params.fromUnit | number | 출발 단위 |
| params.toUnit | number | 도착 단위 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### makeCurrency
x와 단위로부터 통화 값을 생성합니다.
#### Input
makeCurrency( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.x | string | 값 |
| params.unit | number | 단위 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### getHomeShard
주어진 계정에 대한 홈 샤드 ID를 반환합니다.
#### Input
getHomeShard( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.account | string | 계정 |
| params.totalShard | number | 총 샤드 수 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | number | Result |
---
### generateMnemonic
지정된 엔트로피 비트 크기로 니모닉 구문을 생성합니다.
#### Input
generateMnemonic( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.entropyBit | number | 엔트로피 비트 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### generateMnemonicBySeed
시드로부터 니모닉 구문을 생성합니다.
#### Input
generateMnemonicBySeed( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.seed | string | 시드 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### deriveKeysFromMnemonic
니모닉 구문에서 키를 파생합니다.
#### Input
deriveKeysFromMnemonic( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.mnemonic | string | 니모닉 |
| params.path | string | 경로 |
| params.atu | number | atu |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### isGrantConsumingTx
트랜잭션 타입이 그랜트를 소비하는지 확인합니다.
#### Input
isGrantConsumingTx( txTypeStr )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| txTypeStr | string | 트랜잭션 타입 문자열 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | GrantConsumeResult | Result |
---
### verifyByMasterKey
마스터 공개 키를 사용하여 서명을 검증합니다.
#### Input
verifyByMasterKey( params )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| params.pk | string | 공개 키 |
| params.message | string | 검증할 메시지 |
| params.sign | string | 서명 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | string | Result |
---
### checkAddressType
주소가 어떤 주소 타입인지 확인합니다.
#### Input
checkAddressType( address )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| address | string | 주소 |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | number | Result |
---
### isAccount
주소 타입이 계정 주소인지 확인합니다.
#### Input
isAccount( addressType )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| addressType | number | 주소 타입 (AddressClass type 참고) |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | boolean | Result |
---
### isContract
주소 타입이 컨트랙트 주소인지 확인합니다.
#### Input
isContract( addressType )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| addressType | number | 주소 타입 (AddressClass type 참고) |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | boolean | Result |
---
### isToken
주소 타입이 토큰 주소인지 확인합니다.
#### Input
isToken( addressType )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| addressType | number | 주소 타입 (AddressClass type 참고) |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | boolean | Result |
---
### isSystemToken
주소 타입이 시스템 토큰 주소인지 확인합니다.
#### Input
isSystemToken( addressType )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| addressType | number | 주소 타입 (AddressClass type 참고) |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | boolean | Result |
---
### loadLocusWasm
Locus WASM 모듈을 로드합니다.
#### Input
loadLocusWasm( )
[None]
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | Promise<void> | Result |
---
### loadLocusWasmSync
Locus WASM 모듈을 동기로 로드합니다.
#### Input
loadLocusWasmSync( )
[None]
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| - | void | Result |
---
### verifyTxParams
트랜잭션 파라미터를 검증합니다.
#### Input
verifyTxParams( rpcResult, params, options )
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| rpcResult | types.generatedTx | 노드가 생성한 tx |
| params | object | 검증할 파라미터 |
| options | Options | 옵션 |
**types.generatedTx**
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| hash | string | 트랜잭션 해시 |
| tx | any | 트랜잭션 |
**types.Options**
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| targetTxHash | string\|false |
#### Output
| Key | Type | Description |
| ------------- | ------------- | ------------- |
| result | boolean \| string | 검증 결과 (true/false) 혹은 에러 메시지 |
| reason | string | 실패 사유 |
| field | string | (Option) 실패한 필드명 |
| txHash | string | (Option) 트랜잭션 해시 |
---
# Locus Wallet API
Source: https://docs.testnet2.locuschain.com/docs/references/wallet
```mdx-code-block
```
# Locus Wallet API
## 웹페이지와 지갑 연동
```javascript
if (!window.locus) {
alert('Locus wallet is not installed.');
return;
}
const addr = await window.locus.request('connect').catch(err => {
console.error(err);
});
console.log(addr);
````
## 함수 사용
```typescript
const params = {
assetType: 'asset1',
amount: '1000',
operator: '',
metaData: await window.locus.utils.ConvertStringToData(
'{"imageUrl":"https://foo/test.png"}'
)
};
const result = await window.locus.request('createAssetObject', params).catch(err => {
console.error(err);
});
console.log('createAssetObject result', result);
````
## 이벤트 리스너 등록
```typescript
window.locus.on("accountChanged", (data) => {
console.log(`accountChanged! ${data.addr}`);
});
```
## 함수 목록
---
### connect
대상 사이트와 지갑을 연결합니다.
#### 입력
[없음]
#### 출력
| 키 | 타입 | 설명 |
| --- | ------ | ---------------- |
| addr | string | 연결된 지갑 주소 |
---
### getAccount
대상 사이트와 연결된 계정을 구합니다.
#### 입력
[없음]
#### 출력
| 키 | 타입 | 설명 |
| --- | ------ | --------- |
| - | string | 계정 주소 |
---
### getAccountDetail
계정의 상태를 조회합니다.
#### 입력
[없음]
#### 출력
| 키 | 타입 | 설명 |
| ------ | ------ | --------------------------------------------------------------------------------------------- |
| status | string | 계정 상태 (pending: 오픈어카운트가 완료되지 않은 상태, activated: 오픈어카운트가 완료된 상태) |
| info | object | locus_getAccountDetail rpc 응답값 [Locus JSON-RPC](./rpc#locus_getaccountdetail) |
---
### getBalance
계정이 보유한 코인량을 구합니다.
#### 입력
| 키 | 타입 | 설명 |
| ---- | ------ | --------- |
| addr | string | 계정 주소 |
#### 출력
| 키 | 타입 | 설명 |
| --- | ------ | ------------- |
| - | string | 보유한 코인량 |
---
### getNodeUrl
선택된 네트워크의 RPC url을 구합니다.
#### 입력
[없음]
#### 출력
| 키 | 타입 | 설명 |
| --- | ------ | ------- |
| - | string | RPC url |
---
### sign
Normal private key로 문자열을 서명합니다.
#### 입력
| 키 | 타입 | 설명 |
| ----- | ------ | ----------- |
| input | string | 서명할 대상 |
#### 출력
| 키 | 타입 | 설명 |
| --- | ------ | --------- |
| - | string | 서명 결과 |
---
### addNetwork
새로운 네트워크를 지갑에 등록합니다.
#### 입력
| 키 | 타입 | 설명 |
| -------------- | ------ | --------------------- |
| name | string | 이름 |
| rpcUrl | string | RPC 호출 url |
| currencySymbol | string | 기본 통화 |
| explorerUrl | string | (선택) 익스플로어 url |
#### 출력
| 키 | 타입 | 설명 |
| --- | ------- | --------- |
| - | boolean | 성공 여부 |
---
### transferCoin
코인을 다른 계정으로 보냅니다.
#### 입력
| 키 | 타입 | 설명 |
| ------ | ------ | -------------- |
| to | string | 받을 계정 주소 |
| amount | string | 보낼 코인 수량 |
#### 출력
| 키 | 타입 | 설명 |
| ------------ | ------- | ----------------- |
| hash | string | 트랜잭션 해시 |
| tx | object | 생성된 Tx |
| success | boolean | 성공 여부 |
| signedHeight | number | 서명된 tx height |
| feeType | number | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### transferToken
토큰을 다른 계정으로 보냅니다.
#### 입력
| 키 | 타입 | 설명 |
| ------------ | ------ | ------------------ |
| contractAddr | string | 컨트랙트 주소 |
| to | string | 받는 계정 주소 |
| amount | string | 보낼 토큰 수량 |
| decimal | int32 | 토큰 소수점 자릿수 |
#### 출력
| 키 | 타입 | 설명 |
| ------------ | ------- | ----------------- |
| hash | string | 트랜잭션 해시 |
| tx | object | 생성된 Tx |
| success | boolean | 성공 여부 |
| signedHeight | number | 서명된 tx height |
| feeType | number | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### createContract
Contract를 생성합니다.
#### 입력
| 키 | 타입 | 설명 |
| --------------- | ---------------------------------------- | -------------------------------------------------------------------------------- |
| contractAccount | string | (선택) 생성할 컨트랙트 주소. 입력하지 않으면 새로운 주소로 생성 |
| code | string | 소스의 binary code |
| amount | string | 생성된 contract account에 deposite 해 놓을 코인 creator의 코인에서 차감된다. |
| fuelLimit | uint32 | contract 생성에 소모할 fuel의 한계치 |
| tokenAmounts | []\{TokenID base32, AmountToken string\} | contract에 전송할 token 정보 |
| sysId | base32 |
| until | base32 | 생성 재시도할 최대 라운드 |
#### 출력
| 키 | 타입 | 설명 |
| ------------ | ------- | ---------------------------------------------------------------------------------- |
| hash | string | 트랜잭션 해시 |
| tx | object | 생성된 Tx |
| success | boolean | 성공 여부 |
| signedHeight | number | 서명된 tx height |
| feeType | number | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### callContract
Contract 함수를 실행합니다.
#### 입력
| 키 | 타입 | 설명 |
| --------------- | -------- | ----------------------------------- |
| contractAccount | string | 스마트 컨트랙트 주소 |
| func | string | 함수명 |
| argData | string | 매개 변수 |
| abi | string | 실행할 함수의 abi json 문자열 |
| funcStr | string | (선택) 지갑에 표시하기위한 함수명 |
| funcArgs | []string | (선택) 지갑에 표시하기위한 매개변수 |
#### 출력
| 키 | 타입 | 설명 |
| ------------ | ------- | ----------------- |
| hash | string | 트랜잭션 해시 |
| tx | object | 생성된 Tx |
| success | boolean | 성공 여부 |
| signedHeight | number | 서명된 tx height |
| feeType | number | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### viewContract
스마트 컨트랙트의 데이터를 읽기 위한 함수를 호출합니다.
#### 입력
| 키 | 타입 | 설명 |
| --------------- | ------ | -------------------- |
| contractAccount | string | 스마트 컨트랙트 주소 |
| func | string | 함수명 |
| argData | string | 매개 변수 |
#### 출력
| 키 | 타입 | 설명 |
| ------ | ------ | ----------------- |
| Result | base64 | 호출한 결과 값 |
| Err | string | 오류 발생 시 내용 |
---
### createAssetObject
AssetObject 를 생성 한다.
#### 입력
| 키 | 타입 | 설명 |
| --------- | ------ | ----------------------------------------------------------- |
| assetType | string | 생성할 객체의 형식 |
| amount | string | 생성할 수량 , 0 으로 설정시 수량이 없는 단일 Object 로 생성 |
| operator | string | 관리 계정 (Contract 주소) |
| metaData | base64 | 사용자 지정하는 형식의 정보 데이타 |
#### 출력
| 키 | 타입 | 설명 |
| ------------ | ------- | ----------------- |
| hash | string | 트랜잭션 해시 |
| tx | object | 생성된 Tx |
| success | boolean | 성공 여부 |
| signedHeight | number | 서명된 tx height |
| feeType | number | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### transferAssetObject
AssetObject 를 전송한다.
#### 입력
| 키 | 타입 | 설명 |
| ------- | ------ | ---------------------- |
| to | base32 | Asset 객체를 받을 계정 |
| assetId | base64 | Asset 의 고유 ID |
| amount | string | 수량 |
#### 출력
| 키 | 타입 | 설명 |
| ------------ | ------- | ----------------- |
| hash | string | 트랜잭션 해시 |
| tx | object | 생성된 Tx |
| success | boolean | 성공 여부 |
| signedHeight | number | 서명된 tx height |
| feeType | number | 수수료 유형 (AUTO:0, GRANT_ONLY:1) |
---
### getAccountAssetList
계정의 Asset 목록을 조회하여 AssetId 별로 Object ID 와 수량을 조회 한다.
#### 입력
| 키 | 타입 | 설명 |
| ----- | ------ | ------------------------------- |
| count | number | 가져올 갯수 제한치, 0 이면 전부 |
#### 출력
| 키 | 타입 | 설명 |
| --------- | ------ | ------------------------------------------------------------------------------ |
| AssetList | string | 보유한 객체 정보 배열 (통합수량, ObjectId 배열) []\{Amount, []Digest\} |
---
### getAccountAssetObject
계정에서 지정한 AssetId 에 해당하는 AssetObject 들을 출력 한다.
#### 입력
| 키 | 타입 | 설명 |
| ------- | -------- | ----------------------- |
| assetId | []base64 | Asset 의 고유 ID의 배열 |
#### 출력
| 키 | 타입 | 설명 |
| ------------ | ------------- | ---------------- |
| objects | []AssetObject | 보유한 객체 정보 |
| unactObjects | []AssetObject | 비활성 객체 정보 |
**AssetObject**
| 키 | 타입 | 설명 |
| ------------- | ------------- | ------------- |
| version | number | 이 객체구조의 버전
| type | string | 객체 타입명
| assetId | string | 객체 타입에 대한 고유 ID
| objectId | string | 객체의 고유 ID
| amount | string | 수량
| operator | string | 객체 생성 또는 관리시 연계할 주소 (컨트랙트 연동 주소)
| metaData | base64 | 이 객체에 대한 기타 정보들 (사용자 정의)
| hash | string | 객체의 유효함을 확인하기 위한 Hash
---
### getNodeStatus
노드의 상태 정보를 반환합니다.
#### 입력
없음
#### 출력
| 키 | 타입 | 설명 |
|---|---|---|
| nodeId | string | 노드 ID |
| baseTime | number | 기준 시간 |
| host | string | 호스트 주소 |
| reliable | boolean | 신뢰할 수 있는 노드 여부 |
| roundTime | number | 라운드 시간 |
| roundCycle | number | 라운드 주기 |
| prunedRound | number | 가지치기된 라운드 |
| round | number | 현재 라운드 |
| epoch | number | 에포크 |
| shardId | number | 샤드 ID |
| homeShardId | number | 홈 샤드 ID |
| totalShard | number | 전체 샤드 수 |
| networkId | number | 네트워크 ID |
| totalHeight | string | 전체 높이 |
| intraPeerCount | number | 내부 피어 수 |
| interPeerCount | number | 외부 피어 수 |
| syncState | string | 동기화 상태 |
| detailState | string | 상세 상태 |
| presyncState | string | 사전 동기화 상태 |
| buildTime | string | 빌드 시간 |
| avgTxTime | string | 평균 트랜잭션 시간 |
| rsNextRound | number | 다음 RS 라운드 |
| rsf | number | RSF |
| vmInfo | string | VM 정보 |
| wrsNextRound | number | 다음 WRS 라운드 |
| wrsHeight | number | WRS 높이 |
---
### getNodeInfo
지갑이 연결된 노드의 요약 정보를 반환합니다.
#### 입력
없음
#### 출력
| 키 | 타입 | 설명 |
|---|---|---|
| shardId | number | 샤드 ID |
| round | number | 라운드 |
| host | string | 호스트 |
| baseTime | number | 기준 시간 |
| reliable | boolean | 신뢰 여부 |
| status | number | 노드 상태 (NodeStatus enum) |
| netStatus | number | 네트워크 상태 (NodeNetStatus enum) |
| buildTime | string | 빌드 시간 |
| networkId | number | 네트워크 ID |
| rpcFailCount | number | RPC 실패 횟수 |
| genesis | string | 제네시스 해시 |
---
### getAccountInfo
선택된 계정의 상세 정보를 반환합니다.
#### 입력
없음
#### 출력
| 키 | 타입 | 설명 |
|---|---|---|
| addr | string | 계정 주소 |
| existAddr | string | 존재하는 주소 (옵션) |
| status | number | 계정 상태 (AccountStatus enum) |
| totalBalance | string | 총 잔액 |
| balance | string | 잔액 |
| grant | number | 권한 |
| identity | string | 신원 |
| representative | string | 대표자 |
| height | number | 높이 |
| unactBalance | string | 비활성 잔액 |
| canBecomeHost | boolean | 호스트 가능 여부 |
| canBecomeGuest | boolean | 게스트 가능 여부 |
---
### getFirstVmeInfo
첫 번째 VME(Validator Management Engine) 정보를 반환합니다.
#### 입력
없음
#### 출력
| 키 | 타입 | 설명 |
|---|---|---|
| code | number | 응답 코드 |
| message | string | 응답 메시지 |
| data | object | VME 정보 데이터 |
---
### getVmeList
VME 목록을 반환합니다.
#### 입력
없음
#### 출력
| 키 | 타입 | 설명 |
|---|---|---|
| code | number | 응답 코드 |
| message | string | 응답 메시지 |
| data | array | VME 정보 목록 |
## 이벤트 목록
---
### init
지갑이 정상적으로 설치되어 사용이 가능한 상태일때 한번 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| ----------- | ------- | ------------------------------- |
| connectedAccount | account | 연결된 계정 정보 |
| address | string | 현재 선택된 계정 주소 |
| network | network | 선택된 네트워크 정보 |
| extensionId | string | 지갑의 익스텐션 ID |
| connected | boolean | 계정이 사이트에 연결됬는지 여부 |
**network**
| 키 | 타입 | 설명 |
| ------------- | ------------- | ------------- |
| id | string | 네트워크 ID
| name | string | 네트워크명
| rpcUrl | string | RPC URL
| currencySymbol | string | 통화 기호
| explorerUrl | string | 익스플로어 url
**account**
| 키 | 타입 | 설명 |
| ------------- | ------------- | ------------- |
| addr | string | 계정 주소
| name | string | 계정 이름
---
### connected
지갑이 대상 사이트에 연결되었을 때 발생합니다. (Deprecated)
#### 출력
| 키 | 타입 | 설명 |
| ---- | ------ | ---------------- |
| addr | string | 연결된 계정 주소 |
---
### connect
대상 사이트에 연결이 되었을 때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| ---- | ------ | ---------------- |
| addr | string | 연결된 계정 주소 |
---
### disconnect
대상 사이트에 연결이 해제될때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| ---- | ------ | ---------------- |
| addr | string | 해제된 계정 주소 |
---
### connectionChanged
연결된 계정이 변경되었을 때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| ---- | ------ | ---------------- |
| addr | string | 변경된 계정 주소 |
---
### accountChanged
계정이 선택 되었을 때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| ---- | ------ | --------- |
| addr | string | 계정 주소 |
---
### networkChanged
네트워크가 변경 되었을 때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| -------------- | ------ | -------------------------------- |
| id | string | 등록된 네트워크의 네트워크 ID |
| name | string | 등록된 네트워크의 이름 |
| rpcUrl | string | 등록된 네트워크의 RPC 호출 url |
| currencySymbol | string | 등록된 네트워크의 기본 통화 기호 |
| explorerUrl | string | 등록된 네트워크의 익스플로어 url |
---
### lockWallet
지갑에서 로그아웃 했을 때 발생합니다.
#### 출력
[없음]
---
### unlockWallet
지갑에 로그인 했을 때 발생합니다. (Deprecated)
#### 출력
| 키 | 타입 | 설명 |
| ---- | ------ | ------------------ |
| addr | string | 로그인한 계정 주소 |
---
### login
지갑에 로그인 했을 때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| ---- | ------ | ------------------ |
| addr | string | 로그인한 계정 주소 |
---
### logout
지갑에서 로그아웃 했을 때 발생합니다.
#### 출력
[없음]
---
### contractResult
스마트 컨트랙트 실행 결과를 수신했을 때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| ----------- | ------ | ---------------- |
| contract | string | 컨트랙트 주소 |
| result | string | 실행 결과 |
| error | string | 에러 메시지 |
| transfers | array | 토큰 전송 내역 |
| callerAddr | string | 호출자 주소 |
| callerIndex | number | 호출자 인덱스 |
| state | number | 컨트랙트 상태 (1: 호출, 2: 실행, 3: 확정, 4: 결과실패) |
---
### acceptConfirmation
지갑 확인 창에서 수락 했을 때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| ---- | ------ | ------------- |
| uuid | string | 요청 유니크키 |
| data | string | 실행 결과 |
---
### rejectConfirmation
지갑 확인 창에서 거부 했을 때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| ------- | ------ | --------------------------------- |
| uuid | string | 요청 Unique Key |
| code | string | 0: 일반 1: 사용자에 의한 거부 |
| message | string | 에러 메세지 |
---
### rejectAllConfirmations
지갑 확인 창에서 모든 요청을 거부 했을 때 발생합니다.
#### 출력
| 키 | 타입 | 설명 |
| --- | -------- | -------------- |
| - | []result | 요청 거부 목록 |
**result**
| 키 | 타입 | 설명 |
| ------------- | ------------- | ------------- |
| uuid | string | 요청 Unique Key
| code | string | 0: 일반 1: 사용자에 의한 거부
| message | string | 에러 메세지
---
# Locus Smart Contract
Source: https://docs.testnet2.locuschain.com/docs/references/smartcontract
```mdx-code-block
```
# Locus Smart Contract
Solidity 등을 사용하는 스마트 컨트랙트 환경은 VME 를 사용하는 기능으로, 테스트넷에서 VME 와 함께 공개할 예정입니다.
---
# Locus Core Script
Source: https://docs.testnet2.locuschain.com/docs/references/corescript
```mdx-code-block
```
# Locus Core Script
Atomic Swap과 같은 가장 기본적인 Script를 로커스체인의 Core layer에서 실행 가능하도록 한다.
로커스체인의 Core layer에서 실행 가능하다는 것은, 처리가 가벼워서 모든 일반 Node가 일반 Tx를 처리하는 수준(혹은 약간 상회)으로 실행 가능하다는 것을 의미한다.
## Data Types
| 타입 | 설명 |
| ------------- | ------------- |
| uint8 | uint8 |
| uint16 | uint16 |
| uint32 | uint32 |
| uint64 | uint64 |
| int8 | int8 |
| int16 | int16 |
| int32 | int32 |
| int64 | int64 |
| npk | normal public key |
| nsign | normal signature |
| round | round |
| height | height of account chain |
| digest | 32 bytes hash (blake2b256) |
| address | address of account |
| currency | amount of coin or token |
| summary | example data type for data trading|
## OP Codes
| op code | operand 1 | operand 2 | description |
|-----------------|--------------|-----------|----------------------------------------------------------------------------------------------------------------|
| #ver | const uint16 | - | operand1을 취해서 vm version을 검사. |
| #txa1 | data type | - | TxProvideScript와 TxAcceptScript의 Args[0]의 데이터 타입을 지정. |
| #txa2 | data type | - | TxProvideScript와 TxAcceptScript의 Args[1]의 데이터 타입을 지정. |
| #txa3 | data type | - | TxProvideScript와 TxAcceptScript의 Args[2]의 데이터 타입을 지정. |
| #txa4 | data type | - | TxProvideScript와 TxAcceptScript의 Args[3]의 데이터 타입을 지정. |
| op0, push_false | - | - | 스택에 0을 push 한다. (1 byte) |
| op1, push_true | - | - | 스택에 1을 push 한다. (1 byte), 1만이 유일한 TRUE 값. |
| op2 ~ op16 | - | - | 스택에 2 ~ 16을 push 한다. (1 byte) |
| ver | - | - | 스택에서 1 byte를 pop하여, verify 한다.값이 1이면 mark를 true로 세트하고 스크립트를 종료. 다른 값이면 mark는 false가 됨. |
| ret | - | - | mark를 false로 세트하고 스크립트를 종료. |
| if | - | - | 스택에서 1 byte를 pop하여, 값이 1이면 IF절을 수행한다. 값이 1이 아니고, else 절이 존재하면 else 절을 수행. if 구문은 중첩가능.|
| ifn | - | - | 스택에서 1 byte를 pop하여, 값이 1이 아니 면 if 절을 수행한다.값이 1이고, else 절이 존재하면 else 절을 수행. |
| else | - | - | if 절의 끝, else 절의 시작. |
| eif | - | - | if 절 혹은 else 절의 끝. |
| push_txr1 | - | - | TxProvideScript의 Round 값을 스택에 push. |
| push_txr2 | - | - | TXAcceptScript의 Round 값을 스택에 push. |
| push_txh1 | - | - | TxProvideScript의 Height 값을 스택에 push. |
| push_txh2 | - | - | TXAcceptScript의 Height 값을 스택에 push. |
| push_txa1 | - | - | Tx의 Arg[0]의 값을 스택에 push. 이 opcode를 수행하기 전에 #txa1으로 data type이 지정되어 있어야 함. |
| push_txa2 | - | - | Tx의 Arg[1]의 값을 스택에 push. 이 opcode를 수행하기 전에 #txa2으로 data type이 지정되어 있어야 함. |
| push_txa3 | - | - | Tx의 Arg[2]의 값을 스택에 push. 이 opcode를 수행하기 전에 #txa3으로 data type이 지정되어 있어야 함. |
| push_txa4 | - | - | Tx의 Arg[3]의 값을 스택에 push. 이 opcode를 수행하기 전에 #txa4으로 data type이 지정되어 있어야 함. |
| hash_sha | - | - | 스택에서 data를 pop 해서, sha256으로 해시값을 계산하여 스택에 push. |
| hash_blake | - | - | 스택에서 data를 pop 해서, blake2b256으로 해시값을 계산하여 스택에 push. |
| root_summary | - | - | 스택에서 summary를 pop 해서, summary의 root를 계산하여 스택에 push. |
| equ | - | - | 스택에서 data를 두번 pop 해서 비교한 결과가 같으면 push_true를, 다르면 push_false 함. |
| neq | - | - | 스택에서 data를 두번 pop 해서 비교한 결과가 다르면 push_true를, 같으면 push_false 함. |
| lt | - | - | 스택에서 data를 두번 pop 해서 1st pop < 2nd pop 이면 push_true를, 아니면 push_false 함. |
| lte | - | - | 스택에서 data를 두번 pop 해서 1st pop <= 2nd pop 이면 push_true를, 아니면 push_false 함. |
| gt | - | - | 스택에서 data를 두번 pop 해서 1st pop > 2nd pop 이면 push_true를, 아니면 push_false 함. |
| gte | - | - | 스택에서 data를 두번 pop 해서 1st pop >= 2nd pop 이면 push_true를, 아니면 push_false 함. |
| dup | - | - | 스택의 최상위의 data와 같은 data를 스택에 push 함. (복사한다) (stack : x, ... → x, x, ...) |
| drop | - | - | 스택에서 data를 pop 해서, 버림. (stack : x, y, ... → y, ...) |
| swap | - | - | 스택에서 data를 두번 pop 해서, 교차해서 push 함. (stack : x, y, ... → y, x, ...) |
| rot | - | - | 스택에서 최상위 data 3개를 rotate 시킴. (stack : x, y, z, ... → z, x, y, ...) |
| over | - | - | 스택 최상위에서 두번째 data를 최상위에 복사함. (stack : x, y, ... → y, x, y, ...) |
| add | - | - | 스택에서 data를 두번 pop 해서 더한 결과를 push 함. (type이 다르면 에러를 돌림) |
## Samples
### Hashed Time Lock
```
TxProvideScript :
Target : // coin 을 받을 계정
TargetAfterTimeLock : // provider 자기 자신
Args[0] : // hash of seed
ScriptProvide :
#ver 1
#txa1 digest
push_txa1 // hash of seed
ret
ScriptAccept :
#ver 1
#txa1 digest
push_txa1 // seed
hash_blake // make hash of seed
equ // compare provider's hash & acceptor's hash
ver
TxAcceptScript :
Args[0] : // seed
```