본문으로 건너뛰기
버전: 3.5.0

스마트 컨트랙트에서 영수증 생성

기능

영수증(Receipt)은 특정 작업의 발생을 증명하거나 알리기 위해 사용됩니다. 대표적인 예는 A에서 B로의 송금에 메모를 함께 기록하는 것입니다.

스마트 컨트랙트는 블록체인 인프라가 제공하는 시스템 함수 blockchain.receipt를 호출하여 영수증을 생성할 수 있습니다. 영수증은 트랜잭션과 연결된 블록 데이터에 저장되며, 당연히 네트워크의 모든 노드에 의해 검증됩니다. 주의: 영수증은 컨트랙트 내부에서 조회할 수 없습니다. 블록 데이터를 파싱하거나 rpc 인터페이스를 통해 트랜잭션 해시로 조회해야만 얻을 수 있습니다.

영수증은 컨트랙트 스토리지에 비해 훨씬 저렴합니다. gas만 소모하며, gas와 ram을 모두 소모하는 컨트랙트 스토리지와는 다릅니다.

영수증 생성

스마트 컨트랙트는 시스템 함수 blockchain.receipt를 호출하여 영수증을 생성합니다. 다음 예제에서 이 컨트랙트의 receiptf 함수가 호출되면 세 개의 영수증이 생성됩니다.

class Contract {
init() {
}

receiptf() {
blockchain.receipt(JSON.stringify(["from", "to", "100.01"]));
blockchain.receipt('{"name": "Cindy", "amount": 1000}');
blockchain.receipt("transfer accepted");
}
}

module.exports = Contract;

blockchain.receipt는 영수증의 내용에 해당하는 문자열 인자를 받고, 반환값은 없습니다. 실행에 실패하면 런타임 오류가 발생하지만, 정상적인 상황에서는 일어나지 않습니다. 이후 파싱이 편리하도록 내용은 JSON 형식의 문자열로 작성할 것을 강력히 권장합니다.

생성된 영수증에는 어떤 메서드가 영수증을 발생시켰는지를 나타내는 컨트랙트 이름과 액션 이름이 함께 포함됩니다. 위에서 생성된 세 개의 영수증은 다음과 같이 보입니다.

# 첫 번째
{"funcName":"ContractFhx828oUPYHRtkp9ABaBFHwm6S94eeeai1TD3FkTgLMz/receiptf", "content":"[\"from\",\"to\",\"100.01\"]"}
# 두 번째
{"funcName":"ContractFhx828oUPYHRtkp9ABaBFHwm6S94eeeai1TD3FkTgLMz/receiptf", "content":"{\"name\": \"Cindy\", \"amount\": 1000}"}
# 세 번째
{"funcName":"ContractFhx828oUPYHRtkp9ABaBFHwm6S94eeeai1TD3FkTgLMz/receiptf", "content":"transfer accepted"}

ContractFhx828oUPYHRtkp9ABaBFHwm6S94eeeai1TD3FkTgLM는 해당 컨트랙트의 ID입니다.

영수증 조회

트랜잭션 해시로 영수증 조회

특정 트랜잭션에서 생성된 영수증은 rpc 인터페이스를 통해 트랜잭션 해시로 조회할 수 있습니다.

/getTxReceiptByHash 를 참고하세요.

블록 데이터로 영수증 조회

완전한 블록 데이터는 모든 트랜잭션과 대응하는 영수증을 포함합니다. 블록 데이터를 내려받아 파싱하면 해당 블록에서 발생한 모든 영수증을 얻을 수 있습니다.

/getBlockByHash/getBlockByNumber 를 참고하시고, 요청 파라미터의 completetrue로 설정하세요.