2. CheckCancel 트랜잭션에 서명하기(Sign the CheckCancel transaction)
트랜잭션에 서명하는 가장 안전한 방법은 클라이언트 라이브러리를 사용하여 로컬로 서명하는 것입니다. 또는 자체 rippled 노드를 실행하는 경우 서명 방법을 사용하여 트랜잭션에 서명할 수 있지만, 신뢰할 수 있고 암호화된 연결 또는 로컬(동일 컴퓨터) 연결을 통해 수행해야 합니다.
어떤 경우든 나중에 사용할 수 있도록 서명된 트랜잭션의 식별 해시를 기록해 두세요.
요청 예시(Example Request)
'use strict'constRippleAPI=require('ripple-lib').RippleAPI// Can sign offline if the txJSON has all required fieldsconstapi=newRippleAPI()consttxJSON='{"Account":"rBXsgNkPcDN2runsvWmwxk3Lh97zdgo9za","TransactionType":"CheckCancel","CheckID":"2E0AD0740B79BE0AAE5EDD1D5FC79E3C5C221D23C6A7F771D85569B5B91195C2","Flags":2147483648,"LastLedgerSequence":8004884,"Fee":"12","Sequence":7}'// Be careful where you store your real secret.constsecret='s████████████████████████████'constsigned=api.sign(txJSON, secret)console.log("tx_blob is:",signed.signedTransaction)console.log("tx hash is:",signed.id)
tx_blob is: 12001222800000002400000007201B007A251450182E0AD0740B79BE0AAE5EDD1D5FC79E3C5C221D23C6A7F771D85569B5B91195C268400000000000000C732103B6FCD7FAC4F665FE92415DD6E8450AD90F7D6B3D45A6CFCF2E359045FF4BB4007446304402205D77451B0D7BCDA1FE5B98763C5B3B2837453371FE93C2B86157C44B1867AE36022003800273848BC2F8E1C6EC7EE4B0CB2425A888AE80E586886C306C796B25678B8114735FF88E5269C80CD7F7AF10530DAB840BBF6FDFtx hash is: 54A7A917BE9AC13962251BCF1D09803C7BBE75882B8BFC987B5933A566A48215
Loading: "/etc/opt/ripple/rippled.cfg"2018-Jan-2401:11:07 HTTPClient:NFO Connecting to 127.0.0.1:5005{"result": {"status":"success","tx_blob":"12001222800000002400000003501849647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB068400000000000000C7321022C53CD19049F32F31848DD3B3BE5CEF6A2DD1EFDA7971AB3FA49B1BAF12AEF78744630440220615F9D19FA182F08530CD978A4C216C8676D0BA9EDB53A620AC909AA0EF0FE7E02203A09CC34C3DB85CCCB3137E78081F8F2B441FB0A3B9E40901F312D3CBA0A67A181147990EC5D1D8DF69E070A968D4B186986FDF06ED0","tx_json": {"Account":"rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo","CheckID":"49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0","Fee":"12","Flags":2147483648,"Sequence":3,"SigningPubKey":"022C53CD19049F32F31848DD3B3BE5CEF6A2DD1EFDA7971AB3FA49B1BAF12AEF78","TransactionType":"CheckCancel","TxnSignature":"30440220615F9D19FA182F08530CD978A4C216C8676D0BA9EDB53A620AC909AA0EF0FE7E02203A09CC34C3DB85CCCB3137E78081F8F2B441FB0A3B9E40901F312D3CBA0A67A1","hash":"414558223CA8595916BB1FEF238B3BB601B7C0E52659292251CE613E6B4370F9" } }}
3. 서명된 CheckCancel 트랜잭션 제출하기(Submit the signed CheckCancel transaction)
이전 단계에서 서명된 트랜잭션 blob을 가져와 rippled 서버에 제출합니다. rippled 서버를 실행하지 않아도 안전하게 이 작업을 수행할 수 있습니다. 응답에는 임시 결과가 포함되며, 이 결과는 일반적으로 tesSUCCESS여야 하지만 최종 결과는 아닙니다. 대기 중인 트랜잭션은 일반적으로 다음 오픈 ledger 버전에 포함되므로(일반적으로 제출 후 약 10초 후), terQUEUED의 임시 응답도 괜찮습니다.
Tip:
예비 결과가 tefMAX_LEDGER인 경우, 트랜잭션이 영구적으로 실패한 것은 LastLedgerSequence 매개변수가 현재 ledger보다 낮기 때문입니다. 이는 트랜잭션 준비와 제출 사이에 예상되는 ledger 버전 수보다 오래 걸리는 경우 발생합니다. 이 경우 더 높은 LastLedgerSequence 값으로 1단계부터 다시 시작하세요.
요청 예시(Example Request)
'use strict'constRippleAPI=require('ripple-lib').RippleAPI// This example connects to a public Test Net serverconstapi=newRippleAPI({server:'wss://s.altnet.rippletest.net:51233'})api.connect().then(() => {console.log('Connected') const tx_blob = "12001222800000002400000007201B007A251450182E0AD0740B79BE0AAE5EDD1D5FC79E3C5C221D23C6A7F771D85569B5B91195C268400000000000000C732103B6FCD7FAC4F665FE92415DD6E8450AD90F7D6B3D45A6CFCF2E359045FF4BB4007446304402205D77451B0D7BCDA1FE5B98763C5B3B2837453371FE93C2B86157C44B1867AE36022003800273848BC2F8E1C6EC7EE4B0CB2425A888AE80E586886C306C796B25678B8114735FF88E5269C80CD7F7AF10530DAB840BBF6FDF"
returnapi.submit(tx_blob)}).then(response => {console.log("Preliminary transaction result:",response.resultCode)// Disconnect and return}).then(() => {api.disconnect().then(() => {console.log('Disconnected')process.exit() })}).catch(console.error)
Loading: "/etc/opt/ripple/rippled.cfg"2018-Jan-2401:11:07 HTTPClient:NFO Connecting to 127.0.0.1:5005{"result": {"engine_result":"tesSUCCESS","engine_result_code":0,"engine_result_message":"The transaction was applied. Only final in a validated ledger.","status":"success","tx_blob":"12001222800000002400000003501849647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB068400000000000000C7321022C53CD19049F32F31848DD3B3BE5CEF6A2DD1EFDA7971AB3FA49B1BAF12AEF78744630440220615F9D19FA182F08530CD978A4C216C8676D0BA9EDB53A620AC909AA0EF0FE7E02203A09CC34C3DB85CCCB3137E78081F8F2B441FB0A3B9E40901F312D3CBA0A67A181147990EC5D1D8DF69E070A968D4B186986FDF06ED0","tx_json": {"Account":"rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo","CheckID":"49647F0D748DC3FE26BDACBC57F251AADEFFF391403EC9BF87C97F67E9977FB0","Fee":"12","Flags":2147483648,"Sequence":3,"SigningPubKey":"022C53CD19049F32F31848DD3B3BE5CEF6A2DD1EFDA7971AB3FA49B1BAF12AEF78","TransactionType":"CheckCancel","TxnSignature":"30440220615F9D19FA182F08530CD978A4C216C8676D0BA9EDB53A620AC909AA0EF0FE7E02203A09CC34C3DB85CCCB3137E78081F8F2B441FB0A3B9E40901F312D3CBA0A67A1","hash":"414558223CA8595916BB1FEF238B3BB601B7C0E52659292251CE613E6B4370F9" } }}
4. 유효성 검사 대기(Wait for validation)
라이브 네트워크(mainnet, testnet 또는 devnet 포함)에서는 ledger이 자동으로 닫힐 때까지 4~7초 정도 기다릴 수 있습니다.
stand-alone 모드에서 rippled을 실행하는 경우 ledger_accept 메소드를 사용하여 ledger를 수동으로 닫아야 합니다.
5. 최종 결과 확인(Confirm final result)
tx 메소드와 CheckCancel 트랜잭션의 식별 해시를 사용하여 트랜잭션의 상태를 확인합니다. 트랜잭션의 메타데이터에서 "TransactionResult": "tesSUCCESS" 필드와 이 결과가 최종 결과임을 나타내는 "validated": true 필드가 있는지 확인합니다.
트랜잭션 메타데이터에서 "LedgerEntryType": "Check"가 있는 DeletedNode 객체를 찾습니다. 이것은 트랜잭션이 수표 ledger 객체를 제거했음을 나타냅니다. 이 객체의 LedgerIndex는 수표의 ID와 일치해야 합니다.
요청 예시(Example Request)
'use strict'constRippleAPI=require('ripple-lib').RippleAPI// This example connects to a public Test Net serverconstapi=newRippleAPI({server:'wss://s.altnet.rippletest.net:51233'})api.connect().then(() => {console.log('Connected')consttx_hash="54A7A917BE9AC13962251BCF1D09803C7BBE75882B8BFC987B5933A566A48215"returnapi.getTransaction(tx_hash)}).then(response => {console.log("Final transaction result:", response)// Disconnect and return}).then(() => {api.disconnect().then(() => {console.log('Disconnected')process.exit() })}).catch(console.error)