데이터베이스
시스템 요구 사항
시스템/인프라 구성도

VerifyVASP에서 제공하는 Enclave 서버에서 사용하는 데이터베이스가 필요합니다.
지원 가능한 DB : MySQL, PostgreSQL, MSSQL, Oracle
MySQL 권장합니다.
테이블 설명
기본적으로 우선 4 개의 테이블이 필요합니다.
verifications
: 사용자 검증 API에 대한 요청/응답 저장합니다.counter_party_keys
: 수신 VASP의 Public Key 저장합니다.own_keys
: 송신 VASP의 Public Key 저장합니다.commands
: 비동기 방식으로 호출되는 API 들의 중간 요청 저장합니다.
추가적으로, 사용하려는 기능에 따라 다음의 테이블들이 필요합니다.
chainalysis_sanction_results
: Chainalysis Sanction API 호출 이력 정보를 저장합니다.chainalysis_kyt_results
: Chainalysis KYT API 호출 이력 정보를 저장합니다.chainalysis_kyt_alerts
: Chainalysis KYT API 호출에 의해 생성된 alert 정보들을 저장합니다.refinitiv_wco_results
: Refinitiv World Check One API 호출 이력 정보를 저장합니다.
테이블 백업, 복원, 복구 정책
verifications
테이블은 Travel Rule 검증 히스토리가 저장되므로 매일 백업할 것을 권고합니다.own_keys
테이블은 주기적으로 백업 바랍니다.chainalysis_sanction_results
,chainalysis_kyt_results
,chainalysis_kyt_alerts
,refinitiv_wco_results
또한 주기적으로 백업 바랍니다.counter_party_keys
테이블은 Caching 용도로 사용되는 테이블로 복구할 필요가 없습니다.commands
테이블은 비동기 방식으로 호출되는 API들의 일시적인 요청이 저장되는 테이블이므로 백업 및 복구가 필요 없습니다.
테이블 크기 (스토리지 사용량)
verifications 테이블 : 요청 당 약 4 ~ 5 KB
counter_party_keys 테이블 : beneficiary 주소 당 약 1 KB
own_keys : PerVerification 키 타입을 사용한 경우 요청 당 약 1 KB
commands : 비동기 API 요청 당 약 1 ~ 5 KB
chainalysis_sanction_results : 요청 당 약 1 ~ 2 KB
chainalysis_kyt_results : 요청 당 약 2 ~ 3 KB
chainalysis_kyt_alerts : 요청 당 약 0 ~ 3 KB
refinitiv_wco_results : 요청 당 약 2 ~ 3 KB
테이블 정의
verifications 테이블 (필수)
출금 요청 시, Travel Rule을 통해 사전 검증에 대한 내용을 기록합니다.
POST /verifications API를 호출했을 때의, 요청/응답에 대한 내용을 verifications 테이블에 기록합니다.
암호화되어 저장되는 컬럼은 아래와 같습니다.
ivms101_originator
ivms101_originating_vasp
ivms101_beneficiary
ivms101_beneficiary_vasp
테이블 생성
CREATE TABLE `verifications` (
`verification_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Verification ID',
`verification_uuid` varchar(40) NOT NULL COMMENT 'Verification UUID',
`result` enum('WAIT', 'VERIFIED', 'UNKNOWN', 'DENIED', 'ERROR', 'PENDING', 'TRANSFER_ERROR') NOT NULL DEFAULT 'WAIT' COMMENT 'Verification Result',
`reason` varchar(256) DEFAULT NULL COMMENT 'Reason',
`message` varchar(1024) DEFAULT NULL COMMENT 'Additional information about the reason',
`network` varchar(128) DEFAULT NULL COMMENT 'Network for token transfer',
`symbol` varchar(16) DEFAULT NULL COMMENT 'Symbol',
`amount` varchar(128) DEFAULT NULL COMMENT 'Amount',
`trade_price` varchar(128) DEFAULT NULL COMMENT 'Trading Price',
`trade_currency` varchar(128) DEFAULT NULL COMMENT 'Trading Currency',
`trade_iso_datetime` datetime DEFAULT NULL COMMENT 'Trading time',
`is_exceeding_threshold` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'Whether the threshold has been exceeded',
`tx_hash` varchar(128) DEFAULT NULL COMMENT 'Tx hash',
`vout` varchar(128) DEFAULT NULL COMMENT 'Vout',
`originating_vasp_id` bigint(20) unsigned DEFAULT NULL COMMENT 'Originating VASP ID',
`originator_account_number` varchar(256) DEFAULT NULL COMMENT 'Originator Account Address or ID',
`ivms101_originator` text(65535) DEFAULT NULL COMMENT 'Originator Information',
`ivms101_originating_vasp` text(65535) DEFAULT NULL COMMENT 'Originating VASP Information',
`beneficiary_vasp_id` bigint(20) unsigned DEFAULT NULL COMMENT 'Beneficiary VASP ID',
`beneficiary_account_number` varchar(256) DEFAULT NULL COMMENT 'Beneficiary Account Address or ID',
`ivms101_beneficiary` text(65535) DEFAULT NULL COMMENT 'Beneficiary Information',
`ivms101_beneficiary_vasp` text(65535) DEFAULT NULL COMMENT 'Beneficiary VASP Information',
`verified_at` datetime(3) DEFAULT NULL COMMENT 'Verified at.',
`ordered_at` datetime(3) DEFAULT NULL COMMENT 'Ordered at.',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Created at.',
PRIMARY KEY (`verification_id`),
UNIQUE KEY `uk_verifications_verification_uuid` (`verification_uuid`),
INDEX `idx_verifications_originator_account` (`originator_account_number`),
INDEX `idx_verifications_beneficiary_account` (`beneficiary_account_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
counter_party_keys 테이블 (필수)
검증 과정에서 개인정보 암호화에 사용되는 beneficiary VASP의 Public Key를 저장합니다.
Originating VASP가 정한 Key Type에 따라, beneficiary VASP의 Public Key를 기록합니다.
POST /verifications API를 호출했을 때, beneficiary VASP에 대한 public key를 캐싱하고 있는지를 검사한 뒤, 없으면 자동으로 beneficiary VASP에 요청하여 이 테이블에 저장합니다.
테이블 생성
CREATE TABLE `counter_party_keys` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Key ID',
`type` enum('PerVasp', 'PerAddress', 'PerVerification') NOT NULL COMMENT 'Key types',
`vasp_id` bigint(20) unsigned NOT NULL COMMENT 'Counter party VASP ID',
`key_identifier` varchar(256) NOT NULL COMMENT 'Identifier of key (address or vaspId)',
`public_key` varchar(256) NOT NULL COMMENT 'Public Key of counter party',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created at.',
PRIMARY KEY (`id`),
UNIQUE KEY `key_uniqueness` (`vasp_id`, `key_identifier`, `type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
own_keys 테이블 (필수)
검증 과정에서 개인정보 암호화에 사용되는 Own VASP(Enclave 자신 VASP)의 public key 와 private key를 저장합니다.
상대 VASP에서 public key를 요청했을 때 Key Type에 따라 해당 테이블에 저장하고 있던 public key를 반환합니다.
private key는 암호화되어 저장합니다.
테이블 생성
CREATE TABLE `own_keys` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Key ID',
`type` enum('PerVasp', 'PerAddress', 'PerVerification') NOT NULL COMMENT 'Key types',
`key_identifier` varchar(256) NOT NULL COMMENT 'Identifier of key (address or type or public key)',
`public_key` varchar(256) NOT NULL COMMENT 'Public Key',
`private_key` varchar(256) NOT NULL COMMENT 'Private Key',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created at.',
PRIMARY KEY (`id`),
UNIQUE KEY `key_uniqueness` (`key_identifier`, `type`),
INDEX `public_key` (`public_key`, `private_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
commands 테이블 (필수)
비동기 API 호출 시 임시적인 요청이 저장되는 테이블입니다.
enclave 내부 동작을 위해 사용되며 VASP에서는 신경 쓰지 않아도 되는 테이블입니다.
테이블 생성
CREATE TABLE `commands` (
`command_id` bigint(20) unsigned NOT NULL COMMENT 'Command ID',
`command_type` varchar(32) NOT NULL COMMENT 'Command type',
`command_body` text(65535) NOT NULL COMMENT 'Command body',
`status` enum('CREATED', 'PROCESSING', 'DONE', 'ERROR') NOT NULL DEFAULT 'CREATED' COMMENT 'Command status',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created at.',
`fetched_at` datetime DEFAULT NULL COMMENT 'Fetched at.',
`finished_at` datetime DEFAULT NULL COMMENT 'Finished at.',
PRIMARY KEY (`command_id`),
INDEX `status_id` (`status`, `command_id`),
INDEX `status_finished_at` (`status`, `finished_at`),
INDEX `status_fetched_at_created_at` (`status`, `fetched_at`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
chainalysis_sanction_results 테이블 (선택)
Chainalysis Sanction 기능을 이용한 위험 평가 API를 사용할 때 필요합니다.
Chainalysis Sanction API를 통해 송수신인의 지갑 주소에 대한 위험도 레벨을 평가한 이력을 저장합니다.
테이블 생성
CREATE TABLE `chainalysis_sanction_results` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`request_id` varchar(40) NOT NULL,
`verification_uuid` varchar(40) NOT NULL,
`counterparty_vasp_id` bigint(20) unsigned NOT NULL,
`direction` enum('OUTGOING', 'INCOMING') NOT NULL,
`address` varchar(512) NOT NULL,
`status` enum('NOHIT', 'SANCTION', 'CLOSED', 'ERROR') NOT NULL,
`ofac_name` varchar(1024) DEFAULT NULL,
`ofac_description` varchar(4096) DEFAULT NULL,
`ofac_url` varchar(1024) DEFAULT NULL,
`created_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_request_id` (`request_id`),
INDEX `idx_counterparty_vasp_id` (`counterparty_vasp_id`, `created_at`),
INDEX `idx_address` (`address`, `created_at`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
chainalysis_kyt_results 테이블 (선택)
Chainalysis KYT 기능을 이용한 위험 평가 API를 사용할 때 필요합니다.
트랜잭션 리포트 하기 전이라면, Chainalysis KYT API를 통해 수신인의 지갑 주소에 대한 위험 평가 결과를 저장합니다.
트랜잭션 리포트를 한 후라면, Chainalysis KYT API를 통해 가상 자산 전송 트랜잭션에 대한 위험 평가 결과를 저장합니다.
테이블 생성
CREATE TABLE `chainalysis_kyt_results` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`request_id` varchar(40) NOT NULL,
`verification_uuid` varchar(40) NOT NULL,
`counterparty_vasp_id` bigint(20) unsigned NOT NULL,
`api_type` enum('TRANSFER', 'ATTEMPT') NOT NULL,
`user_id` varchar(128) NOT NULL,
`direction` enum('OUTGOING', 'INCOMING') NOT NULL,
`network` varchar(128) DEFAULT NULL,
`asset` varchar(16) NOT NULL,
`amount` varchar(128) NOT NULL,
`usd_price` varchar(128) DEFAULT NULL,
`transfer_ref` varchar(1024) DEFAULT NULL,
`output_address` varchar(512) DEFAULT NULL,
`timestamp` datetime(3) DEFAULT NULL,
`external_id` varchar(128) DEFAULT NULL,
`status` enum('ERROR', 'REGISTERED', 'CHECKING', 'PROCESSED') NOT NULL,
`worker_id` varchar(128) DEFAULT NULL,
`last_checked_at` datetime(3) DEFAULT NULL,
`alert_count` int(11) DEFAULT NULL,
`created_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
`assessed_at` datetime(3) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_request_id` (`request_id`),
INDEX `idx_external_id` (`external_id`),
INDEX `idx_counterparty_vasp_id` (`counterparty_vasp_id`, `created_at`),
INDEX `idx_direction` (`direction`, `created_at`),
INDEX `idx_status_last_checked_at` (`status`, `last_checked_at`),
INDEX `idx_status_worker_id` (`status`, `worker_id`, `id`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
chainalysis_kyt_alerts 테이블 (선택)
Chainalysis KYT 기능을 이용한 위험 평가 API를 사용할 때 필요합니다.
Chainalysis KYT API를 통한 위험 평가로 발생한 alert 들을 저장합니다.
위
chainalysis_kyt_results
테이블의 평가 이력과 1:n 대응됩니다.
테이블 생성
CREATE TABLE `chainalysis_kyt_alerts` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`external_id` varchar(128) NOT NULL,
`alert_id` varchar(128) NOT NULL,
`alert_level` enum('LOW', 'MEDIUM', 'HIGH', 'SEVERE') NOT NULL,
`entity_category` varchar(256) DEFAULT NULL,
`service_name` varchar(256) DEFAULT NULL,
`exposure_type` enum('DIRECT', 'INDIRECT') NOT NULL,
`alert_amount` varchar(128) NOT NULL,
`created_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_alert_id` (`alert_id`),
INDEX `idx_external_id` (`external_id`),
INDEX `idx_alert_level` (`alert_level`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
refinitiv_wco_results 테이블 (선택)
Refinitiv WCO 기능을 이용한 위험 평가 API를 사용할 때 필요합니다.
Refinitiv World Check One API를 통해 송수신인의 실명과 기타 개인 정보를 이용하여 위험 평가를 수행한 이력을 저장합니다.
테이블 생성
CREATE TABLE `refinitiv_wco_results` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`request_id` varchar(40) NOT NULL,
`verification_uuid` varchar(40) NOT NULL,
`counterparty_vasp_id` bigint(20) unsigned NOT NULL,
`direction` enum('OUTGOING', 'INCOMING') NOT NULL,
`case_system_id` varchar(128) NOT NULL,
`aggregated_result_summaries` varchar(4096) DEFAULT NULL,
`worker_id` varchar(128) DEFAULT NULL,
`status` enum('ERROR', 'REGISTERED', 'CHECKING', 'PROCESSED') NOT NULL,
`last_checked_at` datetime(3) DEFAULT NULL,
`created_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
`assessed_at` datetime(3) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_request_id` (`request_id`),
INDEX `idx_counterparty_vasp_id` (`counterparty_vasp_id`, `created_at`),
INDEX `idx_direction` (`direction`, `created_at`),
INDEX `idx_status_last_checked_at` (`status`, `last_checked_at`),
INDEX `idx_status_worker_id` (`status`, `worker_id`, `id`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Last updated