누구나 비공식적인 "IOUs"부터 법정화폐 기반 스테이블코인, 순수 디지털 대체 가능 토큰 및 반대체 가능 토큰 등 다양한 유형의 토큰을 XRP Ledger에서 발행할 수 있습니다. 이 튜토리얼에서는 원장에 토큰을 생성하는 기술적 단계를 보여드립니다. XRP Ledger 토큰의 작동 방식에 대한 자세한 내용은 Issued Currencies를, 스테이블코인 발행과 관련된 비즈니스 의사 결정에 대한 자세한 내용은 Stablecoin Issuer를 참조하세요.
요구 조건(Prerequisites)
각각 주소, 비밀 키, 약간의 XRP가 예치 되어 있는 2개의 XRP Ledger 계정이 필요합니다. 이 튜토리얼에서는 필요에 따라 새 테스트 자격 증명을 생성할 수 있습니다.
각 주소에는 신뢰선에 대한 추가 준비금을 포함해 준비금 요건을 충족할 수 있는 충분한 XRP가 필요합니다.
XRP 원장 네트워크에 연결해야 합니다. 이 튜토리얼에 나와 있는 것처럼 공용 서버를 사용해 테스트할 수 있습니다.
선호하는 클라이언트 라이브러리에 대한 시작하기 지침을 숙지하고 있어야 합니다. 이 페이지에서는 다음에 대한 예제를 제공합니다:
xrpl.js library를 사용한 JavaScript .
설정 단계는 JavaScript를 사용하여 시작하기를 참조하세요.
xrpl-py library를 사용하는 Python .
설정 단계는 Python을 사용하여 시작하기를 참조하세요.
xrpl4j library가 포함된 Java .
설정 단계는 Java를 사용하여 시작하기를 참조하세요.
별도의 설정 없이 브라우저에서 대화형 단계를 따라 읽고 사용할 수도 있습니다.
예제 코드(Example Code)
이 튜토리얼의 모든 단계에 대한 전체 샘플 코드는 MIT license에 따라 사용할 수 있습니다.
XRP Ledger에서 거래하려면 주소와 비밀 키, 그리고 약간의 XRP가 필요합니다. 또한 발행한 토큰을 기꺼이 보유할 한 명 이상의 수신자가 필요합니다. 다른 블록체인과 달리 XRP Ledger에서는 원하지 않는 토큰을 강제로 보유하도록 강요할 수 없습니다.
가장 좋은 방법은 "콜드" 주소와 "핫" 주소를 사용하는 것입니다. 콜드 주소는 토큰의 발행자입니다. 핫 주소는 사용자가 관리하는 일반 사용자의 주소와 같습니다. 콜드 주소에서 토큰을 받은 다음 다른 사용자에게 전송할 수 있습니다. 콜드 주소에서 사용자에게 직접 토큰을 보낼 수 있으므로 핫 주소가 반드시 필요한 것은 아니지만, 보안상 좋은 습관입니다. 프로덕션 환경에서는 콜드 주소를 핫 주소보다 교체하기가 훨씬 어렵기 때문에 콜드 주소의 암호화 키를 오프라인 상태로 유지하는 등 각별히 관리해야 합니다.
이 튜토리얼에서는 핫 주소가 콜드 주소에서 발급한 토큰을 받습니다. 다음 인터페이스를 사용하여 두 주소의 키를 얻을 수 있습니다.
네트워크에 트랜잭션을 제출하려면 네트워크에 연결되어 있어야 합니다. 다음 코드는 지원되는 클라이언트 라이브러리가 있는 public XRP Ledger 테스트넷 서버에 연결하는 방법을 보여줍니다:
// In browsers, use a <script> tag. In Node.js, uncomment the following line:// const xrpl = require('xrpl')// Wrap code in an async function so we can use awaitasyncfunctionmain() {// Define the network clientconstclient=newxrpl.Client("wss://s.altnet.rippletest.net:51233")awaitclient.connect()// ... custom code goes here// Disconnect when done (If you omit this, Node.js won't end the process)client.disconnect()}main()
// Construct a network client ----------------------------------------------HttpUrl rippledUrl =HttpUrl.get("https://s.altnet.rippletest.net:51234/");XrplClient xrplClient =newXrplClient(rippledUrl);// Get the current network feeFeeResult feeResult =xrplClient.fee();FieldValueTransactionType "TrustSet"AccountThe hot address. (More generally,this is the account that wants to receive the token.)LimitAmountAn object specifying how much, of which token, from which issuer, you are willing to hold.LimitAmount.currencyThe currency code of the token.LimitAmount.issuerThe cold address.LimitAmount.valueThe maximum amount of the token you are willing to hold.
Note:
이 튜토리얼의 JavaScript 코드 샘플은 async/await 패턴을 사용합니다. await은 비동기 함수 내에서 사용해야 하므로, 나머지 코드 샘플은 여기서 시작한 main() 함수 내에서 계속 진행되도록 작성되었습니다. 원하는 경우 async/await 대신 Promise 메소드 .then() 및 .catch()를 사용할 수도 있습니다.
먼저, 콜드 주소(토큰 발급자가 될)에 대한 설정을 구성합니다. 다음과 같은 예외를 제외하고 대부분의 설정은 나중에 재구성할 수 있습니다:
기본 Ripple(Default Ripple):
이 설정은 사용자가 서로 토큰을 보낼 수 있도록 하기 위해 필요합니다. 신뢰선을 설정하거나 토큰을 발급하기 전에 이 설정을 활성화하는 것이 가장 좋습니다.
승인된 신뢰선(Authorized Trust Lines):
(선택 사항) 이 설정('인증 필요'라고도 함)은 명시적으로 승인한 계정만 토큰을 보유하도록 제한합니다. 이미 토큰에 대한 인증번호나 오퍼가 있는 경우에는 이 설정을 사용할 수 없습니다.
참고: 승인된 신뢰선을을 사용하려면 이 튜토리얼에 표시되지 않은 추가 단계를 수행해야 합니다.
대부분의 트랜잭션은 제출된 후 다음 ledger 버전으로 승인되므로, 트랜잭션 결과가 최종 확정되기까지 4~7초가 소요될 수 있습니다. 이전 트랜잭션이 완전히 검증될 때까지 기다렸다가 이후 단계로 진행해야 순서에 맞지 않게 실행되어 예기치 않은 실패를 방지할 수 있습니다. 자세한 내용은 안정적인 트랜잭션 제출을 참조하세요.
이 튜토리얼의 코드 샘플은 트랜잭션을 제출할 때 유효성 검사를 기다리는 도우미 함수를 사용합니다:
계정 소유권을 확인할 수 있도록 소유하고 있는 도메인으로 설정합니다. 이렇게 하면 혼동이나 사칭 시도를 줄일 수 있습니다.
다음 코드 샘플은 권장 핫 주소 설정을 활성화하기 위해 AccountSet 트랜잭션을 보내는 방법을 보여줍니다:
// Configure hot address settings --------------------------------------------consthot_settings_tx= {"TransactionType":"AccountSet","Account":hot_wallet.address,"Domain":"6578616D706C652E636F6D",// "example.com"// enable Require Auth so we can't use trust lines that users// make to the hot address, even by accident:"SetFlag":xrpl.AccountSetAsfFlags.asfRequireAuth,"Flags": (xrpl.AccountSetTfFlags.tfDisallowXRP |xrpl.AccountSetTfFlags.tfRequireDestTag) }consthst_prepared=awaitclient.autofill(hot_settings_tx)consthst_signed=hot_wallet.sign(hst_prepared)console.log("Sending hot address AccountSet transaction...")consthst_result=awaitclient.submitAndWait(hst_signed.tx_blob)if (hst_result.result.meta.TransactionResult =="tesSUCCESS") {console.log(`Transaction succeeded: https://testnet.xrpl.org/transactions/${hst_signed.hash}`) } else {throw`Error sending transaction: ${hst_result.result.meta.TransactionResult}` }
# Configure hot address settings -----------------------------------------------hot_settings_tx = xrpl.models.transactions.AccountSet( account=hot_wallet.address, set_flag=xrpl.models.transactions.AccountSetAsfFlag.ASF_REQUIRE_AUTH,)print("Sending hot address AccountSet transaction...")response = xrpl.transaction.submit_and_wait(hot_settings_tx, client, hot_wallet)print(response)
7. 핫 주소에서 콜드 주소로 신뢰선 생성(Create Trust Line from Hot to Cold Address)
토큰을 받으려면 먼저 토큰 발급자에 대한 신뢰선을 만들어야 합니다. 이 트랜잭션 라인은 USD 또는 FOO와 같이 발행하려는 토큰의 통화 코드에 따라 다릅니다. 원하는 통화 코드는 무엇이든 선택할 수 있으며, 각 발행자의 토큰은 XRP Ledger 프로토콜에서 별도의 토큰으로 취급됩니다. 그러나 사용자가 리플 설정을 활성화하면 동일한 통화 코드를 가진 토큰의 잔액이 다른 발행자 간에 리플될 수 있습니다.
핫 주소는 발행자로부터 토큰을 받기 전에 이와 같은 트러스트 라인이 필요합니다. 마찬가지로 토큰을 보유하려는 각 사용자도 trust line¹을 생성해야 합니다. 각 신뢰선은 핫 주소의 reserve requirement을 증가시키므로, 증가된 요구량을 지불할 수 있는 충분한 양의 XRP를 보유해야 합니다. 신뢰선을 제거하면 reserve requirement은 다시 낮아집니다.
Tip:
신뢰선에는 받는 사람이 보유할 수 있는 토큰의 양에 대한 '한도'가 있으며, 다른 사람은 지정된 한도보다 더 많은 토큰을 보낼 수 없습니다. 커뮤니티 크레딧 시스템의 경우, 해당 사람을 얼마나 신뢰하는지에 따라 개인별 한도를 구성할 수 있습니다. 다른 유형과 용도의 토큰의 경우 일반적으로 한도를 매우 큰 수로 설정해도 괜찮습니다.
// Create trust line from hot to cold address --------------------------------constcurrency_code="FOO"consttrust_set_tx= {"TransactionType":"TrustSet","Account":hot_wallet.address,"LimitAmount": {"currency": currency_code,"issuer":cold_wallet.address,"value":"10000000000"// Large limit, arbitrarily chosen } }constts_prepared=awaitclient.autofill(trust_set_tx)constts_signed=hot_wallet.sign(ts_prepared)console.log("Creating trust line from hot address to issuer...")constts_result=awaitclient.submitAndWait(ts_signed.tx_blob)if (ts_result.result.meta.TransactionResult =="tesSUCCESS") {console.log(`Transaction succeeded: https://testnet.xrpl.org/transactions/${ts_signed.hash}`) } else {throw`Error sending transaction: ${ts_result.result.meta.TransactionResult}` }
# Create trust line from hot to cold address -----------------------------------currency_code ="FOO"trust_set_tx = xrpl.models.transactions.TrustSet( account=hot_wallet.address, limit_amount=xrpl.models.amounts.issued_currency_amount.IssuedCurrencyAmount( currency=currency_code, issuer=cold_wallet.address, value="10000000000", # Large limit, arbitrarily chosen ))print("Creating trust line from hot address to issuer...")response = xrpl.transaction.submit_and_wait(trust_set_tx, client, hot_wallet)print(response)