Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ascribe/spool
Secure Public Online Ownership Ledger
https://github.com/ascribe/spool
Last synced: about 1 month ago
JSON representation
Secure Public Online Ownership Ledger
- Host: GitHub
- URL: https://github.com/ascribe/spool
- Owner: ascribe
- License: other
- Created: 2015-05-11T09:42:03.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2021-10-28T12:37:40.000Z (about 3 years ago)
- Last Synced: 2024-08-02T12:42:29.939Z (4 months ago)
- Homepage:
- Size: 248 KB
- Stars: 43
- Watchers: 12
- Forks: 6
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
- awesome-starred - ascribe/spool - Secure Public Online Ownership Ledger (others)
README
# 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 LedgerSPOOL 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 moreSPOOL + TOS = copyright on the blockchain.
Useful for digital art, photography, and other media.
## Visual Description
**[Here](http://trent.st/content/2015-04-05-copyright-on-the-blockchain--spool-protocol.pdf)** is a full slide-based description. It also shows this protocol's place in an overall software stack.
The key points are:
![alt tag](register-transfer.png)
## 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 (minimum ```10000 satoshi```)
- ```DUST```: minimum size of an output to be accepted by the network (currently ```600 satoshi```)
- ```FEDERATION```: A trusted wallet that acts as a federated agency, e.g. ```1AScRhqdXMrJyxNmjEapMZi1PLFsqmLquG```
- ```FUEL```: A wallet that is used to provide enough bitcoin for subsequent interations
- ```META```: Header for SPOOL protocol, e.g. ``` = 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=)```
- Bitcoin:
```
TX = [(FEDERATION : FEE+2*DUST]
->
[(hash : DUST),
(address : DUST),
(OP_RETURN=ASSOCIATE : 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+)*DUST]
->
[(hash : DUST),
(edition1_address : DUST),
...,
(editionN_address : DUST),
(OP_RETURN=REGISTER : 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=CONSIGNEDREGISTER : 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=)```
- Bitcoin:
```
TX = [(FEDERATION : FEE+2*DUST]
->
[(from_address : DUST),
(to_address : DUST),
(OP_RETURN=MIGRATE : 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=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=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=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=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=LOAN : 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](https://creativecommons.org/licenses/by-sa/3.0/).