{"id":13556694,"url":"https://github.com/ascribe/spool","last_synced_at":"2026-01-17T10:33:28.799Z","repository":{"id":31847811,"uuid":"35415028","full_name":"ascribe/spool","owner":"ascribe","description":"Secure Public Online Ownership Ledger","archived":false,"fork":false,"pushed_at":"2021-10-28T12:37:40.000Z","size":254,"stargazers_count":43,"open_issues_count":2,"forks_count":6,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-12-19T23:54:08.975Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ascribe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-05-11T09:42:03.000Z","updated_at":"2023-03-09T10:31:29.000Z","dependencies_parsed_at":"2022-08-29T13:10:10.872Z","dependency_job_id":null,"html_url":"https://github.com/ascribe/spool","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ascribe%2Fspool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ascribe%2Fspool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ascribe%2Fspool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ascribe%2Fspool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ascribe","download_url":"https://codeload.github.com/ascribe/spool/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246984577,"owners_count":20864471,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T12:03:58.608Z","updated_at":"2026-01-17T10:33:28.787Z","avatar_url":"https://github.com/ascribe.png","language":null,"funding_links":[],"categories":["Others","others"],"sub_categories":[],"readme":"# SPOOL\n\n\u003cpre\u003e\n  Title: SPOOL Protocol (SPOOL/1.0)\n  Author: Dimitri de Jonghe (dimi@ascribe.io) and Trent McConaghy (trent@ascribe.io)\n  First public release: 2015-03-14\n  Current public release: 2015-05-06\n\u003c/pre\u003e\n\n## Introduction\nSPOOL is:\n* a protocol for documenting transactions relating to ownership of digital property, i.e. copyright rights\n* an overlay of the bitcoin blockchain\n* SPOOL = Secure Public Online Ownership Ledger\n\nSPOOL is not:\n* 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).\n\nSPOOL transactions include\n* Register ownership. Supports \u003e1 unique editions, e.g. edition 1/10, 2/10, …, 10/10.\n* Transfer ownership\n* Consign, for someone else to sell on your behalf\n* And more\n\nSPOOL + TOS = copyright on the blockchain.\n\nUseful for digital art, photography, and other media.\n\n## Visual Description\n\n**[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.\n\nThe key points are:\n\n![alt tag](register-transfer.png)\n\n## Protocol Description\nSummary: Via OP_RETURN we attach verbs to the blockchain tx, such as Register, Consign, Transfer, Loan, ....\n\nDeclarations\n- ```FEE```: mining fee based on transaction size (minimum ```10000 satoshi```)\n- ```DUST```: minimum size of an output to be accepted by the network (currently ```600 satoshi```)\n- ```FEDERATION```: A trusted wallet that acts as a federated agency, e.g. ```1AScRhqdXMrJyxNmjEapMZi1PLFsqmLquG```\n- ```FUEL```: A wallet that is used to provide enough bitcoin for subsequent interations\n- ```META```: Header for SPOOL protocol, e.g. ```\u003cprotocol\u003e\u003cversion\u003e = ASCRIBESP00L01```\n\n## Federated SPOOL actions\nA 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.\n\n### Associate ###\nGeneral association action (e.g. \"change password\") to attach content to a wallet\n- Mapping: ```1-to-1```\n- PySPOOL: ```pyspool.Association(FEDERATION, address, hash, reason=\u003cstring\u003e)```\n- Bitcoin:\n```\nTX = [(FEDERATION : FEE+2*DUST] \n     -\u003e \n     [(hash : DUST), \n      (address : DUST), \n      (OP_RETURN=\u003cMETA\u003eASSOCIATE\u003creason\u003e : 0), \n      (FEE)]\n\u003e balance of hash = DUST\n\u003e balance of address = DUST\n```\n\n### Register Editions ###\nAssociate N editions of the same content to a wallet with N addresses\n- Mapping: ```1-to-many ```\n- PySPOOL: ```pyspool.Registration(FEDERATION, editions=[edition1_address, ..., editionN_address], hash)```\n- Bitcoin:\n```\nTX = [(FEDERATION : FEE+(1+\u003cnum_editions\u003e)*DUST] \n     -\u003e \n     [(hash : DUST), \n      (edition1_address : DUST), \n      ..., \n      (editionN_address : DUST), \n      (OP_RETURN=\u003cMETA\u003eREGISTER\u003cnum_editions\u003e : 0), \n      (FEE)]\n\u003e num_editions = len(editions)\n\u003e balance of piece_hash = DUST\n\u003e balance of editionX_address = DUST\n```\n\n### Consigned Registration ###\nRegister a single edition as a consignee. This allows marketplaces to register content on behalf of their users. \n- Mapping: ```1-to-1 ```\n- PySPOOL: ```pyspool.ConsignedRegistration(FEDERATION, MARKET_content_address, hash)```\n- Bitcoin:\n```\nTX = [(FEDERATION : FEE+2*DUST] \n     -\u003e \n     [(hash : DUST), \n      (MARKET_content_address : DUST), \n      (OP_RETURN=\u003cMETA\u003eCONSIGNEDREGISTER\u003cmarketplaceID\u003e\u003cmarketuserID\u003e : 0), \n      (FEE)]\n\u003e balance of piece_hash = DUST\n\u003e balance of MARKET_content_address = DUST\n```\n\n### Migrate Content ###\nAssociate two wallets, where the address does not represent hashed content. Useful for password reset and other user/content updates.\n- Mapping: ```1-to-1 ```\n- PySPOOL: ```pyspool.Migration(FEDERATION, from_address, to_address, reason=\u003cstring\u003e)```\n- Bitcoin:\n```\nTX = [(FEDERATION : FEE+2*DUST] \n     -\u003e \n     [(from_address : DUST), \n      (to_address : DUST), \n      (OP_RETURN=\u003cMETA\u003eMIGRATE\u003creason\u003e : 0), \n      (FEE)]\n\u003e balance of from_address = DUST + previous_balance\n\u003e balance of to_address = DUST\n```\n\n### Fuel wallet ###\nFuel a wallet with enough bitcoin to \n- Mapping: ```1-to-1 ```\n- PySPOOL: ```pyspool.Fuel(FUEL, address)```\n- Bitcoin:\n```\nTX = [(FUEL : 2*FEE] \n     -\u003e \n     [(address : FEE), \n      (OP_RETURN=\u003cMETA\u003eFUEL : 0), \n      (FEE)]\n\u003e balance of address = FEE + previous_balance\n```\n\n## User-to-user interactions\nAn interaction transfers rights, ownership or smart contracts between users.\n\n### Transfer ownership ###\nTransfer the ownership of registered content\n- Mapping: ```1-to-1 ```\n- SPOOL: ```pyspool.Transfer(from_address, to_address)```\n- Dependencies: ```Fuel, Register, optional: Migrate, Consign```\n- Bitcoin:\n```\nTX = [(from_address : DUST+FEE)] \n     -\u003e \n     [(to_address : DUST), \n      (OP_RETURN=\u003cMETA\u003eTRANSFER : 0), \n      (FEE)]\n\u003e balance of from_address = 0\n\u003e balance of to_address = DUST\n```\n\n### Consign ###\nAssign the rights to transfer content to another user\n- Mapping: ```1-to-1 ```\n- SPOOL: ```pyspool.Consign(from_address, to_address)```\n- Dependencies: ```Fuel, Register, optional: Migrate, Transfer```\n- Bitcoin:\n```\nTX = [(from_address : DUST+FEE)] \n     -\u003e \n     [(to_address : DUST), \n      (OP_RETURN=\u003cMETA\u003eCONSIGN : 0), \n      (FEE)]\n\u003e balance of from_address = 0\n\u003e balance of to_address = DUST\n```\n\n### Unconsign ###\nReturn the rights to transfer the content back to the owner\n- Mapping: ```1-to-1 ```\n- SPOOL: ```pyspool.Unconsign(from_address, to_address)```\n- Dependencies: ```Fuel, Consign, optional: Migrate```\n- Bitcoin:\n```\nTX = [(from_address : DUST+FEE)] \n     -\u003e \n     [(to_address : DUST), \n      (OP_RETURN=\u003cMETA\u003eUNCONSIGN : 0), \n      (FEE)]\n\u003e balance of from_address = 0\n\u003e balance of to_address = DUST\n```\n\n### Loan ###\nAssign the right to display or use the content for a period of time\n- Mapping: ```1-to-1 ```\n- SPOOL: ```pyspool.Loan(from_address, to_address, start_date, end_date)```\n- Dependencies: ```Fuel, Register, optional: Migrate```\n- Bitcoin:\n```\nTX = [(from_address : DUST+FEE)] \n     -\u003e \n     [(to_address : DUST), \n      (OP_RETURN=\u003cMETA\u003eLOAN\u003cstart_date\u003e\u003cend_date\u003e : 0), \n      (FEE)]\n\u003e balance of from_address = 0\n\u003e balance of to_address = DUST\n```\n\n### Share, unshare ###\nDon't put on blockchain.\n\n## Background\nSPOOL was developed by ascribe GmbH as part of the overall ascribe technology stack. http://www.ascribe.io\n\n## Copyright\n\nSPOOL is © 2015 ascribe GmbH.\n\nSPOOL is available for use under the [Creative Commons CC-BY-SA 3.0 license](https://creativecommons.org/licenses/by-sa/3.0/). \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fascribe%2Fspool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fascribe%2Fspool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fascribe%2Fspool/lists"}