Author's Manifesto

To whom it may concern,

Markets are objects of censorship and always have been. There is a presumed
division, that renders commerce distinct from the notion of free speech. But I
will allege that the act of commerce is, itself, indistinct from speech. Where
or how one spends their value is a decision as personal and poignant as any
words ever spoken or letters ever written.

As a unfortunate consequence of freedom, bad actors will engage in repugnant
trade that impinges upon the rights and freedoms of others. It is the job of
humanity to cooperate and see to it that trade, such as this, becomes
unprofitable. Whether it is accomplished through technological achievement or
through the adjustment of social mores, or perhaps a simple appeal to the
underlying natural law, it is not the job of bad acting third parties to force
into hiding commerce that must be dealt with by means of an adjustment to the
global, social conscience.

Cooperation, in the manner I was just speaking about, has never been plausible
until the invention of The Blockchain. I will not foist upon Satoshi's humble
creation such impracticable possibilities as the achievement of world peace.
But in approaching Drop Zone, I am attempting to do nothing more than what is
possible and possibly more efficient than what exists. I wish for Drop Zone
to be nothing more than an appendage to The Blockchain. As such, it is every
bit as much Bitcoin as Bitcoin itself. Just as a fungible Bitcoin enables the
exchange of spaceless value with near impunity, Drop Zone removes the ability
of unwelcome parties from glancing over the shoulders of those in the act of an
exchange, whatever it entails. This technology disrupts the ability of buyers
to gain insight into the identities or movements of suppliers making supply
chains far less vulnerable to disruption. It is this innovation that separates
this project from all other decentralized market solutions.

Whereas Bitcoin forces us to consider the nature of money and value, Drop Zone
will do the same for commerce. At its root, Bitcoin is a message passing
system. Those messages that are passed, unlike any electronic message that's
come before it, articulate value. Commerce is, and has always been, similarly
inclined toward message passing. Whether in-person, over email, or through
large, online shopping carts, fundamentally, commerce is composed of messages
that are in service of the transaction wherein a final message of value is sent
to a recipient in exchange for a negotiated good or service. As such, Drop
Zone is a secure message passing protocol inasmuch as it is a platform for
commerce. And while the problem is far beyond the scope or capabilities of
the protocol in its most fundamental form, the observant might even see the
tenuous skeleton of a full-fledged reputation system. Such a project is, in
itself, as important and difficult as any facing this decentralized ecosystem.

I hope that Drop Zone lets us all dream of a day when no man will any longer be
made to suffer indignity for simply engaging in unpopular or stigmatized
commerce. May all commerce be created equal.

Important Whitepaper Errata

The white paper expressed 8 digits of precision for the listing radius. This implementation instead uses 6 digits. If additional precision is later deemed necessary, a field can be added to the listing to accomodate enhanced precision

The white paper expressed pkeys (addresses) as being encoded ints. These are instead encoded as variable length strings.

The white paper expressed transaction ids as being encoded ints. These are instead encoded as variable length strings.

Getting Started in your Web Browser

Download our packaged dropzone-lib.min.js and include it in your html via a script tag:

<scriptsrc="dropzone-lib.min.js"></script>

Getting Started in node

Before you begin you'll need to have Node.js v0.12 installed. There are several
options for installation. One method is to use
nvm to easily switch between different
versions, or download directly from Node.js.

npm install -g dropzone-lib

Using dropzone-lib

The library syntax is still being finalized, but almost all dropzone functions
are currently supported in this library.

Define a Connection/Driver

Unless you plan to feed raw binary data into objects yourself (more on this later)
you're going to want to start by connecting dropzone to a blockchain.

Blockchain connection objects should be created at the inception of your program.
Currently (and let's be real here - all that matters), Bitcoin connections are
the only supported blockchain connections.

An SPV driver is still being developed, but for the time being, support exists
for the following block explorers, which are queried via http: BlockchainDotInfo,
BlockrIo, Insight, Toshi, and SoChain. Only Insight, Toshi, and SoChain support
all functions via cors requests.

Toshi is the reccommended driver for read queries at this time
due to its speed.

BlockrIo is the reccommended driver for write/save operations at this time.
Toshi seems to have problems with relaying to the mempool quickly.

Testnet Connections are created with the isMutable parameter set to true:

var dropzone =require('dropzone-lib');
// If you're not save()'ing transactions, toshi is actually a better driver// SoChain was used here to demonstrate that multiple explorers are supported:var SoChain =dropzone.drivers.SoChain;
connTestnet =newSoChain({isMutable:true});

Load a listing from a transaction id

This example loads the Miracle Max bible listing from the blockchain. Note that
"Listings" contain the up-to-date state of an Item, and will reflect the attributes
present in the original listing, plus all modifications to that listing thereafter.

Load a Seller profile from an address

This example loads the Miracle Max seller profile from the blockchain. Note that
"SellerProfile" contains the up-to-date state of an seller, and will reflect the
attributes present in the original seller declaration, plus all modifications
to that declaration thereafter.

Load an invoice from a transaction id

This example loads an invoice message directly. "Messages" do not track state
outside the current transaction, and can be located in dropzone.messages.
These messages are loosely based on an ORM pattern's 'model'.

Messaging over Testnet

In Drop Zone, negotiations between sellers and buyers is performed over the
bitcoin testnet. Why testnet?

Well, it's cheap.

And, there's no need to preserve the contents of communications for very long.
(In fact the mempool is often enough)

testnet offers a pretty excellent queueing system, that doesn't require running
a server, and that persists even when your client isn't running.

It's really easy to work with if you're already using this library anyways.

It should be trivial for mobile bitcoin wallets to support in the future.

Initiate a message (Generally By a buyer):

For a buyer who wishes to communicate with a seller, they must first send a
key-negotiation/initialization request:

// This code is running from the buyer's web browser:var sellerTestnetAddr ='mi37WkBomHJpUghCn7Vgh3ah33h6L9Nkqw';
// Save this for as long as you need to converse!// (And kindly throw it away when you're done conversing.)// NOTE: The conversation key has nothing to do with the bitcoin key.var buyerConversationPrivkey =crypto.randomBytes(128);
var buyerToSeller =newSession(connTestnet, 'buyer-testnet-private-key-wif',
buyerConversationPrivkey, {receiverAddr: sellerTestnetAddr});
// This authenticate() message sends a transaction to the seller that allows// the buyer to compute the shared symmKey through DH:buyerToSeller.authenticate(function (err, chatInit) {
if (err) throw err;
console.log("Buyer initiated a connection via transaction: "+chatInit.txid);
})

Authenticating a message initiation request:

The seller can list sessions (authenticated or otherwise) using the Seller.all
method. In this example, we'll assume the initiation request was the first
session in this list, and authenticate it.