> 웹 프론트엔드 > JS 튜토리얼 > 소개. JavaScript로 Cardano 지갑 검사기 웹 구축하기.

소개. JavaScript로 Cardano 지갑 검사기 웹 구축하기.

DDD
풀어 주다: 2025-01-08 08:29:43
원래의
762명이 탐색했습니다.

이 프로젝트는 나의 첫 번째 Web3 애플리케이션이며 Yoroi 지갑을 통해 Cardano 블록체인에 연결됩니다. 실제로는 매우 간단합니다. 지갑 잔액을 확인하는 방법일 뿐이지만 앞으로 다가올 많은 흥미로운 프로젝트의 시작을 의미합니다. 이 튜토리얼을 진행하면서 학습 과정을 여러분과 공유하고 싶습니다.

? 우리는 무엇을 만들고 있나요?

시작하기 전에 우리가 무엇을 만들고 있는지 명확히 해두겠습니다. 이것은 다음을 수행할 수 있는 간단하고 간단한 도구입니다.

  • Cardano 지갑의 잔액을 확인해보세요(합법적으로는 물론이죠! ?)
  • Yoroi 지갑에 연결
  • ADA 잔액 표시

Intro. to WebBuilding a Cardano Wallet Checker with JavaScript.

? 필요한 것

기본 JavaScript 지식(console.log("hello world")를 사용할 수 있다면 좋습니다!)

  1. - 텍스트 편집기(VS Code, Sublime 또는 모험을 즐기고 싶다면 메모장까지)
  2. - Yoroi 지갑 확장 프로그램 설치(테스트에 필요함)
  3. - Blockfrost API 키(걱정하지 마세요. 얻는 방법을 알려드리겠습니다.) 가자!

1단계: 프로젝트 설정

컴퓨터에 CardanoWalletExplorer라는 이름의 새 폴더를 만듭니다(또는 원하는 경우 정키 justyk, 이름은 별로 중요하지 않음). 코드 편집기에서 폴더를 엽니다(저는 Visual Studio Code를 사용합니다).
폴더 안에 두 개의 파일을 만듭니다:
index.html 및 style.css
이제 index.html을 열고 다음을 붙여넣으세요.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cardano Wallet Explorer</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div>



<p>Let's add some style to our creation. Inside the style.css file paste this in:<br>
</p>

<pre class="brush:php;toolbar:false">:root {
    --primary-color: #0033ad;
    --secondary-color: #2a71d4;
    --accent-color: #17d1aa;
    --background-color: #f8faff;
    --card-background: #ffffff;
    --text-primary: #1a202c;
    --text-secondary: #4a5568;
    --border-color: #e2e8f0;
    --shadow: 0 4px 6px rgba(0,0,0,0.1);
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: 'Inter', system-ui, sans-serif;
    background: var(--background-color);
    color: var(--text-primary);
    line-height: 1.5;
    min-height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 2rem;
}

.container {
    background: var(--card-background);
    border-radius: 1.5rem;
    box-shadow: var(--shadow);
    width: 100%;
    max-width: 800px;
    overflow: hidden;
}

.app-header {
    background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
    color: white;
    padding: 2rem;
    text-align: center;
}

.logo {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    margin-bottom: 0.5rem;
}

.logo i { font-size: 2rem; }
h1 { font-size: 1.8rem; font-weight: 600; }
.subtitle { opacity: 0.9; }

.content { padding: 2rem; }

.search-section {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1.5rem;
    margin-bottom: 2rem;
}

.search-box {
    display: flex;
    gap: 1rem;
    width: 100%;
    max-width: 600px;
}

#wallet-search {
    flex: 1;
    padding: 0.875rem 1rem;
    border: 2px solid var(--border-color);
    border-radius: 12px;
    font-size: 0.95rem;
    transition: 0.3s ease;
}

#wallet-search:focus {
    outline: none;
    border-color: var(--accent-color);
    box-shadow: 0 0 0 3px rgba(23, 209, 170, 0.1);
}

button {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.875rem 1.5rem;
    border: none;
    border-radius: 12px;
    font-size: 0.95rem;
    font-weight: 500;
    cursor: pointer;
    transition: 0.3s ease;
}

#search-button {
    background: var(--accent-color);
    color: white;
}

#search-button:hover {
    background: #15bea0;
    transform: translateY(-2px);
}

.divider {
    width: 100%;
    max-width: 600px;
    text-align: center;
    position: relative;
    color: var(--text-secondary);
}

.divider::before,
.divider::after {
    content: '';
    position: absolute;
    top: 50%;
    width: calc(50% - 2rem);
    height: 1px;
    background: var(--border-color);
}

.divider::before { left: 0; }
.divider::after { right: 0; }

.connect-button {
    background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
    color: white;
    padding: 1rem 2rem;
}

.connect-button:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow);
}

.wallet-info {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 1.5rem;
    margin-top: 2rem;
}

.info-card {
    background: var(--card-background);
    border: 1px solid var(--border-color);
    border-radius: 1rem;
    padding: 1.5rem;
    transition: 0.3s ease;
}

.info-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow);
}

.card-header {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-bottom: 1rem;
    color: var(--text-secondary);
}

.card-header i {
    font-size: 1.25rem;
    color: var(--primary-color);
}

.card-content {
    font-size: 0.95rem;
    color: var(--text-primary);
    word-break: break-all;
}

.app-footer {
    text-align: center;
    padding: 1.5rem;
    background: var(--background-color);
    color: var(--text-secondary);
    font-size: 0.9rem;
}

.app-footer a {
    color: var(--primary-color);
    text-decoration: none;
}

.app-footer a:hover {
    text-decoration: underline;
}

@media (max-width: 640px) {
    body {
        padding: 1rem;
    }

    .container {
        border-radius: 1.5rem;
    }

    .app-header {
        padding: 1.5rem;
    }

    .content {
        padding: 1.5rem;
    }

    .search-box {
        flex-direction: column;
    }

    button {
        width: 100%;
        justify-content: center;
    }

    .wallet-info {
        grid-template-columns: 1fr;
    }
}

로그인 후 복사
로그인 후 복사

2단계: Blockfrost API 키를 얻는 방법은 무엇입니까?

지갑 잔액을 가져오려면 Cardano 블록체인과 상호 작용할 수 있는 Blockfrost가 필요합니다. API 키를 얻는 방법은 다음과 같습니다.

  • Blockfrost.io에 접속하여 회원가입을 하세요.
  • 로그인한 후 새 프로젝트 만들기를 클릭하세요.
  • 실제 ADA용 메인넷과 테스트용 테스트넷을 선택하세요.
  • 프로젝트가 생성되면 API Key를 받게 됩니다.

3단계: 작전의 두뇌?

이제 재미있는 부분을 살펴보겠습니다. 모든 작업을 수행해 보세요! 우리가 만든 폴더에 script.js라는 파일을 만듭니다.

function checkYoroiInstalled() {
    return window.cardano && window.cardano.yoroi;
}
로그인 후 복사
로그인 후 복사

? 이 기능은 Yoroi 지갑 확장 프로그램이 브라우저에 설치되어 있는지 확인합니다. Window.cardano는 Yoroi와 같은 Cardano 지갑에서 노출되는 객체입니다. 이것이 존재하는지, 그리고 window.cardano.yoroi가 가능한지 확인하여 요로이 지갑이 설치되어 있는지 확인합니다.
둘 다 true이면 함수는 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cardano Wallet Explorer</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div>



<p>Let's add some style to our creation. Inside the style.css file paste this in:<br>
</p>

<pre class="brush:php;toolbar:false">:root {
    --primary-color: #0033ad;
    --secondary-color: #2a71d4;
    --accent-color: #17d1aa;
    --background-color: #f8faff;
    --card-background: #ffffff;
    --text-primary: #1a202c;
    --text-secondary: #4a5568;
    --border-color: #e2e8f0;
    --shadow: 0 4px 6px rgba(0,0,0,0.1);
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: 'Inter', system-ui, sans-serif;
    background: var(--background-color);
    color: var(--text-primary);
    line-height: 1.5;
    min-height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 2rem;
}

.container {
    background: var(--card-background);
    border-radius: 1.5rem;
    box-shadow: var(--shadow);
    width: 100%;
    max-width: 800px;
    overflow: hidden;
}

.app-header {
    background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
    color: white;
    padding: 2rem;
    text-align: center;
}

.logo {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    margin-bottom: 0.5rem;
}

.logo i { font-size: 2rem; }
h1 { font-size: 1.8rem; font-weight: 600; }
.subtitle { opacity: 0.9; }

.content { padding: 2rem; }

.search-section {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1.5rem;
    margin-bottom: 2rem;
}

.search-box {
    display: flex;
    gap: 1rem;
    width: 100%;
    max-width: 600px;
}

#wallet-search {
    flex: 1;
    padding: 0.875rem 1rem;
    border: 2px solid var(--border-color);
    border-radius: 12px;
    font-size: 0.95rem;
    transition: 0.3s ease;
}

#wallet-search:focus {
    outline: none;
    border-color: var(--accent-color);
    box-shadow: 0 0 0 3px rgba(23, 209, 170, 0.1);
}

button {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.875rem 1.5rem;
    border: none;
    border-radius: 12px;
    font-size: 0.95rem;
    font-weight: 500;
    cursor: pointer;
    transition: 0.3s ease;
}

#search-button {
    background: var(--accent-color);
    color: white;
}

#search-button:hover {
    background: #15bea0;
    transform: translateY(-2px);
}

.divider {
    width: 100%;
    max-width: 600px;
    text-align: center;
    position: relative;
    color: var(--text-secondary);
}

.divider::before,
.divider::after {
    content: '';
    position: absolute;
    top: 50%;
    width: calc(50% - 2rem);
    height: 1px;
    background: var(--border-color);
}

.divider::before { left: 0; }
.divider::after { right: 0; }

.connect-button {
    background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
    color: white;
    padding: 1rem 2rem;
}

.connect-button:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow);
}

.wallet-info {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 1.5rem;
    margin-top: 2rem;
}

.info-card {
    background: var(--card-background);
    border: 1px solid var(--border-color);
    border-radius: 1rem;
    padding: 1.5rem;
    transition: 0.3s ease;
}

.info-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow);
}

.card-header {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-bottom: 1rem;
    color: var(--text-secondary);
}

.card-header i {
    font-size: 1.25rem;
    color: var(--primary-color);
}

.card-content {
    font-size: 0.95rem;
    color: var(--text-primary);
    word-break: break-all;
}

.app-footer {
    text-align: center;
    padding: 1.5rem;
    background: var(--background-color);
    color: var(--text-secondary);
    font-size: 0.9rem;
}

.app-footer a {
    color: var(--primary-color);
    text-decoration: none;
}

.app-footer a:hover {
    text-decoration: underline;
}

@media (max-width: 640px) {
    body {
        padding: 1rem;
    }

    .container {
        border-radius: 1.5rem;
    }

    .app-header {
        padding: 1.5rem;
    }

    .content {
        padding: 1.5rem;
    }

    .search-box {
        flex-direction: column;
    }

    button {
        width: 100%;
        justify-content: center;
    }

    .wallet-info {
        grid-template-columns: 1fr;
    }
}

로그인 후 복사
로그인 후 복사

이 기능은 ADA 잔액을 사용자 친화적인 방식으로 구성합니다.
카르다노는 러브레이스를 가장 작은 단위(1 ADA = 1,000,000 러브레이스)로 사용하므로 1,000,000으로 나누어 ADA로 변환해야 합니다.
또한 잔액이 소수점 이하 6자리(예: 1.234567 ADA)로 표시되도록 하거나 잔액이 유효하지 않거나 비어 있는 경우 "0.000000"을 반환합니다.

function checkYoroiInstalled() {
    return window.cardano && window.cardano.yoroi;
}
로그인 후 복사
로그인 후 복사

Fetch API를 사용하여 Blockfrost에 GET 요청을 보내고 있습니다. Blockfrost는 Cardano 블록체인과 상호 작용할 수 있는 API를 제공합니다. 승인을 위해 API 키를 사용하여 특정 지갑 주소에 대한 엔드포인트에 GET 요청을 보냅니다. Blockfrost의 API에 요청하여 특정 지갑 주소의 잔액을 가져오는 기능입니다.

응답이 성공하면 JSON 데이터를 구문 분석하고 해당 주소의 ADA 수량을 반환합니다.
오류가 있는 경우(예: 잘못된 주소 또는 API 문제) 오류가 발생하고 콘솔에 기록됩니다. 엔드포인트 URL에는 확인하려는 지갑 주소가 포함되어 있습니다. checkWalletBalance 함수의 YOUR_API_KEY 자리 표시자를 API 키로 바꾸세요.

function formatBalance(lovelaceBalance) {
    if (!lovelaceBalance || isNaN(lovelaceBalance)) {
        return "0.000000";
    }
    const adaBalance = parseFloat(lovelaceBalance) / 1_000_000;
    return adaBalance.toFixed(6);
}

로그인 후 복사
  • 이 UI 업데이트 기능은 지갑 주소와 잔액으로 사용자 인터페이스(UI)를 업데이트합니다.
  • 주소를 줄여서 처음 8자와 마지막 8자를 표시하고(가독성을 높이기 위해) "지갑 주소" 카드에 표시합니다.
  • formatBalance 함수를 사용하여 잔액을 포맷하고 "wallet-balance" 카드에 표시합니다.
  • 주소 텍스트 위로 마우스를 가져가면 전체 주소가 포함된 툴팁도 설정됩니다.
**Fetching Wallet Balance Using Blockfrost API
async function checkWalletBalance(address) {
    try {
        const API_KEY = 'YOUR_API_KEY';
        const response = await fetch(`https://cardano-mainnet.blockfrost.io/api/v0/addresses/${address}`, {
            headers: {
                'project_id': API_KEY
            }
        });

        if (!response.ok) {
            throw new Error('Invalid address or API error');
        }

        const data = await response.json();
        return data.amount[0].quantity;
    } catch (error) {
        console.error('Error fetching balance:', error);
        throw error;
    }
}

로그인 후 복사

이 코드는 이벤트 리스너를 HTML 요소에 연결합니다.
"요로이월렛 연결" 버튼을 클릭하면 connectWallet 기능이 호출됩니다.
"잔액 확인" 버튼을 클릭하면 handlerWalletSearch 기능이 호출됩니다.
사용자가 지갑 주소 입력 필드에서 "Enter" 키를 누르면 잔액 확인도 실행됩니다.

축하합니다. 해냈습니다! ?

이제 Web3 마스터에 한 걸음 더 가까워졌습니다! ?이 프로젝트는 기술적인 성과일 뿐만 아니라 광활한 블록체인 개발 세계로의 흥미로운 발걸음이었습니다! ?
이제 Yoroi 지갑에 원활하게 연결하고, 잔액을 확인하고, 블록체인의 힘을 손끝으로 가져올 수 있습니다.

? 테스트 시간!

  1. vs code에 라이브 서버 확장 프로그램을 설치하고 "라이브 시작" 버튼을 클릭하여 실행 중인지 확인하세요.
  2. 이렇게 하면 브라우저에서 HTML 파일이 열립니다
  3. 손가락을 교차시켜 테스트해보세요!

? 이 프로젝트에서 배운 것

  • Yoroi와 같은 블록체인 지갑이 어떻게 작동하고 분산 네트워크와 상호 작용하는지에 대한 확실한 이해를 얻었습니다.
  • window.cardano API를 사용하여 브라우저 지갑을 웹 앱에 안전하게 연결하는 프로세스를 마스터했습니다.
  • Blockfrost API를 탐색하여 Cardano 블록체인에서 지갑 잔액과 주소 세부정보를 가져왔습니다.
  • 원활한 사용자 경험을 보장하기 위해 비동기 및 대기, 오류 처리, 데이터 형식 지정에 대한 향상된 지식을 제공합니다.
  • 실시간 블록체인 데이터를 기반으로 웹페이지 요소를 동적으로 업데이트하는 방법을 배웠습니다.
  • 암호화폐 단위를 Lovelace에서 ADA로 변환하고 사용자가 쉽게 읽을 수 있도록 형식을 지정하는 메커니즘을 이해했습니다.
  • 중단을 방지하기 위해 API 요청 및 사용자 입력에 대한 강력한 오류 처리의 중요성을 인식했습니다.
  • 지갑 구조, 주소 관리, 블록체인의 거래 표현에 대한 귀중한 통찰력을 얻었습니다.
  • 사용자 상호 작용을 향상하기 위해 로딩 스피너, 툴팁, 경고와 같은 기능을 구현했습니다.
  • 특이한 사례와 디버깅 문제를 해결하고 분석 및 코딩 기술을 강화했습니다.

? 레벨업 아이디어

이 프로젝트는 블록체인 개발의 세계로 나아가는 디딤돌입니다. 이를 더욱 발전시키기 위한 몇 가지 아이디어는 다음과 같습니다.

  • 지갑 주소에 대한 과거 거래를 표시하려면 거래 내역 뷰어를 추가하세요.
  • 다중 지갑 지원을 구현하여 사용자가 Yoroi, Nami 또는 Eternal과 같은 지갑 간에 전환할 수 있도록 합니다.
  • 들어오고 나가는 거래 요약을 포함하여 지갑 활동 추세를 표시하는 대시보드를 만듭니다.
  • 실시간 가격 데이터를 통합하여 USD 또는 EUR와 같은 법정화폐로 ADA 잔액을 표시합니다.
  • 거래 구축 기능을 통합하여 앱에서 직접 ADA를 보내는 기능을 활성화합니다.
  • 시각적으로 매력적이고 접근하기 쉬운 디자인을 위해 어두운 모드 토글을 추가하세요.
  • 모바일 장치와의 호환성을 보장하기 위해 반응형 인터페이스를 만드세요.
  • 잘못된 지갑 주소와 같은 문제를 사용자에게 해결하도록 안내하는 더 나은 오류 메시지를 포함합니다.

? 기여할 수 있는 방법

이 프로젝트는 제가 Web3에 입문한 첫 단계이며, 최고로부터 배우고 싶습니다. 여러분의 경험, 통찰력, 제안은 이 프로젝트를 더 좋게 만드는 동시에 제가 개발자로서 성장하는 데 도움이 될 것입니다. 참여 방법은 다음과 같습니다.

  • GitHub에서 프로젝트를 포크하고 새로운 기능이나 개선 사항을 추가하세요.
  • 도구를 사용하는 동안 발생한 버그나 문제를 보고하고 해결 방법을 제안하세요.
  • GitHub 저장소에서 기능 요청이나 토론을 열어 개선 사항을 제안하세요.
  • 추가하는 새 기능에 대한 자세한 문서를 작성하여 다른 사람이 쉽게 사용하고 구축할 수 있도록 하세요.

✨ 고려해야 할 새로운 기능

  • 손쉬운 지갑 주소 공유 및 스캔을 위해 QR 코드 지원을 추가합니다.
  • 잔고 업데이트, 거래 확인 등의 이벤트에 대한 알림을 구현합니다.
  • 초보자를 위해 블록체인 기본 사항을 설명하는 교육 섹션을 포함합니다.
  • 잦은 지갑 사용을 위한 업적이나 새로운 기능 탐색과 같은 게임화된 요소를 소개합니다.
  • 스테이킹 보상과 위임 상태를 표시하는 스테이킹 기능을 개발하세요.

계속 구축하고 혁신하세요. 여러분의 기여와 창의성이 이 도구의 미래를 만들어 갈 수 있습니다! ?

? 도움이 필요하신가요?

막히셨나요? 버그를 발견하셨나요? 채팅하고 싶으신가요? 아래에 댓글을 남기거나 Twitter에서 저를 찾아보세요!
기억하세요, 우리 모두는 어딘가에서 시작했고 유일한 멍청한 질문은 당신이 묻지 않은 질문이라는 것입니다!

블록체인 탐험가 여러분, 즐거운 코딩 되세요! ?

위 내용은 소개. JavaScript로 Cardano 지갑 검사기 웹 구축하기.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿