# 토큰

### 1. **XRP Ledger에서의 토큰**

XRP Ledger에서는 사용자가 자신의 토큰을 발행할 수 있습니다. 이러한 토큰은 IOU (I Owe You, '나는 너에게 빚이 있다')로도 불립니다. 이는 토큰 발행자가 토큰 소지자에게 토큰이 나타내는 가치를 보장한다는 의미입니다.

예를 들어, 은행이 물리적 화폐를 대신하여 디지털 토큰을 발행할 수 있습니다. 이 토큰은 은행의 예금을 나타내며, 토큰 소지자는 이 토큰을 은행에 제출하여 해당하는 화폐를 받을 수 있습니다. 이 경우, 토큰은 은행의 IOU가 되며, 은행은 토큰을 보장하는 주체가 됩니다.

### **2. 사용자 정의 토큰의 이점**

사용자 정의 토큰은 다양한 이점을 제공합니다.

1. **유연성**: 사용자 정의 토큰은 상품, 서비스, 포인트, 주식, 거래, 소유권 등 다양한 형태의 가치를 나타낼 수 있습니다.
2. **접근성**: 토큰은 디지털 네트워크를 통해 전 세계 어디서나 쉽게 전송될 수 있습니다. 이를 통해 전 세계의 사람들이 다양한 서비스와 자산에 접근할 수 있게 됩니다.
3. **효율성**: 토큰화를 통해 자산 전송의 속도와 효율성을 크게 향상시킬 수 있습니다. 디지털 토큰은 빠르게 전송되고, 이를 통해 글로벌한 거래가 가능해집니다.

### **3. Trust line**

XRP Ledger에서 토큰을 받기 위해서는 먼저 토큰 발행자에 대한 Trust line을 설정해야 합니다. Trust line은 특정 계정이 특정 토큰 발행자로부터 토큰을 받아들일 의향이 있음을 나타냅니다.

Trust line을 설정할 때, 사용자는 토큰의 종류와 최대 수량을 지정합니다. 이는 사용자가 해당 토큰에 대해 얼마나 신뢰를 가지고 있는지를 나타내며, 사용자는 이 설정을 통해 자신이 받을 수 있는 토큰의 최대 수량을 제한할 수 있습니다.

### **4. Gateway**

XRP Ledger에서, 토큰 발행자는 종종 'Gateway'라고 불립니다. Gateway는 XRP Ledger에서의 토큰 발행과 토큰의 환불에 대한 책임이 있습니다. 특정 사용자가 토큰을 반환하려면, 사용자는 Gateway에 토큰을 반환하고, Gateway는 약속한 가치 (예를 들어, 물리적 화폐)를 반환합니다.

XRP Ledger의 게이트웨이는 금융 시스템과 블록체인을 연결하는 중요한 역할을 하는 서비스 제공자입니다. 게이트웨이는 일반적으로 사용자가 XRP Ledger의 장점을 활용하면서도 기존의 금융 시스템에서 사용하는 통화나 자산을 계속 사용할 수 있게 합니다.

특히, XRP Ledger의 게이트웨이는 다음과 같은 역할을 합니다:

1. **입금과 출금:** 사용자는 게이트웨이를 통해 자신의 자산을 XRP Ledger로 입금하거나, 반대로 XRP Ledger에서 자신의 자산을 출금할 수 있습니다.
2. **IOU 발행:** 게이트웨이는 XRP Ledger에서 자신이 사용자에게 owe하는 것(IOU, "I Owe You"의 약자)를 발행할 수 있습니다. 예를 들어, 사용자가 게이트웨이에 100달러를 입금하면, 게이트웨이는 사용자에게 100달러의 IOU를 발행합니다. 이 IOU는 XRP Ledger에서 자유롭게 거래될 수 있습니다.
3. **자산 교환:** XRP Ledger의 게이트웨이는 XRP와 다른 자산 간의 교환 서비스를 제공할 수도 있습니다. 이를 통해 사용자는 XRP와 IOU 간, 또는 두 IOU 간에 거래할 수 있습니다.

게이트웨이는 일반적으로 신뢰를 기반으로 작동합니다. 즉, 사용자는 게이트웨이가 입금된 자산을 안전하게 보관하고, IOU를 실제 자산으로 교환할 수 있다는 것을 신뢰해야 합니다. 따라서, 신뢰할 수 있는 게이트웨이를 선택하는 것이 중요합니다. 게이트웨이는 고객의 자금을 안전하게 보호하고, 투명하고 정직한 서비스를 제공하는 데 필요한 시스템과 절차를 갖추고 있어야 합니다.

### **5. XRP와 IOU**

XRP는 그 자체로 가치를 가진 디지털 화폐이며, XRP Ledger에서의 IOU와는 다릅니다. Ripple은 플랫폼의 원래 화폐이며, 가치를 전송하는 데 사용됩니다. 반면 IOU는 특정 가치를 나타내는 토큰으로, 발행자에게 이를 환불해달라는 요청을 나타냅니다.

### **6. 결론**

따라서, XRP Ledger의 사용자 정의 토큰 기능은 전 세계의 사람들이 자신의 가치를 디지털화하고, 이를 효율적으로 전송하고 관리할 수 있게 해줍니다. 이는 금융의 민주화를 이끌어내는 중요한 도구로 작용할 수 있습니다. 그러나 사용자는 토큰 발행자 또는 Gateway에 대한 충분한 신뢰를 가지고 있어야 하며, 토큰의 가치를 환불 받을 수 있는지 확인해야 합니다. 이러한 이유로, XRP Ledger는 Trust line과 같은 메커니즘을 사용하여 사용자가 받을 수 있는 토큰의 수량을 제한하고, 토큰 발행자에 대한 신뢰를 설정하게 합니다.

### **7. 활용 사례 (Use cases)**

XRP Ledger는 그 자체로 훌륭한 디지털 화폐인 XRP를 제공하지만, 그것만이 아닙니다. 사용자가 자신만의 토큰을 만들고, 이를 전송하고, 거래할 수 있는 기능도 제공합니다. 이러한 토큰은 다양한 유스케이스를 가능하게 하며, 이는 XRP Ledger를 단순한 디지털 화폐를 넘어, 다양한 가치를 나타내고 이를 전송하는 플랫폼으로 만듭니다.

1. **디지털 화폐**: 기관이나 개인은 자신의 디지털 화폐를 발행할 수 있습니다. 이는 실물 화폐를 대체하거나, 새로운 경제 시스템을 만드는 데 사용될 수 있습니다. 예를 들어, 중앙은행이나 금융기관은 자신의 디지털 화폐를 발행하여, 기존의 실물 화폐를 대체하거나 보완할 수 있습니다. 이렇게 생성된 디지털 화폐는 빠르고 효율적인 결제를 가능하게 하며, 또한 이를 통해 새로운 종류의 경제 활동을 촉진할 수 있습니다.
2. **포인트 시스템**: 기업은 자신의 서비스를 이용하는 사용자에게 포인트를 지급하고, 이 포인트를 다른 사용자와 거래하거나, 서비스 내에서 사용할 수 있도록 할 수 있습니다. 예를 들어, 온라인 쇼핑몰이나 소셜 미디어 플랫폼은 사용자의 활동을 보상하기 위해 포인트를 지급할 수 있습니다. 이 포인트는 서비스 내에서 다양한 방법으로 사용될 수 있으며, 또한 사용자들 사이에서 거래될 수 있습니다. 이는 사용자의 참여와 활동을 촉진하며, 또한 사용자가 자신의 노력과 시간에 대한 보상을 받을 수 있게 합니다.

이 외에도, XRP Ledger의 토큰 기능은 다양한 유스케이스를 가능하게 합니다. 예를 들어, 기업은 자신의 주식이나 채권을 토큰으로 발행하여, 이를 쉽게 거래하고 분할할 수 있습니다. 또한, 예술가나 창작자는 자신의 작품을 토큰으로 발행하여, 이를 판매하거나 유통할 수 있습니다. 더 나아가, 토큰은 화폐 외의 다양한 가치를 나타낼 수 있습니다. 예를 들어, 토큰은 특정한 권리 (예: 투표권, 사용권, 접근권)를 나타내거나, 특정한 상태 (예: 자격, 경험, 신용)를 나타낼 수 있습니다.

이러한 유스케이스는 XRP Ledger의 발행 기능과 결합하여, 사용자가 자신의 가치를 표현하고 이를 전송하는 다양한 방법을 제공합니다. 이를 통해, XRP Ledger는 단순한 디지털 화폐를 넘어, 다양한 가치를 나타내고 이를 전송하는 플랫폼이 됩니다. 이는 디지털 화폐의 가능성을 넓히며, 또한 더 많은 사람들이 이러한 기술을 이용하고 이해할 수 있게 합니다.

***

### **샘플 프로젝트**

이 프로젝트에서는 XRP Ledger의 토큰 기능을 사용하여, 사용자가 자신의 토큰을 발행하고, 이를 전송하고, 거래할 수 있는 방법을 설명합니다. 프로젝트는 테스트넷에서 진행됩니다.

#### **1. 프로젝트 구조**

프로젝트는 다음과 같은 구조로 이루어져 있습니다.

```python
token
├── src
│   ├── account.py
│   ├── transaction.py
│   ├── request.py
│   ├── token.py
│   ├── utils.py
│   └── main.py
├── wallets
├── README.md
└── requirements.txt
```

* **src**

  프로젝트의 소스 코드가 저장된 폴더입니다.

  * **account.py**

    XRP Ledger의 계정과 지갑을 생성하고 관리하는 기능을 제공합니다.
  * **transaction.py**

    XRP Ledger의 트랜잭션을 생성하고 전송하는 기능을 제공합니다.
  * **request.py**

    XRP Ledger의 Ledger에 기록된 데이터를 조회하는 기능을 제공합니다.
  * **token.py**

    XRP Ledger의 토큰을 생성하고 관리하는 기능을 제공합니다.
  * **utils.py**

    프로젝트에서 사용되는 상수나 유틸리티 함수를 제공합니다.
  * **main.py**

    프로젝트를 실행하는 메인 함수입니다.
* **wallets**

  프로젝트에서 사용되는 지갑이 저장된 폴더입니다.
* **README.md**

  프로젝트의 설명이 저장된 파일입니다.
* **requirements.txt**

  프로젝트에 필요한 패키지가 저장된 파일입니다.

#### **2. 프로젝트 설치 및 실행 방법**

깃허브에서 프로젝트를 클론합니다.

```python
git clone
```

프로젝트 폴더로 이동합니다.

```python
cd token
```

프로젝트에 필요한 패키지를 설치합니다.

```python
pip install -r requirements.txt
```

프로젝트를 실행합니다.

```python
python src/main.py
```

#### **3. 프로젝트 실행**

프로젝트를 실행하면, 다음과 같은 메뉴가 나타납니다.

```python
1. Create New Wallet
2. Connect Existing Wallet
3. Exit
```

이 메뉴에서는 사용자가 자신의 지갑을 생성하거나 원래 존재하는 지갑 파일을 연결할 수 있습니다. 실행하고 싶은 기능의 번호를 입력하면 됩니다.

**3-1. 지갑 생성 또는 연결**

지갑을 새롭게 생성하거나 원래 있던 지갑을 연결하기 위해서는, 메뉴에서 `1` 또는 `2`를 입력합니다. 그러면 다음과 같은 메시지가 나타납니다.

```python
Enter wallet name:
```

이 메시지에서는 지갑의 이름을 입력하라는 의미입니다. 지갑을 새롭게 만드는 경우, 지갑의 이름은 자유롭게 지정할 수 있습니다. 또는 원래 있던 지갑을 연결하는 경우, wallets 폴더에 있는 json 형식의 지갑 파일의 이름을 입력하면 됩니다. 예를 들어, 'issuer'이라는 이름을 입력하면 다음과 같은 메시지가 나타납니다.

```python
Enter wallet name: issuer
```

이제 지갑이 생성되었습니다. 지갑은 `wallets` 폴더 내부에 저장됩니다. 지갑의 이름은 지갑이 저장된 파일의 이름이 됩니다. 예를 들어, 위의 예시에서는 `issuer.json`이라는 이름의 파일이 생성됩니다.

같은 방법으로 토큰을 받는 계정을 생성합니다.

```python
Enter wallet name: receiver
```

```
wallets
├── issuer.json
└── receiver.json
```

json 형식의 지갑 파일을 직접 열어보면 다음과 같이 볼 수 있습니다. 주소는 address에 저장 되어 있습니다.

예시에 나와있는 지갑은 설정이나 trust line 등이 이미 세팅되어 있으므로, 직접 지갑을 새롭게 생성해서 사용해주세요.

**issuer.json**:

```python
{
  "seed": "sEd7YtKRNTUB6i4MXeWcrao5PApfG3g",
  "algorithm": "ed25519",
  "public_key": "ED160FBBC21DC90DA0A286D176A98B5DFF39E0E7E05F09F1933C3A5224BD8DF371",
  "private_key": "ED74A1562C63B3E1D9492E9C407B6CDA4DE47C8453A2129B310CAA1EDDE19A3A1B",
  "address": "rhE2S4diqdVbSsL8vgRZYWhQff8EEYh2j5"
}
```

**receiver.json**:

```python
{
  "seed": "sEdThckhEJzRX2sBsQp5FAZNyQQX4GA",
  "algorithm": "ed25519",
  "public_key": "ED40D1FADCDFB0CD75485F90E49B8335E4CD4B8954018F83E1DBD9184C27598AE7",
  "private_key": "EDF424EFE9F6C6C0383E12C95127B418AAD058AA0E2F913A08B123D9673DAD8CA4",
  "address": "rncYkBqviQahP2fbrBfVZWKvCctNtG4uk4"
}
```

이제 지갑이 연결되었으면, 다음과 같은 메뉴가 나타납니다. 전과 마찬가지로 원하는 번호를 입력해 연결된 지갑을 통해 다음의 기능들을 사용할 수 있습니다.

```python
1. Send XRP
2. Set Trust Line
3. Send Token (IOU)
4. Check Balance
5. Check Trust Lines
6. Change Account Settings
7. Connect Another Wallet
8. Exit
```

이제 issuer가 receiver에게 토큰을 발행 및 전송하는 과정을 살펴보겠습니다.\\

**3-2. Trust line 설정**

토큰을 전송받기 위해서는 먼저 토큰 발행자에 대한 Trust line을 설정해야 합니다. 그렇기 때문에, 토큰을 전송받을 계정인 receiver로 연결해 주세요.

다음으로 토큰 발행자 계정에 대한 Trust line을 설정하기 위해서는, 메뉴에서 `2`를 입력합니다. 그러면 다음과 같은 메시지가 나타납니다.

```python
Enter issuer address:
```

이제 Trust line을 설정할 토큰의 종류와 수량을 차례로 입력합니다. 예를 들어, 'USD'라는 토큰에 대한 Trust line을 100개 설정하려면 다음과 같은 메시지가 나타납니다.

```python
Enter token name: USD
```

```
Enter trust line limit: 100
```

이제 Trust line이 설정됩니다. Trust line이 설정되면 다음과 같은 결과 메시지가 나타납니다.

```python
Result
```

**3-3. 토큰 전송**

이제 토큰을 전송하기 위해, 토큰 발행자 계정인 issuer로 연결해 주세요.

토큰을 전송하기 위해서는, 메뉴에서 `3`을 입력합니다. 그러면 다음과 같은 메시지가 나타납니다.

이제 토큰을 받을 계정의 주소를 입력합니다. 예시 receiver의 주소인 `rncYkBqviQahP2fbrBfVZWKvCctNtG4uk4`를 입력하면 다음과 같은 메시지가 나타납니다.

```python
Enter receiver address: rncYkBqviQahP2fbrBfVZWKvCctNtG4uk4
```

이제 전송할 토큰의 종류와 수량을 차례로 입력합니다. 예를 들어, 'USD'라는 토큰 10개 전송하려면 다음과 같은 메시지가 나타납니다.

```python
Enter token name: USD
```

```
Enter token amount: 10
```

이제 토큰이 전송됩니다. 토큰이 전송되면 다음과 같은 결과 메시지가 나타납니다.

```python
Result
```

**3-4. Trust lines 조회**

토큰이 전송되었는지 확인하기 위해 trust lines를 조회합니다. 이를 위해, 메뉴에서 `5`를 입력합니다. 그러면 다음과 같은 메시지가 나타납니다.

```python
Enter account address:
```

이제 잔액을 조회할 계정의 주소를 입력합니다. 예를 들어, receiver의 주소인 `rncYkBqviQahP2fbrBfVZWKvCctNtG4uk4`를 입력하면 다음과 같은 메시지가 나타납니다. (주소를 입력하지 않고 엔터를 누르면, 현재 연결된 계정의 주소가 입력됩니다.)

```python
Result
```
