Signature exchange and transport

An escrow releases only when both robots have signed. Each robot signs inside its own payment_node, so the two signatures have to meet somewhere. How they travel is a transport question, and robopay keeps it separate.

On a shared ROS network

If both robots are on the same ROS 2 network (same ROS_DOMAIN_ID, reachable over DDS), enable the built-in exchange:

ros2 run robopay_core payment_node --ros-args \
  -p backend:=self_custody -p chain:=base -p signature_exchange:=true

When a node signs with escrow/sign, it publishes an EscrowSignature message on /escrow/signatures. The other robot’s node picks it up, verifies it, and stores it. When both signatures for an escrow are present, the payer’s escrow action submits the release.

Signatures are safe to publish. They authorize only one specific release of one specific escrow, and the contract re-checks them.

Anywhere else

When robots are not on the same ROS network (different fleets, different sites, or one robot talking to a web service), move the signature any way you like: NFC, QR code, HTTP, a fleet dispatcher. Then hand it to the receiving node:

ros2 service call /escrow/submit_signature robopay_interfaces/srv/EscrowSubmitSignature \
  "{escrow_id: '0x...', signer_address: '0x...', signature: '0x...'}"

The node verifies the signature against the escrow before accepting it.

Discovery

How two robots first learn each other’s address is also yours to choose. An address is a public identifier, safe to print on a QR code or broadcast. robopay works from whatever address that step produces.