스마트 컨트랙트와 RFID로 공급망 계약 자동화 설계하기
스마트 컨트랙트, RFID, EPCIS, 오라클을 결합해 공급망 계약·정산·추적성을 자동화하는 하이브리드 아키텍처를 정리한다.
2026-08-14 · 최초 발행 2025-11-09
RFID 이벤트가 계약 실행으로 이어지는 구조
공급망에서 신뢰·가시성·자동화를 함께 확보하려면 RFID 이벤트를 단순 수집으로 끝내지 않고 계약 조건과 연결해야 한다. 스마트 컨트랙트는 구매주문 이행, SLA 위반 패널티, 자동 결제 에스크로 같은 규칙을 조건 충족 시 실행하는 온체인 코드다.
RFID 태그와 리더가 수집한 이벤트는 EPCIS의 What-When-Where-Why 구조로 정리할 수 있다. 이때 원천 데이터는 오프체인에 저장하고, 해시를 온체인에 고정하는 앵커링 방식이 적합하다. 오프체인 이벤트를 검증·서명한 뒤 체인으로 넘기는 오라클 미들웨어를 두고, L2 또는 퍼미션드 체인과 데이터 레이크를 병행하면 프라이버시와 확장성을 함께 다룰 수 있다.
데이터는 분리하고 증적은 연결한다
EPCIS 이벤트 원본은 데이터 레이크나 문서 DB에 보관한다. 체인에는 해시와 PO ID, 파티, 타임스탬프, 위치 코드 같은 최소 메타데이터만 남긴다. 이 구분은 GDPR과 영업기밀을 보호하면서도 확장성을 확보하기 위한 것이다. 데이터 삭제 요청에 대응할 수 있도록 키 삭제 전략도 함께 설계한다.
미들웨어는 입력을 정규화하고 서명을 검증한 뒤, idempotency key로 중복을 막고 비즈니스 규칙을 적용해 트랜잭션을 제출한다. 장애 구간에는 재시도 큐, 서킷 브레이커, 지연 알림이 필요하다. REST, MQTT, Kafka와 EPCIS 2.0 JSON을 표준 인터페이스로 제공할 수 있다.
계약 로직은 PO, ASN, GR(입고) 이벤트를 기준으로 조건부 결제, 지연 패널티, 자동 클레임 처리 규칙을 모듈화한다. 체인 위에서는 이를 상태 머신으로 모델링하고, 재진입 방지와 일괄 처리 가드를 적용한다.
파티 인증은 DID/VC 기반으로 구성하고 구매사, 공급사, 3PL, 검증기관의 권한을 분리한다. 마스터 데이터 변경, 이벤트 앵커링, 결제 승인을 역할 기반으로 나눠 최소권한 원칙을 적용해야 한다. 온체인 커밋과 오프체인 원본을 양방향으로 추적할 수 있으면 감사와 컴플라이언스 대응도 수월해진다. SLA 지표, 콜드체인 준수, 원산지 증빙 보고서 자동화에도 연결할 수 있다.
계약·정산·추적성에 적용하는 방식
조달과 정산에서는 PO 발행 뒤 RFID 입고 이벤트를 검증해 부분 또는 완납 정산과 동적 할인(Dynamic Discounting)을 처리할 수 있다. 콜드체인에서는 RFID와 온도·습도 센서 데이터가 임계를 초과할 때 자동 클레임, 벌점, 보증 연장 트리거를 실행한다.
배치나 시리얼 단위 EPCIS 이벤트를 앵커링하면 리콜 원인을 역추적하는 시간 TTR을 시간→분 단위로 줄일 수 있다. 무역금융에서는 선적 이벤트, BL 검증, 도착 확정을 에스크로 해제 조건으로 삼고, IoT 오라클 다중서명으로 사기 리스크를 완화한다. VMI에서는 진열 또는 창고 RFID 재고가 임계치 아래로 내려갈 때 자동 발주와 슬롯 예약을 연결할 수 있다.
이벤트 검증부터 체인 반영까지
입력은 RFID/EPCIS 이벤트이며, 스키마와 서명을 검증한 뒤 중복·순서를 보장하고 비즈니스 규칙을 거쳐 트랜잭션을 제출한다. 결과는 온체인 커밋 이벤트와 ERP/WMS 상태 반영으로 이어진다. 중복 이벤트는 폐기하고, 검증 실패에는 revert와 보상 트랜잭션, 재시도 큐를 적용한다. 에스크로 잔액 락, 상태 전이 원자성, 이벤트 일련번호 기반 멱등성도 함께 보장해야 한다.
체인 배포 방식이 바꾸는 운영 조건
| 옵션 | 성능(throughput) | 확장성 | 일관성/최종성 | 안정성/가용성 | 운영 편의 |
|---|---|---|---|---|---|
| 퍼블릭 L1 | 중간(10~20 tps), 가스비 변동 | 글로벌 확장, 공개 검증 | 강한 보안, 최종성 지연 | 매우 높음, 검증자 다수 | 관리 용이하나 비용 변동 큼 |
| 퍼미션드 체인 | 높음(>1,000 tps) | 컨소시엄 내부 확장 | 빠른 합의, 구성원 신뢰 전제 | 운영팀 의존, 거버넌스 중요 | 정책/보안 커스터마이즈 용이 |
| L2 롤업 | 높음(>1000 tps), 저가 | 수평 확장 가능 | 지연된 최종성(수분~) | L1 의존, 브릿지 리스크 | 개발 생태계 풍부, 도구 다양 |
규제와 프라이버시 요구가 강할수록 퍼미션드 체인 또는 롤업을 우선 검토한다. 공개 신뢰와 감사성을 중시한다면 퍼블릭 L1/L2 조합이 적합하다.
참조 아키텍처에 포함할 계층
데이터 계층은 EPCIS 2.0 리포지토리, 버전닝을 지원하는 오브젝트 스토리지, CDC 기반 데이터 레이크로 구성한다. 미들웨어에는 Kafka/MQTT 인게스트, JSON 스키마 검증(AJV), 시그니처 검증(JWS/ECDSA)을 둔다.
체인 계층은 L2 롤업 또는 퍼미션드 체인, 컨트랙트 레지스트리, 에스크로 토큰/Voucher로 구성할 수 있다. 보안 계층에는 DID/VC, HSM/Key Vault, 역할 기반 접근 제어, 비밀관리(Secrets Rotation)가 필요하다.
PO 이행과 에스크로 결제 코드
전제조건은 다음과 같다.
- Solidity ^0.8.20, OpenZeppelin 4.x, Hardhat 또는 Foundry
- 오라클: 서명 검증용 ECDSA, 관리자 멀티시그
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
contract PurchaseOrder is AccessControl, ReentrancyGuard {
bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE");
struct PO {
address buyer;
address supplier;
uint256 amount; // escrow amount (wei or token)
uint256 receivedQty;
uint256 orderedQty;
bool settled;
}
mapping(bytes32 => PO) public pos; // poId => PO
mapping(bytes32 => bool) public eventSeen; // idempotency key
event Anchored(bytes32 indexed poId, bytes32 epcisHash, uint256 qty, string loc);
event Settled(bytes32 indexed poId, uint256 paid);
constructor(address admin) {
_grantRole(DEFAULT_ADMIN_ROLE, admin);
}
function createPO(bytes32 poId, address supplier, uint256 orderedQty) external payable {
require(pos[poId].buyer == address(0), "PO exists");
pos[poId] = PO(msg.sender, supplier, msg.value, 0, orderedQty, false);
}
function anchorReceipt(
bytes32 poId,
bytes32 epcisHash,
uint256 qty,
string calldata location,
bytes32 eventId
) external onlyRole(ORACLE_ROLE) nonReentrant {
require(!eventSeen[eventId], "dup event");
eventSeen[eventId] = true;
PO storage p = pos[poId];
require(p.buyer != address(0), "invalid PO");
require(!p.settled, "settled");
p.receivedQty += qty;
emit Anchored(poId, epcisHash, qty, location);
if (p.receivedQty >= p.orderedQty) {
p.settled = true;
(bool ok, ) = p.supplier.call{value: p.amount}("");
require(ok, "pay failed");
emit Settled(poId, p.amount);
}
}
}
오라클과 미들웨어는 EPCIS 이벤트의 스키마와 서명을 확인하고, 중복 방지 키와 해시를 생성한 뒤 계약의 anchorReceipt를 호출한다.
// Env: Node 18+, ethers ^6, AJV for schema, secp256k1 signatures
import { Wallet, JsonRpcProvider, Interface } from "ethers";
import Ajv from "ajv";
const ajv = new Ajv();
export async function handleEpcisEvent(eventJson, contract, signer) {
// 1) 스키마 검증
if (!ajv.validate(epcisSchema, eventJson)) throw new Error("schema invalid");
// 2) 서명/무결성 검증 (예: reader/gateway JWS 확인)
if (!verifyJws(eventJson)) throw new Error("signature invalid");
// 3) Idempotency 키 생성
const eventId = keccak256(
JSON.stringify([
eventJson.eventID,
eventJson.readPoint,
eventJson.eventTime,
]),
);
// 4) 해시 계산 및 체인 제출
const epcisHash = keccak256(toCanonicalJson(eventJson));
const { poId, qty, location } = mapToPoReceipt(eventJson);
const tx = await contract
.connect(signer)
.anchorReceipt(poId, epcisHash, qty, location, eventId);
await tx.wait();
}
가스 비용 변동에 대비해 배치 전송과 이벤트 집계로 호출 수를 줄인다. eventId로 중복을 막고 실패 시 지수 백오프 재시도를 적용한다. 키는 HSM/Key Vault에서 관리하며 롤 기반 배포 파이프라인(CI/CD)에 포함한다.
프라이버시와 최종성 사이의 설계 선택
온체인에는 최소 메타데이터와 해시만 남기고 상세 데이터는 접근 제어된 오프체인 저장소에 둔다. 이는 영업기밀 보호와 외부 감사 사이의 균형을 위한 선택이다.
대량 이벤트는 롤업 또는 퍼미션드 체인에서 처리하고, 결제와 정산은 L1 앵커로 최종성을 확보할 수 있다. 이벤트 샘플링은 비용을 줄일 수 있지만 분쟁 리스크를 높이므로 중요 이정표 이벤트만 앵커링하는 방식이 권장된다.
컨트랙트에는 재진입 방지와 최소권한 접근 제어를 적용한다. 업그레이드가 필요하면 타임락·거버넌스 투표를 도입하고, 오라클 다중서명과 감사 로그를 의무화한다. 데이터 수명주기에서는 보존정책, 암호화 키 삭제 전략, 이벤트 버전 관리를 다룬다. 장애 시에는 서킷 브레이커, 데드레터 큐, 이벤트 소싱으로 재처리 가능성을 확보한다.
요구사항에서 운영까지 연결하기
요구사항과 거버넌스를 먼저 정한다. 파티, 데이터 범위(EPCIS 이벤트 종류), 규제·감사 요건을 정의하고 체인 선택(L2/퍼미션드)과 신원 체계(DID/VC)를 결정한다.
데이터와 오라클 설계에서는 EPCIS 스키마 매핑, 필수 필드, 멱등 키를 확정한다. 시그니처 체계(JWS/ECDSA), 키 수명주기, 로테이션 정책도 이 단계에서 수립한다.
스마트 컨트랙트는 PO 생성→입고→정산 상태 머신과 에스크로·패널티 로직을 중심으로 개발한다. 테스트넷 시뮬레이션, 퍼지 테스트, 가스 최적화를 거친다.
통합 단계에서는 ERP/WMS를 ESB 또는 웹훅으로 연결하고 데이터 레이크 CDC를 구성한다. 체인 이벤트와 TTF, 정산 리드타임 지표를 모니터링하며 알림과 대시보드를 운영한다.
자동 검증·정산으로 정산 리드타임은 3070% 단축될 수 있고, 변경불가 증적으로 분쟁·클레임 처리 시간은 4060% 감소할 수 있다. 리콜 트레이스 시간은 시간→분 단위로 90% 이상 단축되며, 멱등·스키마 검증을 통해 수동 처리 오류율은 80% 이상 감소한다. 가시성 향상은 안전재고 10~20% 절감으로도 이어질 수 있다.
표준화된 이벤트 모델은 시스템 간 상호운용성을 높이고, 다자 간 신뢰 기반 협업과 외부 감사 대응을 지원한다. 규제 준수와 보안 태세, 운영 투명성도 함께 강화할 수 있다.