> ## Documentation Index
> Fetch the complete documentation index at: https://docs.plasma.org/llms.txt
> Use this file to discover all available pages before exploring further.

# 개발 환경 설정

> 도구를 구성하고 스마트 계약 개발을 위해 Plasma에 연결합니다.

Plasma는 완전한 EVM 호환성을 갖추어, 표준 Ethereum 도구를 사용하면서 스테이블코인 네이티브 애플리케이션에 최적화된 기능의 혜택을 받을 수 있습니다. Plasma의 아키텍처 세부 사항을 더 알아보려면 [아키텍처 개요](../../plasma-chain/architecture/system-overview.mdx) 섹션을 참조하십시오.

## RPC 연결 확인

두 Plasma 네트워크 모두에 대해 공개 RPC 엔드포인트가 제공됩니다:

```shell theme={null}
# Mainnet (recommended)
curl --location https://rpc.plasma.to --header 'Content-Type: application/json' --data '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}'

# Testnet (optional)
curl --location https://testnet-rpc.plasma.to --header 'Content-Type: application/json' --data '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}'
```

메인넷 응답은 다음과 유사합니다:

```output theme={null}
{"jsonrpc":"2.0","id":1,"result":"0x11180f"}
```

<Tip>
  공개 엔드포인트는 속도 제한이 있습니다. 프로덕션 용도나 빈번한 요청을 위해서는 [파트너 RPC 제공자](../../plasma-chain/tools/rpc-providers) 사용을 고려하십시오.
</Tip>

## 개발 도구 구성

아래는 [Hardhat](#hardhat) 및 [Truffle](#truffle-configuration) 예제입니다:

### Hardhat

두 Plasma 네트워크를 포함하도록 `hardhat.config.js` 파일을 만들거나 수정합니다:

```javascript theme={null}
require("dotenv").config();

module.exports = {
  networks: {
    plasmaMainnet: {
      url: process.env.MAINNET_RPC_ENDPOINT || "https://rpc.plasma.to",
      chainId: 9745,
      accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : []
    },
    // Optional: enable the testnet for staging.
    plasmaTestnet: {
      url: process.env.TESTNET_RPC_ENDPOINT || "https://testnet-rpc.plasma.to",
      chainId: 9746,
      accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : []
    }
  },
  solidity: {
    version: "0.8.28",
    settings: {
      optimizer: {
        enabled: true,
        runs: 200
      }
    }
  }
};
```

### Truffle 구성

Truffle을 사용하는 경우 `truffle-config.js`를 업데이트하십시오:

```javascript theme={null}
const HDWalletProvider = require('@truffle/hdwallet-provider');

module.exports = {
  networks: {
    plasmaMainnet: {
      provider: () => new HDWalletProvider(
        "<YOUR_MNEMONIC_HERE>",
        process.env.MAINNET_RPC_ENDPOINT || "https://rpc.plasma.to",
      ),
      network_id: 9745,
      gas: 5500000,
    },
    plasmaTestnet: {
      provider: () => new HDWalletProvider(
        "<YOUR_MNEMONIC_HERE>",
        process.env.TESTNET_RPC_ENDPOINT || "https://testnet-rpc.plasma.to",
      ),
      network_id: 9746,
      gas: 5500000,
    }
  },
  compilers: {
    solc: {
      version: "0.8.28",
      settings: {
        optimizer: {
          enabled: true,
          runs: 200
        }
      }
    }
  }
};
```

## 지갑 통합

### Web3.js 통합

```javascript theme={null}
const Web3 = require('web3');
const web3 = new Web3(process.env.MAINNET_RPC_ENDPOINT || 'https://rpc.plasma.to');

// Check connection
web3.eth.getBlockNumber()
  .then(blockNumber => console.log('Connected to Plasma node. Current block:', blockNumber))
  .catch(error => console.error('Connection error:', error));
```

### Ethers.js 통합

```javascript theme={null}
const { ethers } = require('ethers');
const provider = new ethers.JsonRpcProvider('https://testnet-rpc.plasma.to');

// Check connection
provider.getBlockNumber()
  .then(blockNumber => console.log('Connected to Plasma node. Current block:', blockNumber))
  .catch(error => console.error('Connection error:', error));
```

## 설정 검증

개발 환경이 올바르게 설정되었는지 확인하기 위한 간단한 스크립트를 작성합니다:

```javascript theme={null}
const { ethers } = require('ethers');
require('dotenv').config();

async function testSetup() {
  // Connect to the Plasma node.
  const provider = new ethers.JsonRpcProvider('https://testnet-rpc.plasma.to');
  
  // Get network information.
  const network = await provider.getNetwork();
  console.log('Connected to network:', network);
  
  // Get current block number.
  const blockNumber = await provider.getBlockNumber();
  console.log('Current block number:', blockNumber);
  
  // Optionally, print address and balance if PRIVATE_KEY is set.
  if (process.env.PRIVATE_KEY) {
    const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);
    const balance = await provider.getBalance(wallet.address);
    console.log('Account address:', wallet.address);
    console.log('Balance:', ethers.formatEther(balance), 'XPL');
  } else {
    console.log('Set PRIVATE_KEY to also print address and balance.');
  }
}

testSetup()
  .then(() => console.log('Setup test completed successfully'))
  .catch(error => console.error('Setup test failed:', error));
```

## 문제 해결

| 문제                 | 조치                                |
| :----------------- | :-------------------------------- |
| **연결 거부됨**         | RPC 엔드포인트가 올바르고 접근 가능한지 확인        |
| **가스 추정 실패**       | 지갑에 충분한 XPL이 있는지 확인               |
| **Solidity 버전 오류** | Plasma가 지원하는 컴파일러 버전에 맞도록 구성 업데이트 |
| **트랜잭션 실패**        | RPC URL과 올바른 체인 ID 확인             |
