only multisig changes

This commit is contained in:
diminator 2016-03-03 12:35:15 +01:00
parent dca74116ab
commit f42f79e3f1
9 changed files with 6 additions and 207 deletions

View File

@ -1,38 +1,14 @@
# BigchainDB - Integration Examples # BigchainDB
A scalable blockchain database. [The whitepaper](https://www.bigchaindb.com/whitepaper/) explains what that means. A scalable blockchain database. [The whitepaper](https://www.bigchaindb.com/whitepaper/) explains what that means.
[![Join the chat at https://gitter.im/bigchaindb/bigchaindb](https://badges.gitter.im/bigchaindb/bigchaindb.svg)](https://gitter.im/bigchaindb/bigchaindb?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Join the chat at https://gitter.im/bigchaindb/bigchaindb](https://badges.gitter.im/bigchaindb/bigchaindb.svg)](https://gitter.im/bigchaindb/bigchaindb?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Travis branch](https://img.shields.io/travis/diminator/bigchaindb/develop.svg)](https://travis-ci.org/diminator/bigchaindb) [![PyPI](https://img.shields.io/pypi/v/bigchaindb.svg)](https://pypi.python.org/pypi/BigchainDB)
[![Codecov branch](https://img.shields.io/codecov/c/github/diminator/bigchaindb/develop.svg)](https://codecov.io/github/diminator/bigchaindb?branch=develop) [![Travis branch](https://img.shields.io/travis/bigchaindb/bigchaindb/develop.svg)](https://travis-ci.org/bigchaindb/bigchaindb)
[![Codecov branch](https://img.shields.io/codecov/c/github/bigchaindb/bigchaindb/develop.svg)](https://codecov.io/github/bigchaindb/bigchaindb?branch=develop)
[![Documentation Status](https://readthedocs.org/projects/bigchaindb/badge/?version=develop)](http://bigchaindb.readthedocs.org/en/develop/?badge=develop)
## Interledger ## Quick Start
This fork provides basic functionality for supporting the interledger protocol, see http://interledger.org/
The edits are found under interledger/core.py and interledger/tests/test_connector.py
To run the interledger test, [install bigchaindb](#gettingstarted)
```
$0> rethinkdb &
$1> bigchaindb -c examples/interledger/bigchain.json start
$2> bigchaindb -c examples/interledger/megachain.json start
$3> cd examples/interledger
$3> python3 run_cross_ledger_payment_simple.py
```
- [x] multisig
- [x] escrow
- [x] connectors
- [ ] signed receipts
- [ ] receipt propagation and listeners
- [ ] proper asset conversion
- [ ] RESTful API wrapper
- [ ] multi-(big)chain(db) instantiation + network path optimization
## <a name="gettingstarted"></a>Quick Start
### [Install & Run BigchainDB](http://bigchaindb.readthedocs.org/en/develop/installing.html) ### [Install & Run BigchainDB](http://bigchaindb.readthedocs.org/en/develop/installing.html)
### [Run BigchainDB with Docker](http://bigchaindb.readthedocs.org/en/develop/installing.html#run-bigchaindb-with-docker) ### [Run BigchainDB with Docker](http://bigchaindb.readthedocs.org/en/develop/installing.html#run-bigchaindb-with-docker)

View File

View File

@ -1,45 +0,0 @@
class User:
def __init__(self, ledger):
self.ledger = ledger
self.private, self.public = ledger.generate_keys()
self.assets = []
def create_asset(self):
tx = self.ledger.create_transaction(self.ledger.me, self.public, None, 'CREATE')
tx_signed = self.ledger.sign_transaction(tx, self.ledger.me_private)
self.ledger.validate_transaction(tx_signed)
self.ledger.write_transaction(tx_signed)
self.assets.append(tx_signed)
def create_assets(self, amount=1):
for i in range(amount):
self.create_asset()
class Escrow(User):
def __init__(self, ledger=None, current_owner=None, new_owner=None,
asset_id=None, condition_func=None, payload=None):
User.__init__(self, ledger)
self.condition_func = condition_func if condition_func else lambda proof: True
self.new_owner = new_owner
tx = self.ledger.create_transaction(current_owner,
[current_owner, self.public],
asset_id,
'TRANSFER',
payload)
self.assets = tx
def release(self, receipt=None):
if not self.validate(receipt):
raise Exception
tx = self.ledger.create_transaction(self.assets['transaction']['new_owners'],
self.new_owner,
self.assets['id'],
'TRANSFER',
self.assets['transaction']['data']['payload'])
return self.ledger.sign_transaction(tx, self.private, self.public)
def validate(self, receipt):
return self.condition_func(receipt)

View File

@ -1 +0,0 @@
{"database": {"host": "localhost", "name": "bigchain", "port": 28015}, "keyring": [], "keypair": {"public": "jhpCiHPiMmHGFQvjqn1LdLddYhYFd63ywUbi3tFCW31f", "private": "5vbka7oLMf2UTNV1sq3nyKJXTERCPWvD8Pf4KnGYNBtA"}}

View File

@ -1,76 +0,0 @@
from examples.accounts import User, Escrow
class LedgerConnection(User):
def __init__(self, ledger):
self._escrow = None
User.__init__(self, ledger)
def escrow(self, current_owner=None, new_owner=None, condition_func=None, asset_id=None, payload=None):
self._escrow = Escrow(ledger=self.ledger,
current_owner=current_owner if current_owner else self.public,
new_owner=new_owner if new_owner else self.public,
asset_id=asset_id if asset_id else self.assets[0]['id'],
condition_func=condition_func,
payload=payload)
if not current_owner:
tx_connector_signed = self.ledger.sign_transaction(self._escrow.assets, self.private)
self.ledger.validate_transaction(tx_connector_signed)
self._escrow.assets = tx_connector_signed
self.ledger.write_transaction(tx_connector_signed)
def release(self, condition):
return self._escrow.release(condition)
class Connector:
def __init__(self, ledger=None):
self.ledger_connections = []
if ledger:
self.add_ledger(ledger)
def public(self, ledger=None):
return self.get_ledger_connection(ledger).public if self.get_ledger_connection(ledger) else None
def private(self, ledger=None):
return self.get_ledger_connection(ledger).private if self.get_ledger_connection(ledger) else None
def get_assets(self, ledger=None):
ledger_connection = self.get_ledger_connection(ledger)
return ledger_connection.assets if ledger_connection else None
def create_assets(self, amount=1, ledger=None):
ledger_connection = self.get_ledger_connection(ledger)
if ledger_connection:
ledger_connection.create_assets(amount)
def get_ledger_connection(self, ledger=None):
if not ledger:
return self.ledger_connections[0]
# TODO: yield
ledger_connection = [l for l in self.ledger_connections if l.ledger == ledger]
return ledger_connection[0] if ledger_connection else None
def add_ledger(self, ledger):
if self.can_add_ledger_connection(ledger):
self.ledger_connections.append(LedgerConnection(ledger))
def can_add_ledger_connection(self, ledger):
return False if self.get_ledger_connection(ledger) else True
def connect(self, user_from=None, ledger_from=None, user_to=None, ledger_to=None,
condition_func=None, asset_id=None, payload=None):
connection_from = self.get_ledger_connection(ledger_from)
connection_to = self.get_ledger_connection(ledger_to)
connection_from.escrow(current_owner=user_from,
condition_func=condition_func,
asset_id=asset_id,
payload=payload)
connection_to.escrow(new_owner=user_to,
condition_func=condition_func,
payload=payload)
return connection_from._escrow.assets
def release(self, ledger=None, receipt=None):
connection = self.get_ledger_connection(ledger)
return connection.release(receipt)

View File

@ -1 +0,0 @@
{"keyring": [], "database": {"host": "localhost", "port": 28015, "name": "megachain"}, "keypair": {"private": "DGKiLSdLsZofmzZMv3B9KZVj79wrq4PZ3PsMmk8Hu8KK", "public": "gMGJ9j15qyBVC1t8ceiDgJLLaRBgvrFchyzB1GgWk3Fa"}}

View File

@ -1,54 +0,0 @@
import json
from time import sleep
from bigchaindb import Bigchain
from examples.accounts import User
from examples.interledger.connector import Connector
config_bigchain = json.load(open('bigchain.json', 'r'))
config_megachain = json.load(open('megachain.json', 'r'))
bigchain = Bigchain(dbname=config_bigchain['database']['name'],
public_key=config_bigchain['keypair']['public'],
private_key=config_bigchain['keypair']['private'])
megachain = Bigchain(dbname=config_megachain['database']['name'],
public_key=config_megachain['keypair']['public'],
private_key=config_megachain['keypair']['private'])
alice = User(bigchain)
bob = User(megachain)
connector = Connector(bigchain)
connector.add_ledger(megachain)
# create assets
alice.create_assets(amount=2)
connector.create_assets(amount=2, ledger=bigchain)
connector.create_assets(amount=2, ledger=megachain)
sleep(6)
# transfer asset to escrow
tx_alice = connector.connect(user_from=alice.public,
ledger_from=alice.ledger,
user_to=bob.public,
ledger_to=bob.ledger,
condition_func=lambda proof: True,
asset_id=alice.assets[0]['id'],
payload={'what': 'ever'})
tx_alice_signed = alice.ledger.sign_transaction(tx_alice, alice.private)
alice.ledger.validate_transaction(tx_alice_signed)
alice.ledger.write_transaction(tx_alice_signed)
sleep(6)
# release asset from escrow
tx_bob = connector.release(ledger=bob.ledger, receipt=None)
tx_bob_signed = bob.ledger.sign_transaction(tx_bob, connector.private(bob.ledger), connector.public(bob.ledger))
bob.ledger.validate_transaction(tx_bob_signed)
bob.ledger.write_transaction(tx_bob_signed)
tx_connector = connector.release(ledger=alice.ledger, receipt=None)
tx_connector_signed = alice.ledger.sign_transaction(tx_connector, alice.private, alice.public)
alice.ledger.validate_transaction(tx_connector_signed)
alice.ledger.write_transaction(tx_connector_signed)