본문 바로가기

전체 글

(34)
[기능 구현] AsyncLocalStorage를 사용해서 Transaction 기능을 구현해보자 Transactional DecoratorDecoratordecorator는 함수를 반환하는 표현식으로 class, method, property에 @로 시작하는 decorator를 붙여서 코드를 수정하거나 추가해 주는 문법이다.이를 통해 횡단 관심사를 분리해서 관점 지향 프로그래밍을 할 수 있다. 트랜잭션 로직이 필요한 메서드에 아래와 같은 decorator를 만들어서 적용할 수 있다.descriptor.value는 원본 함수이고 트랜잭션 로직으로 감싸서 바꿔치기 한걸 볼 수 있다. export function Transactional() { return function ( target: any, propertyKey: string, descriptor: PropertyDescript..
[일관성 보장] Outbox Pattern을 적용해보자 Outbox Pattern1. Outbox Pattern을 사용한 이유?아래는 trustline을 생성하는 비즈니스 로직으로 데이터베이스와 블록체인의 상태를 한번에 변경하고 있다.@Transactional()async createTrustLine(currency: string, userId: number) { const savedWallet = await this.prismaService.tx.wallet.findUnique({ where: { userId }, select: { id: true, seed: true }, }); if (!savedWallet) { throw new NotFoundException('존재하지 않는 지갑입니다.'); } ..
[Ethereum] EIP-712에 대해 알아보자 EIP-712개념기존에는 왼쪽처럼 유저가 서명할 때 byte 문자열만 볼 수 있었다.오른쪽은 EIP-712 서명으로 구조화된 데이터를 통해 사용자가 무엇을 서명하는지 알아 볼 수 있다. EIP-712의 데이터는 domain 정보 영역와 서명 정보 영역 2가지로 나뉜다.domain 정보를 담는 구조체는 Eip721Domain으로 name, version, chainId, verifyingContract, salt와 같은 필드로 구성된다.해당 구조체는 hashStruct 함수를 통해 domainSeperator라는 해시값으로 사용된다.domainSeparator = hashStruct(eip712Domain) 서명 정보는 사용자가 구조체를 정의해서 사용할 수 있고마찬가지로 hashStruct 함수를 통해 해..