목적
사용자가 한 번 미리 지갑에 자금을 충전하면, 이후 발생하는 트랜잭션마다 해당 지갑의 잔액에서 자동으로 수수료(예, 가스비)를 차감하는 시스템을 구축합니다.
이렇게 하면 매번 approve 과정을 거치지 않아도 되어 사용자 경험이 크게 개선됩니다.
커스터디얼 EOA 방식으로 게임 전용 지갑을 구현한다면, 서버 측에서 사용자 대신 개인 키를 관리하고 자동으로 트랜잭션 서명을 처리하는 구조가 됩니다. 구체적인 단계는 다음과 같습니다:
사용자 승인 요청:
사용자가 기존 본인 지갑(EOA)을 통해 게임 가입 요청 시, 게임에서 “게임 전용 지갑 생성”에 동의하는 메시지에 서명하도록 합니다.
서버로 서명 데이터 전송:
사용자가 서명한 데이터를 서버로 보내면, 서버는 이를 검증하여 사용자의 동의 여부를 확인합니다.
키 쌍 생성:
서버는 사용자를 위한 새로운 EOA(외부 소유 계정)를 생성합니다.
일반적으로 암호학적 라이브러리(예: web3.js, ethers.js, 또는 Python의 eth_account)를 사용해 무작위 개인 키와 이에 해당하는 공개 키(주소)를 생성합니다.
예시 (Node.js, ethers.js):
javascript
Copy
const { Wallet } = require("ethers");
const newWallet = Wallet.createRandom();
console.log("새로운 EOA 주소:", newWallet.address);
console.log("개인 키:", newWallet.privateKey);
만약 다수의 지갑을 효율적으로 관리하고자 한다면, HD Wallet 방식을 활용하여 하나의 마스터 시드에서 여러 키를 파생시키는 것도 고려할 수 있습니다.
보안 저장:
생성된 개인 키는 암호화하여 데이터베이스나 HSM(하드웨어 보안 모듈) 등 안전한 저장소에 보관합니다.
계정 매핑:
생성된 EOA 주소를 사용자의 게임 계정과 매핑하여, 나중에 해당 계좌에서 트랜잭션이 발생할 때 이를 참조할 수 있게 합니다.
충전 안내:
사용자에게 생성된 게임 전용 EOA 주소를 안내하고, 해당 주소로 ETH(또는 게임에 필요한 토큰)를 입금하도록 유도합니다.
입금 모니터링:
서버 또는 별도의 모니터링 서비스가 해당 주소에 자금이 입금되는지 실시간으로 체크합니다.