spool
spool copied to clipboard
Secure Public Online Ownership Ledger
SPOOL
Title: SPOOL Protocol (SPOOL/1.0) Author: Dimitri de Jonghe ([email protected]) and Trent McConaghy ([email protected]) First public release: 2015-03-14 Current public release: 2015-05-06
Introduction
SPOOL is:
- a protocol for documenting transactions relating to ownership of digital property, i.e. copyright rights
- an overlay of the bitcoin blockchain
- SPOOL = Secure Public Online Ownership Ledger
SPOOL is not:
- The law. SPOOL must be used with a contract concerning transfer of copyright rights that participants have agreed to. E.g. the ascribe Terms of Service (TOS).
SPOOL transactions include
- Register ownership. Supports >1 unique editions, e.g. edition 1/10, 2/10, …, 10/10.
- Transfer ownership
- Consign, for someone else to sell on your behalf
- And more
SPOOL + TOS = copyright on the blockchain.
Useful for digital art, photography, and other media.
Visual Description
Here is a full slide-based description. It also shows this protocol's place in an overall software stack.
The key points are:

Protocol Description
Summary: Via OP_RETURN we attach verbs to the blockchain tx, such as Register, Consign, Transfer, Loan, ....
Declarations
FEE: mining fee based on transaction size (minimum10000 satoshi)DUST: minimum size of an output to be accepted by the network (currently600 satoshi)FEDERATION: A trusted wallet that acts as a federated agency, e.g.1AScRhqdXMrJyxNmjEapMZi1PLFsqmLquGFUEL: A wallet that is used to provide enough bitcoin for subsequent interationsMETA: Header for SPOOL protocol, e.g.<protocol><version> = ASCRIBESP00L01
Federated SPOOL actions
A federated action (e.g. "register") associates a user with digital content. Hereto, a trusted federation wallet sends a transaction to both an address owned by the user and an address that represents a base58 hash of the digital content. Note that the wallet with the digital content address is not required to be owned by the user.
Associate
General association action (e.g. "change password") to attach content to a wallet
- Mapping:
1-to-1 - PySPOOL:
pyspool.Association(FEDERATION, address, hash, reason=<string>) - Bitcoin:
TX = [(FEDERATION : FEE+2*DUST]
->
[(hash : DUST),
(address : DUST),
(OP_RETURN=<META>ASSOCIATE<reason> : 0),
(FEE)]
> balance of hash = DUST
> balance of address = DUST
Register Editions
Associate N editions of the same content to a wallet with N addresses
- Mapping:
1-to-many - PySPOOL:
pyspool.Registration(FEDERATION, editions=[edition1_address, ..., editionN_address], hash) - Bitcoin:
TX = [(FEDERATION : FEE+(1+<num_editions>)*DUST]
->
[(hash : DUST),
(edition1_address : DUST),
...,
(editionN_address : DUST),
(OP_RETURN=<META>REGISTER<num_editions> : 0),
(FEE)]
> num_editions = len(editions)
> balance of piece_hash = DUST
> balance of editionX_address = DUST
Consigned Registration
Register a single edition as a consignee. This allows marketplaces to register content on behalf of their users.
- Mapping:
1-to-1 - PySPOOL:
pyspool.ConsignedRegistration(FEDERATION, MARKET_content_address, hash) - Bitcoin:
TX = [(FEDERATION : FEE+2*DUST]
->
[(hash : DUST),
(MARKET_content_address : DUST),
(OP_RETURN=<META>CONSIGNEDREGISTER<marketplaceID><marketuserID> : 0),
(FEE)]
> balance of piece_hash = DUST
> balance of MARKET_content_address = DUST
Migrate Content
Associate two wallets, where the address does not represent hashed content. Useful for password reset and other user/content updates.
- Mapping:
1-to-1 - PySPOOL:
pyspool.Migration(FEDERATION, from_address, to_address, reason=<string>) - Bitcoin:
TX = [(FEDERATION : FEE+2*DUST]
->
[(from_address : DUST),
(to_address : DUST),
(OP_RETURN=<META>MIGRATE<reason> : 0),
(FEE)]
> balance of from_address = DUST + previous_balance
> balance of to_address = DUST
Fuel wallet
Fuel a wallet with enough bitcoin to
- Mapping:
1-to-1 - PySPOOL:
pyspool.Fuel(FUEL, address) - Bitcoin:
TX = [(FUEL : 2*FEE]
->
[(address : FEE),
(OP_RETURN=<META>FUEL : 0),
(FEE)]
> balance of address = FEE + previous_balance
User-to-user interactions
An interaction transfers rights, ownership or smart contracts between users.
Transfer ownership
Transfer the ownership of registered content
- Mapping:
1-to-1 - SPOOL:
pyspool.Transfer(from_address, to_address) - Dependencies:
Fuel, Register, optional: Migrate, Consign - Bitcoin:
TX = [(from_address : DUST+FEE)]
->
[(to_address : DUST),
(OP_RETURN=<META>TRANSFER : 0),
(FEE)]
> balance of from_address = 0
> balance of to_address = DUST
Consign
Assign the rights to transfer content to another user
- Mapping:
1-to-1 - SPOOL:
pyspool.Consign(from_address, to_address) - Dependencies:
Fuel, Register, optional: Migrate, Transfer - Bitcoin:
TX = [(from_address : DUST+FEE)]
->
[(to_address : DUST),
(OP_RETURN=<META>CONSIGN : 0),
(FEE)]
> balance of from_address = 0
> balance of to_address = DUST
Unconsign
Return the rights to transfer the content back to the owner
- Mapping:
1-to-1 - SPOOL:
pyspool.Unconsign(from_address, to_address) - Dependencies:
Fuel, Consign, optional: Migrate - Bitcoin:
TX = [(from_address : DUST+FEE)]
->
[(to_address : DUST),
(OP_RETURN=<META>UNCONSIGN : 0),
(FEE)]
> balance of from_address = 0
> balance of to_address = DUST
Loan
Assign the right to display or use the content for a period of time
- Mapping:
1-to-1 - SPOOL:
pyspool.Loan(from_address, to_address, start_date, end_date) - Dependencies:
Fuel, Register, optional: Migrate - Bitcoin:
TX = [(from_address : DUST+FEE)]
->
[(to_address : DUST),
(OP_RETURN=<META>LOAN<start_date><end_date> : 0),
(FEE)]
> balance of from_address = 0
> balance of to_address = DUST
Share, unshare
Don't put on blockchain.
Background
SPOOL was developed by ascribe GmbH as part of the overall ascribe technology stack. http://www.ascribe.io
Copyright
SPOOL is © 2015 ascribe GmbH.
SPOOL is available for use under the Creative Commons CC-BY-SA 3.0 license.