paritytech / paritytech/host-rust-core

Cross-product signing: a product can't createTransaction for another product's account of the same person

Open
#739 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Swift
Stars
10
Forks
3
Avg merge
1d 10h
Merged PRs (30d)
148

Description

What we observe

As product A, asking the host to build/sign a transaction whose signer is a different product B's account (same person) is refused: Domain/V1/PermissionDenied. Reading B's account cross-product is fine with consent; signing for it is not.

Where it bites

The individuality game's free "lite invite" sign-up is a bind (unsigned, proof-authorised) plus a sign-up (Game.sign_up_with_account_lite_invite, signed by the playing account). We were exploring whether the personhood app (peopl.<tld>) could run the "sign up for the game" button for the person's game account (dim2.<tld>). The bind works today (it is unsigned, so peopl can stamp it); the sign-up can't — it must be signed by the dim2 account, and peopl gets PermissionDenied.

Reproduce

Self-contained repro (product scripts over a headless truapi-host), with on-chain results and the full write-up:

https://github.com/paritytech/lite-invite-signup

scripts/2-peopl-signs-up-dim2.ts binds the dim2 account from peopl (lands on-chain ✅), then hits PermissionDenied at the sign-up.

The ask

A consented way for one product to build/sign an extrinsic (createTransaction) for another product's account of the same person. #730 (Closes #655) makes cross-product ring-VRF proof work via the context grant; this is the extrinsic-signing counterpart — a different operation (createTransaction for another product's account) with a different refusal (PermissionDenied, not the proof's NotAllowlisted). Whether context should extend to cover it, or it needs its own scope, is your call.

Not yet a hard requirement

We have not confirmed this is required. The game's sign-up also carries the player's product-scoped communication identifier, so the sign-up may naturally belong with the playing product — in which case the dim2 product does its own sign-up (unblocked by #730's proof grant) and this capability is never needed. Filing so the gap is on record. It would add new cross-product capabilities and complexity we would rather avoid unless a product genuinely needs one product to sign for another's account. Full reasoning in the repo above.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the linked lite-invite-signup reproduction, especially scripts/2-peopl-signs-up-dim2.ts, and compare the failed createTransaction/sign-up path with the working bind. Read #730 and its context grant discussion, then determine whether a consented signing scope is actually required; done means the capability need and its scope are explicitly decided.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
api, authorization
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.