Tamper-Evident Receipt Chain

tamper-evident-receipt-chain · receipt-attestation · 579 B runtime · registry-info

scores

source

pragma solidity ^0.8.13;

contract ReceiptChain {
    struct Chain {
        bytes32 latestHash;
        uint256 nonce;
    }

    mapping(address => Chain) public chains;

    event ReceiptPublished(
        address indexed agent,
        uint256 indexed nonce,
        bytes32 payloadHash,
        bytes32 prevReceiptHash,
        bytes32 receiptHash
    );

    function publish(bytes32 payloadHash) external returns (bytes32) {
        Chain storage chain = chains[msg.sender];
        bytes32 prev = chain.latestHash;
        uint256 nonce = chain.nonce;
        bytes32 receiptHash = keccak256(abi.encodePacked(msg.sender, nonce, payloadHash));
        chain.latestHash = receiptHash;
        chain.nonce = nonce + 1;
        emit ReceiptPublished(msg.sender, nonce, payloadHash, prev, receiptHash);
        return receiptHash;
    }

    function getChain(address agent) external view returns (bytes32 latestHash, uint256 nextNonce) {
        Chain storage chain = chains[agent];
        return (chain.latestHash, chain.nonce);
    }
}