블록체인 기술을 이용한 분산 애플리케이션 개발에 관심이 높아지고 있는 가운데, Lisk는 JavaScript 기반의 SDK를 통해 개발자 친화적인 블록체인 플랫폼을 제공하고 있습니다. 하지만 Lisk 개발 환경을 구축하는 과정에서 여러 문제에 직면할 수 있습니다. 이 글에서는 Lisk SDK를 활용한 개발 과정에서 발생할 수 있는 주요 문제점과 그 해결 방법에 대해 살펴보겠습니다.
1. Lisk 네트워크 연결 문제
Lisk 애플리케이션을 개발할 때 가장 먼저 맞닥뜨릴 수 있는 문제는 공식 Lisk API 엔드포인트에 연결하는 과정입니다. 다음과 같은 오류 메시지를 접할 수 있습니다:
API 호출 중 오류 발생: FetchError: request to https://service.lisk.com/api/v2/blocks?limit=1 failed, reason: getaddrinfo ENOTFOUND service.lisk.com
또는 다음과 같은 네트워크 연결 오류가 발생할 수 있습니다:
API 호출 중 오류 발생: FetchError: request to https://mainnet.lisk.com/api/v2/blocks?limit=1 failed, reason: ENETUNREACH
주요 원인
이러한 네트워크 연결 문제의 원인은 다음과 같습니다:
- API 엔드포인트 변경: Lisk 재단에서 API 엔드포인트의 도메인을 변경했을 수 있습니다(예:
.com
에서.io
로). - 네트워크 연결 제한: 개발 서버가 방화벽 뒤에 있거나 외부 연결이 제한되어 있을 수 있습니다.
- DNS 해석 문제: 서버의 DNS 설정이 제대로 구성되지 않았을 수 있습니다.
해결 방법
다양한 API 엔드포인트 시도
Lisk API는 여러 도메인을 통해 제공될 수 있으므로 다양한 엔드포인트를 시도해볼 필요가 있습니다:
const endpoints = [
'https://mainnet.lisk.io/api/v2',
'https://testnet.lisk.io/api/v2',
'https://api.lisk.com/api/v2',
'https://service.lisk.io/api/v2'
];
네트워크 연결 확인
기본적인 네트워크 연결을 확인하는 스크립트를 작성하여 서버의 인터넷 연결 상태를 점검할 수 있습니다:
const fetch = require('node-fetch');
const dns = require('dns').promises;
async function checkConnectivity() {
console.log('Testing basic network connectivity...');
// 잘 알려진 도메인으로 테스트
const domains = [
'google.com',
'cloudflare.com',
'github.com'
];
for (const domain of domains) {
try {
console.log(`\nResolving ${domain}...`);
const result = await dns.lookup(domain);
console.log(`✅ Success: ${domain} resolved to ${result.address}`);
// HTTP 연결 시도
try {
console.log(`Making HTTP request to https://${domain}...`);
const response = await fetch(`https://${domain}`);
console.log(`✅ HTTP connection successful: ${response.status} ${response.statusText}`);
} catch (httpError) {
console.log(`❌ HTTP connection failed: ${httpError.message}`);
}
} catch (error) {
console.log(`❌ DNS resolution failed: ${error.message}`);
}
}
}
DNS 디버깅
DNS 해석 문제를 더 자세히 분석하기 위해 다음과 같은 스크립트가 유용할 수 있습니다:
const dns = require('dns').promises;
const { execSync } = require('child_process');
async function debugDns() {
console.log('==== DNS Resolution Debugging ====');
// 시스템 리졸버 확인
try {
console.log('\n=== System DNS Configuration ===');
const resolvConf = execSync('cat /etc/resolv.conf').toString();
console.log(resolvConf);
} catch (err) {
console.log('Could not read /etc/resolv.conf:', err.message);
}
// 여러 리졸버로 도메인 테스트
const domains = ['google.com', 'mainnet.lisk.com', 'mainnet.lisk.io'];
const resolvers = ['1.1.1.1', '8.8.8.8', '9.9.9.9'];
for (const domain of domains) {
console.log(`\n=== Testing resolution for ${domain} ===`);
// 시스템 리졸버 사용
try {
console.log(`\nSystem resolver:`);
const result = await dns.lookup(domain);
console.log(`✅ Success: ${result.address}`);
} catch (error) {
console.log(`❌ Failed: ${error.message}`);
}
// 다른 리졸버로 dig 명령 사용
for (const resolver of resolvers) {
try {
console.log(`\nUsing resolver ${resolver}:`);
const digResult = execSync(`dig @${resolver} ${domain} +short`).toString().trim();
if (digResult) {
console.log(`✅ Success: ${digResult}`);
} else {
console.log(`⚠️ No result from ${resolver}`);
}
} catch (err) {
console.log(`❌ dig command failed: ${err.message}`);
}
}
}
}
2. Lisk SDK 버전 호환성 문제
Lisk SDK는 지속적으로 개발되고 있으며, 버전 간에 API와 설정 방식이 크게 달라질 수 있습니다. 개발자는 다음과 같은 오류를 만날 수 있습니다:
Error running local node: TypeError: Application.defaultApplication is not a function
또는 설정 관련 유효성 검사 오류:
로컬 노드 실행 중 오류 발생: SchemaValidationError: [
{
"keyword": "additionalProperties",
"dataPath": "",
"schemaPath": "#/additionalProperties",
"params": {
"additionalProperty": "label"
},
"message": "should NOT have additional properties"
}
]
주요 원인
- SDK 버전 불일치: 사용 중인 SDK 버전과 참조 중인 문서의 버전이 다를 수 있습니다.
- 설정 스키마 변경: 새로운 SDK 버전에서는 이전 버전의 설정 구조가 유효하지 않을 수 있습니다.
- API 인터페이스 변경: 메소드 이름, 매개변수, 반환 값 등이 버전 간에 변경되었을 수 있습니다.
해결 방법
SDK 버전 확인
현재 설치된 SDK 버전을 확인하는 것이 중요합니다:
const liskSdk = require('lisk-sdk');
console.log('Installed Lisk SDK version:', liskSdk.version);
// 사용 가능한 SDK 내보내기 확인
console.log('\nAvailable SDK exports:');
Object.keys(liskSdk).forEach(key => {
console.log(`- ${key} (type: ${typeof liskSdk[key]})`);
});
버전 호환 설정 사용
특정 SDK 버전에 맞는 설정 구조를 사용해야 합니다. 예를 들어, SDK v0.1.0에 맞는 로컬 노드 설정:
const { Application, genesisBlockDevnet, configDevnet } = require('lisk-sdk');
async function runLocalLiskNode() {
try {
console.log('SDK Version:', require('lisk-sdk').version);
// SDK v0.1.0에 맞는 설정 구성
const sanitizedConfig = { ...configDevnet };
// 문제가 되는 속성 제거
delete sanitizedConfig.label;
delete sanitizedConfig.genesisConfig;
delete sanitizedConfig.logger;
// 허용된 속성만 업데이트
if (sanitizedConfig.modules && sanitizedConfig.modules.chain) {
sanitizedConfig.modules.chain.communityIdentifier = 'lisk-local';
}
if (sanitizedConfig.components && sanitizedConfig.components.logger) {
sanitizedConfig.components.logger.consoleLogLevel = 'info';
}
const app = new Application(genesisBlockDevnet, sanitizedConfig);
await app.init();
// 애플리케이션 사용...
await app.cleanup();
} catch (error) {
console.error('Error running local node:', error);
}
}
최소 설정으로 애플리케이션 생성
복잡한 설정을 피하고 최소한의 구성으로 시작하는 것이 도움이 될 수 있습니다:
const { Application, cryptography } = require('lisk-sdk');
const fs = require('fs');
async function createLiskApp() {
try {
console.log('Creating minimal Lisk application with SDK v0.1.0...');
// 제네시스 계정 생성
const passphrase = cryptography.generateMnemonic();
const { publicKey } = cryptography.getKeys(passphrase);
const address = cryptography.getAddressFromPublicKey(publicKey);
// 최소 설정
const minimalConfig = {
app: {
label: 'lisk-custom-app',
version: '1.0.0',
minVersion: '1.0.0',
protocolVersion: '1.0'
},
components: {
logger: {
fileLogLevel: 'info',
consoleLogLevel: 'info'
}
},
modules: {}
};
// 설정 저장
fs.writeFileSync(
'minimal-lisk-config.json',
JSON.stringify(minimalConfig, null, 2)
);
// 애플리케이션 생성 시도
const minimalGenesisBlock = {
header: {
id: "minimal-genesis",
timestamp: 0,
version: 1,
height: 0
},
payload: []
};
const app = new Application(minimalGenesisBlock, minimalConfig);
// 애플리케이션 사용...
} catch (error) {
console.error('Error:', error);
}
}
3. 로컬 노드 설정 문제
Lisk 로컬 노드를 설정할 때 다음과 같은 오류가 발생할 수 있습니다:
로컬 노드 실행 중 오류 발생: SchemaValidationError: [
{
"keyword": "additionalProperties",
"dataPath": "",
"schemaPath": "#/additionalProperties",
"params": {
"additionalProperty": "label"
},
"message": "should NOT have additional properties"
}
]
주요 원인
- 설정 스키마 불일치: SDK 버전에 맞지 않는 설정 속성을 사용했을 수 있습니다.
- 제네시스 블록 형식 오류: 제네시스 블록 형식이 SDK 버전과 호환되지 않을 수 있습니다.
- 모듈 및 컴포넌트 구성 오류: 모듈이나 컴포넌트 설정이 잘못되었을 수 있습니다.
해결 방법
설정 정화 및 단순화
불필요한 속성을 제거하고 기본 설정을 사용하는 것이 도움이 될 수 있습니다:
// SDK 기본 설정 사용
const sanitizedConfig = { ...configDevnet };
// 문제가 되는 속성 제거
delete sanitizedConfig.label;
delete sanitizedConfig.genesisConfig;
delete sanitizedConfig.logger;
// 필수 속성만 구성
if (sanitizedConfig.modules && sanitizedConfig.modules.chain) {
sanitizedConfig.modules.chain.communityIdentifier = 'lisk-local';
}
단계적 설정 확장
기본 설정에서 시작하여 문제가 없는지 확인한 후 추가 설정을 점진적으로 추가하는 접근 방식:
- 먼저 기본 설정으로 애플리케이션이 실행되는지 확인
- 로깅 설정 추가 및 테스트
- 체인 모듈 설정 추가 및 테스트
- 기타 모듈 및 컴포넌트 설정 추가 및 테스트
4. Lisk 개발을 위한 최선의 방법
Lisk 개발 과정에서 문제를 최소화하기 위한 몇 가지 권장 사항:
최신 SDK 사용
가능하면 최신 버전의 Lisk SDK를 사용하는 것이 좋습니다. 최신 버전은 더 많은 기능과 개선된 안정성을 제공합니다:
npm install lisk-sdk@latest
공식 문서 참조
Lisk 공식 문서는 SDK 버전에 맞는 설정 및 API 사용 방법을 제공합니다. 항상 사용 중인 SDK 버전에 해당하는 문서를 참조하세요.
Docker 컨테이너 활용
로컬 개발 환경의 복잡성을 줄이기 위해 Docker를 활용하는 것이 좋습니다:
docker pull lisk/core:latest
docker run -p 4000:4000 lisk/core:latest
단위 테스트 작성
Lisk 애플리케이션의 각 컴포넌트에 대한 단위 테스트를 작성하면 문제를 조기에 발견하고 해결할 수 있습니다:
const { Application } = require('lisk-sdk');
const assert = require('assert');
describe('My Lisk Module', () => {
let app;
beforeEach(async () => {
// 테스트용 앱 설정
app = new Application(/* ... */);
await app.init();
});
afterEach(async () => {
await app.cleanup();
});
it('should perform expected action', async () => {
// 테스트 로직
assert.strictEqual(result, expectedValue);
});
});
결론
Lisk는 JavaScript 개발자가 블록체인 애플리케이션을 쉽게 개발할 수 있는 강력한 플랫폼이지만, SDK 버전 간의 차이와 네트워크 연결 문제로 인해 초기 설정 과정에서 어려움을 겪을 수 있습니다. 이 글에서 다룬 문제 해결 방법과 권장 사항을 따르면 Lisk 개발 환경을 성공적으로 구축하는 데 도움이 될 것입니다.
특히 네트워크 연결 문제는 DNS 설정, 방화벽, 프록시 등 다양한 요소에 의해 영향을 받을 수 있으므로 체계적인 접근이 필요합니다. 또한 SDK 버전 호환성 문제는 공식 문서를 참조하고 최소 설정에서 시작하여 점진적으로 확장하는 방식으로 해결할 수 있습니다.
블록체인 개발의 여정에서 이러한 초기 장벽을 극복하면, Lisk의 강력한 기능을 활용하여 혁신적인 분산 애플리케이션을 개발할 수 있을 것입니다.
답글 남기기