Prefix: 1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5
Authors: Satchmo, Attila Aros
Thanks to Unwriter for his input and support.
The design goals:
- A simple OP_RETURN protocol for associating data in a single transaction by defining key, value pairs.
- A flexible protocol suitable for many applications
- Compatible with faucets, and other situations where the input address does not represent the author's public identity
- Provide data mapping without enforcing a content or identity scheme (allow other protocols to provide this).
<OP_RETURN | <input>>
MAP
<SET | DELETE>
<key>
<value>
- map a comment to a url
- map an action to a txhash (like, repost, or flag a comment)
- map a photo to a geolocation
- map a 'type' to some data (this is a 'post' or a 'reply')
- map ______ to a _______
MAP is designed to be chained together with other OP_RETURN micro-protocols. The input stream flows from the left and can be piped like unix commands. We chain content from B protocol, and map it to some global identifier (txhash, url etc), and finally sign that using the Author Identity protocol:
B | MAP | AUTHOR_IDENTITY
- Read more about B protocol
- Read more about protocol pipeline
- Read more about Author Identity Protocol
In this example we will use SET
to comment on a URL with an identity (not using the sender address as the identity's public key). Here is a simple piped OP_RETURN sequence for mapping B data to a global ID, url
= https://map.sv
.
OP_RETURN B | MAP SET 'url' 'https://map.sv' | AUTHOR_IDENTITY_PROTOCOL
A more detailed view of the same transaction. Each line here is a new pushdata:
OP_RETURN
19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut (B)
"## Hello small world"
text/markdown
utf8
|
1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5 (MAP)
'SET'
'url'
'https://map.sv'
|
15PciHG22SNLQJXMoSUaWVi7WSqc7hCfva (AUTHOR_IDENTITY)
'BITCOIN_ECDSA'
<pubkey>
<signature>
Constructing a BitQuery for MAP data for a given url still assumes a 'fixed protocol' for now, but soon we will release some tools for searching 'relative to protocol'. There are some projects in the works to make querying / working with this protocol much nicer in the future.
A response from BITDB for a comment on a URL would look something like this:
{
"c": [{
"i": 0,
"b0": { "op": 106 },
"s1": "19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut",
"s2": "## Hello small world",
"s3": "text/markdown",
"s4": "utf8",
"s5": "|",
"s6": "1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5",
"s7": "SET",
"s8": "url",
"s9": "https://twitter.com/",
"s10": "|",
"s11": "15PciHG22SNLQJXMoSUaWVi7WSqc7hCfva",
"s12": "ecdsa",
"s13": "1HQ8momxTp9MYkzDLy9bFMUQgnba189qZE",
"s14": "<signature>"
}],
"u": []
}
Keys and values can be repeated to set multiple attributes at once:
MAP
SET
<key>
<val>
<key>
<val>
more detailed example:
1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5 (MAP)
SET
'app'
'my cool app'
'profile.link'
'https://mywebsite.com'
'profile.name'
'username123'
To delete one of the keys->value mappings from the example above.
1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5 (MAP)
'DELETE'
'profile.name'
Since the keyspace is shared, you can either prefix your keys with a unique identifier, or operate in the global space, sharing that dataset and inheriting the emergent schema. Sharing the global namespace can be useful when it is intended to be shared among many apps.
Potential Namespaces for Global Identifiers
url
tx
ethtx
btctx
topic
upc
infohash
ifps
isbn
md5
Some global identifiers have more than one value...
Coordinates
coordinates.lat =
coordinates.lng =
coordinates.alt =
Phone
phone.country_code = 1
phone.url = 9549549544
Profile
profile.pubkey = "1HQ..."
profile.name = "Satchmo"
profile.text = "Hello small world!"
profile.image = "b://98bcef1cc43ae..."
profile.banner = "https://www..."
If the above example is namespace as a noun, in this example we show a namespace can be used as a verb too. Actions usually don't need input data. Instead you act upon something that already exists. These begin new op_return chains instead of taking input from a previous protocol. This is useful if all you need is a single key to begin the chain, such as 'like'.
Please note: These are not intended to limit your imagination with how to organize the keys your app uses, but to give some basic examples of how you could do it. There are many viable methods for each of these cases:
Like something by txid:
Memo
0x6d04 txhash(32)
MAP
MAP SET 'like' 'true' tx <txhash>
Set your profile
Memo (multiple txs)
1. Set name
0x6d01 <name>(217)
2. Set profile text
0x6d05 <message>(217)
3. Set profile picture
0x6d0a <url>(217)
MAP
MAP SET 'profile.name' 'Satchmo' 'profile.text' 'Some cool text' 'profile.picture' 'b://986...'
Follow / Unfollow users
Memo
Follow user 0x6d06 address(35)
Unfollow user 0x6d07 address(35)
MAP
MAP SET 'follow.user' <address>
MAP SET 'unfollow.user' <address>
Follow / unfollow topic
Memo
Topic follow 0x6d0d <topic_name>(variable)
Topic unfollow 0x6d0e <topic_name>(variable)
MAP
MAP SET 'follow.topic' <topic_name>
MAP SET 'unfollow.topic' <topic_name>
Post
Memo
0x6d02 <message>(217)
MAP
B <message> <content-type> <encoding> | MAP SET 'type' 'post'
Reply to Tx
Memo
0x6d03 <txhash>(32) message(184)
MAP
B <message> <content-type> <encoding> | MAP SET 'type' 'reply' 'tx' <txhash> | AUTHOR_IDENTITY
Repost
Memo
0x6d0b <txhash> <message>
MAP
B <message> <content-type> <encoding> | MAP SET 'type' 'repost' 'tx' <txhash>
Topic Post
Memo
0x6d0c topic_name(variable) message(214 - topic length)
MAP
B <message> <content-type> <encoding> | MAP SET 'type' 'post' 'topic' <topic_name>
Comment on a URL without identity
B <message> <content-type> <encoding> | MAP SET 'type' 'comment' 'url' https://google.com
Comment with an identity
B <message> <content-type> <encoding> | MAP SET 'type' 'comment' 'url' https://google.com | AUTHOR_IDENTITY
Attach a picture to a geolocation
B <image> <content-type> <encoding> | MAP SET 'coordinates.lat' <latitude> 'coordinates.lng' <latitude> 'coordinates.alt' <altitude>
Comment on a phone number
B <message> <content-type> <encoding> | MAP SET 'phone.country_code' <country_code> 'phone.number' <phone_number>
Comment on a UPC code
B <message> <content-type> <encoding> | MAP SET 'type' 'comment' 'upc' <upc_code>