From 95840d748de956ca499098a66e3297d0b93c7755 Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Thu, 25 May 2017 20:38:04 -0300 Subject: [PATCH 01/31] Added 5nodesRTGS example --- examples/5nodesRTGS/.gitignore | 2 + examples/5nodesRTGS/README.md | 77 ++++ examples/5nodesRTGS/contracts.sol | 365 ++++++++++++++++++ .../5nodesRTGS/deploy-bankContract-0-3-6.js | 18 + .../deploy-regulatorTransactionList-0-3-6.js | 16 + examples/5nodesRTGS/genesis.json | 47 +++ examples/5nodesRTGS/init.sh | 33 ++ examples/5nodesRTGS/keys/key1 | 1 + examples/5nodesRTGS/keys/key2 | 1 + examples/5nodesRTGS/keys/key3 | 1 + examples/5nodesRTGS/keys/key4 | 1 + examples/5nodesRTGS/keys/key5 | 1 + examples/5nodesRTGS/keys/tm1.key | 1 + examples/5nodesRTGS/keys/tm1.pub | 1 + examples/5nodesRTGS/keys/tm1a.key | 1 + examples/5nodesRTGS/keys/tm1a.pub | 1 + examples/5nodesRTGS/keys/tm2.key | 1 + examples/5nodesRTGS/keys/tm2.pub | 1 + examples/5nodesRTGS/keys/tm2a.key | 1 + examples/5nodesRTGS/keys/tm2a.pub | 1 + examples/5nodesRTGS/keys/tm3.key | 1 + examples/5nodesRTGS/keys/tm3.pub | 1 + examples/5nodesRTGS/keys/tm3a.key | 1 + examples/5nodesRTGS/keys/tm3a.pub | 1 + examples/5nodesRTGS/keys/tm4.key | 1 + examples/5nodesRTGS/keys/tm4.pub | 1 + examples/5nodesRTGS/keys/tm4a.key | 1 + examples/5nodesRTGS/keys/tm4a.pub | 1 + examples/5nodesRTGS/keys/tm5.key | 1 + examples/5nodesRTGS/keys/tm5.pub | 1 + examples/5nodesRTGS/keys/tm5a.key | 1 + examples/5nodesRTGS/keys/tm5a.pub | 1 + examples/5nodesRTGS/passwords.txt | 0 examples/5nodesRTGS/runscript.sh | 2 + examples/5nodesRTGS/start.sh | 39 ++ examples/5nodesRTGS/stop.sh | 2 + examples/5nodesRTGS/tm1.conf | 9 + examples/5nodesRTGS/tm2.conf | 9 + examples/5nodesRTGS/tm3.conf | 9 + examples/5nodesRTGS/tm4.conf | 9 + examples/5nodesRTGS/tm5.conf | 9 + 41 files changed, 671 insertions(+) create mode 100644 examples/5nodesRTGS/.gitignore create mode 100644 examples/5nodesRTGS/README.md create mode 100644 examples/5nodesRTGS/contracts.sol create mode 100644 examples/5nodesRTGS/deploy-bankContract-0-3-6.js create mode 100644 examples/5nodesRTGS/deploy-regulatorTransactionList-0-3-6.js create mode 100644 examples/5nodesRTGS/genesis.json create mode 100644 examples/5nodesRTGS/init.sh create mode 100644 examples/5nodesRTGS/keys/key1 create mode 100644 examples/5nodesRTGS/keys/key2 create mode 100644 examples/5nodesRTGS/keys/key3 create mode 100644 examples/5nodesRTGS/keys/key4 create mode 100644 examples/5nodesRTGS/keys/key5 create mode 100644 examples/5nodesRTGS/keys/tm1.key create mode 100644 examples/5nodesRTGS/keys/tm1.pub create mode 100644 examples/5nodesRTGS/keys/tm1a.key create mode 100644 examples/5nodesRTGS/keys/tm1a.pub create mode 100644 examples/5nodesRTGS/keys/tm2.key create mode 100644 examples/5nodesRTGS/keys/tm2.pub create mode 100644 examples/5nodesRTGS/keys/tm2a.key create mode 100644 examples/5nodesRTGS/keys/tm2a.pub create mode 100644 examples/5nodesRTGS/keys/tm3.key create mode 100644 examples/5nodesRTGS/keys/tm3.pub create mode 100644 examples/5nodesRTGS/keys/tm3a.key create mode 100644 examples/5nodesRTGS/keys/tm3a.pub create mode 100644 examples/5nodesRTGS/keys/tm4.key create mode 100644 examples/5nodesRTGS/keys/tm4.pub create mode 100644 examples/5nodesRTGS/keys/tm4a.key create mode 100644 examples/5nodesRTGS/keys/tm4a.pub create mode 100644 examples/5nodesRTGS/keys/tm5.key create mode 100644 examples/5nodesRTGS/keys/tm5.pub create mode 100644 examples/5nodesRTGS/keys/tm5a.key create mode 100644 examples/5nodesRTGS/keys/tm5a.pub create mode 100644 examples/5nodesRTGS/passwords.txt create mode 100644 examples/5nodesRTGS/runscript.sh create mode 100644 examples/5nodesRTGS/start.sh create mode 100644 examples/5nodesRTGS/stop.sh create mode 100644 examples/5nodesRTGS/tm1.conf create mode 100644 examples/5nodesRTGS/tm2.conf create mode 100644 examples/5nodesRTGS/tm3.conf create mode 100644 examples/5nodesRTGS/tm4.conf create mode 100644 examples/5nodesRTGS/tm5.conf diff --git a/examples/5nodesRTGS/.gitignore b/examples/5nodesRTGS/.gitignore new file mode 100644 index 00000000..0811418c --- /dev/null +++ b/examples/5nodesRTGS/.gitignore @@ -0,0 +1,2 @@ +qdata/ +nohup.out diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md new file mode 100644 index 00000000..5715dfcc --- /dev/null +++ b/examples/5nodesRTGS/README.md @@ -0,0 +1,77 @@ +# 7 nodes + +This example configures 7 nodes, each with their own PrivateTransactionManager. Usage: + + - `init.sh`: Initialize accounts and keystores + - `start.sh`: Launch `constellation` and `geth` nodes, then send a private transaction + - `stop.sh`: Stop all `constellation` and `geth` nodes + +There are corresponding commands for running in Raft mode (`stop.sh` stays the same). + + - `raft-init.sh` + - `raft-start.sh` + +All logs and temporary data will be written to the `qdata` folder. + +## Testing Privacy +You can run the 7node example to test the privacy features of Quorum. As described in the Quick Start section of the [README](https://github.com/jpmorganchase/quorum), the final step of the 7node `start.sh` script was the sending of a private transaction to generate a (private) smart contract (SimpleStorage) sent from node 1 "for" node 7 (denoted by the public key passed via privateFor: ["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="] in the sendTransaction call). We'll begin by demonstrating only nodes 1 and 7 are able to view the initial state of the contract. Next we have node 1 update the state of this contract and again verify only nodes 1 and 7 are able to see the updated state of the contract after the block containing the update transaction is validated by the network. + +For this test it is recommended to use separate terminal windows running geth JavaScript console attached to node 1, node 7, and any node 2-6 (in our example we'll choose node 4). + +In each terminal, ensure you are in the 7nodes dir before running the below. + +* If you aren't already running the 7nodes example, in terminal 1 run ``$ ./init.sh `` followed by ``$ ./start.sh `` +* In terminal 1 run ``$ geth attach ipc:qdata/dd1/geth.ipc`` +* In terminal 2 run ``$ geth attach ipc:qdata/dd4/geth.ipc`` +* In terminal 3 run ``$ geth attach ipc:qdata/dd7/geth.ipc`` + +For each of the 3 nodes we'll use the built-in JavaScript by setting the variable ```address``` assigned to the simpleStorage contract address created by the node 1. The address can be found in the node 1's log file 7nodes/qdata/logs/1.log, or alternatively by reading the `contractAddress` param after calling `eth.getTransactionReceipt(txHash)` ([Ethereum API documentation](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactionreceipt)), passing in the transaction hash that was logged in the console that you ran the 7nodes example in. Replace the address below with the address value found in the 1.log file: +``` +> var address = "0x1932c48b2bf8102ba33b4a6b545c32236e342f34"; +``` +Next we'll use ```eth.contract``` to define a contract class with the simpleStorage ABI definition as follows: +``` +> var abi = [{"constant":true,"inputs":[],"name":"storedData","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"initVal","type":"uint256"}],"type":"constructor"}]; +> var private = eth.contract(abi).at(address) +``` +The function calls are now available on the contract instance and you can call those methods on the contract. Let's start by examining the initial value of the contract to make sure that only nodes 1 and 7 can see the initialized value. +* In terminal window 1 (node 1) +``` +> private.get() +42 +``` +* In terminal window 2 (node 4) +``` +> private.get() +0 +``` +* In terminal window 3 (node 7) +``` +> private.get() +42 +``` + +So we now see nodes 1 and 7 are able to read the state of the private contract and it's initial value is 42. Node 4 is unable to read the state. Next we'll have node 1 set the state to the value `4` and verify only nodes 1 and 7 are able to view the new state. + +In terminal window 1 (node 1) +``` +> private.set(4,{from:eth.coinbase,privateFor:["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="]}); +"0xacf293b491cccd1b99d0cfb08464a68791cc7b5bc14a9b6e4ff44b46889a8f70" +``` +You can check the log files in ~7nodes/qdata/logs directory to see each node validating the block with this new private transaction. Once the block containing the transaction has been validated we can once again check the state from each node 1, 4, and 7. +* In terminal window 1 (node 1) +``` +> private.get() +4 +``` +* In terminal window 2 (node 4) +``` +> private.get() +0 +``` +* In terminal window 3 (node 7) +``` +> private.get() +4 +``` +And there you have it. All 7 nodes are validating the same blockchain of transactions, the private transactions carrying nothing other than a 512 bit hash, and only parties to private transactions are able to view and update the state of private contracts. diff --git a/examples/5nodesRTGS/contracts.sol b/examples/5nodesRTGS/contracts.sol new file mode 100644 index 00000000..81fa59d8 --- /dev/null +++ b/examples/5nodesRTGS/contracts.sol @@ -0,0 +1,365 @@ +/* +bankContract: JPMorgan Quorum smart contract example implementing a private +payment system +Must be deployed as a PRIVATE contract +Initialization: +- Each bank must have an instance of the contract deployed. +- Bank balances must be set privately by the regulator node on each +bank contract instance. This information is only shared between the bank and +the regulator . +- Transactions are private. Each transaction sensitive information is only shared +between the sender, receiver and regulator. +- The list of participating banks must be set by the regulator + +Usage: +- Banks can send money calling sendValue function using only its authorized +account (authorizedSender). A random value must be provided to ensure an unique +transaction ID. If a constant value is passed on every transaction, a +transaction ID collision can occur if two transactions with the same sender, +destination and value are mined in the same block. + +- Transactions are created on an unconfirmed status and they are not +settled. The finality is only achieved after the transaction is confirmed. + +- Transaction IDs must be published on an public contract that stores the +transaction log. This ensures that the regulator has knowledge of all the +transactions. If the regulator sees a transaction in the log that was not +copied privately by the sender to him, he can block it immediately. + +- Only the regulator can confirm a transaction during the confirmation time +(60 seconds by default). During this period, the regulator can read the +transaction and compare it to the bank balance. If the bank has enough money, +the regulator confirms the transaction calling confirmTransactionRegulator +function. + +- If a published transaction would cause an overdraft if confirmed, the +regulator can block it so the bank cannot confirm the transaction after +the confirmation time. + +- If the regulator does not act (blocking or confirming) during the +confirmation time, the sender can confirm its own transaction. This proccess +ensures that the system can endure a regulator outage. + +- Transaction confirmation will reflect on both smart contracts balance +immediatelly (sender and receiver). + +Known problems: +- Fail to provide a random value to the sendValue like using the same value +on every transaction can lead to duplicated transaction IDs in case of fast +multiple identical transactions. + +*/ + +contract bankContract { +uint public balance=0; +address public thisBankContract; +bool public isRegulatorNode = false; +uint public confirmationTime = 60; + +address public TransactionListAddress; + +//totalTransactions: counts all the transactions that the bank is part of, +//confirmed or not. +uint public totalTransactions = 0; + +struct transaction { + uint value; + address senderContract; + address destinationContract; + bool confirmed; + uint senderBalanceAtTransfer; +} + +mapping (bytes32 => transaction) public transactions; +mapping (uint => bytes32) public transactionIDs; + + +modifier onlyRegulator() { + regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); + if (msg.sender != transactionListContractModifier.getRegulator()) throw;_ +} + +//This modifier ensures that the msg.sender is a valid bank contract address + +modifier validSenderContract() { + regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); + if (!transactionListContractModifier.getBankExistance(msg.sender)) throw;_ +} + +//This modifier ensures that the msg.sender is THE valid bank transaction +//address. It prevents bank impersonation attack +modifier authorizedSender() { + regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); + if (transactionListContractModifier.getBankSender(address(this))!= msg.sender) throw;_ +} + +function setTransactionListAddress (address _contractAddress) onlyRegulator { + TransactionListAddress = _contractAddress; +} + +/* sendValue: creates a private transaction between banks. The transaction +is stored in the private transaction log that is only shared between the sender, +the receiver and the regulator. The transaction is created NOT CONFIRMED. In +this state, no funds have changed hands. The funds are only moved and balances +updated if the transaction is CONFIRMED in a another function call, achieving +finality +*/ +function sendValue (address _destination , uint _value, string _random) authorizedSender { + +uint destinationTransactionID; +bytes32 transactionID; + +regulatorTransactionList transactionListContract = regulatorTransactionList(TransactionListAddress); + +transactionID=sha3(address(this),_destination,_value,block.timestamp,_random); + +transactionIDs[totalTransactions]=transactionID; + +if ((!transactionListContract.getBankExistance(_destination))|| +(!transactionListContract.getBankState(address(this)))) throw; + +bankContract destinationContract = bankContract(_destination); +destinationContract.receiveValue(_value,_random); + +transactions[transactionID].value=_value; +transactions[transactionID].senderContract=address(this); +transactions[transactionID].destinationContract=_destination; +transactions[transactionID].senderBalanceAtTransfer=balance; +transactions[transactionID].confirmed=false; + +totalTransactions++; + +} + +/* receiveValue: creates a copy of the transaction created by the sendValue +function in the recipient bank contract. +*/ +function receiveValue (uint _value, string _random) validSenderContract { + +bytes32 transactionID; + +transactionID=sha3(msg.sender,address(this),_value,block.timestamp,_random); + +transactionIDs[totalTransactions]=transactionID; + +transactions[transactionID].value=_value; +transactions[transactionID].senderContract=msg.sender; +transactions[transactionID].destinationContract=address(this); +transactions[transactionID].confirmed=false; + +totalTransactions++; + +} + +function setRegulatorNode () onlyRegulator { + isRegulatorNode=true; +} + +function setBalance(uint _balance) onlyRegulator { + balance=_balance; +} + + +function setConfirmationTime(uint _seconds) onlyRegulator { + confirmationTime=_seconds; +} + +function setThisBankContract(address _thisBankContract) onlyRegulator { + thisBankContract = _thisBankContract; +} + +/*confirmTransactionRegulator: regulator exclusive function to confirm a +transaction. The transaction MUST be in the public transaction log to be +confirmed, even by the regulator. This ensures that every part is aware of the +transaction or must report inconsistence to the regulator. Overdraft protection +was not possible because there is no consensus on private contracts. +Balances are updated on both contracts if all checks are successful. +*/ +function confirmTransactionRegulator(bytes32 _transactionID) onlyRegulator { + + regulatorTransactionList transactionListContract = regulatorTransactionList(TransactionListAddress); + + if ((!transactions[_transactionID].confirmed)&& + (!transactionListContract.getTransactionState(_transactionID))&& + (transactionListContract.getTransactionExistance(_transactionID))) { + transactions[_transactionID].confirmed=true; + + if (transactions[_transactionID].destinationContract == address(this)) { + if ((transactions[_transactionID].destinationContract == thisBankContract) || + (isRegulatorNode)) { + balance+=transactions[_transactionID].value; + } + bankContract senderContract = bankContract(transactions[_transactionID].senderContract); + + senderContract.confirmTransactionPair(_transactionID); + } + + if (transactions[_transactionID].senderContract == address(this)) { + if ((transactions[_transactionID].senderContract == thisBankContract) || + (isRegulatorNode)) { + balance-=transactions[_transactionID].value; + } + bankContract destinationContract = bankContract(transactions[_transactionID].destinationContract); + + destinationContract.confirmTransactionPair(_transactionID); + } + } +} + +/*confirmTransactionBank: bank exclusive function to confirm a +transaction. A bank can only confirm a transaction after the confirmationTime +seconds has passed. The transaction MUST be in the public transaction log to be +confirmed. This ensures that every part is aware of the +transaction or must report inconsistence to the regulator. Overdraft protection +was not possible because there is no consensus on private contracts. +Balances are updated on both contracts if all checks are successful. +*/ +function confirmTransactionBank(bytes32 _transactionID) authorizedSender { + + regulatorTransactionList transactionListContract = regulatorTransactionList(TransactionListAddress); + + if ((block.timestamp-transactionListContract.getTransactionTimestamp(_transactionID) > confirmationTime) && + (!transactions[_transactionID].confirmed)&& + (!transactionListContract.getTransactionState(_transactionID))&& + (transactionListContract.getTransactionExistance(_transactionID))){ + + if (transactions[_transactionID].senderContract == address(this)) { + transactions[_transactionID].confirmed=true; + if ((transactions[_transactionID].senderContract == thisBankContract) || + (isRegulatorNode)) + balance-=transactions[_transactionID].value; + + bankContract destinationContract = bankContract(transactions[_transactionID].destinationContract); + + destinationContract.confirmTransactionPair(_transactionID); + } + + } +} + +/*confirmTransactionPair: updates the balance of the other leg of the +transaction. Can only be called by a bank contract address +*/ +function confirmTransactionPair(bytes32 _transactionID) validSenderContract { + + if (!transactions[_transactionID].confirmed) { + transactions[_transactionID].confirmed=true; + + if (transactions[_transactionID].destinationContract == address(this)) + if ((transactions[_transactionID].destinationContract == thisBankContract)||(isRegulatorNode)) + balance+=transactions[_transactionID].value; + + if (transactions[_transactionID].senderContract == address(this)) + if ((transactions[_transactionID].senderContract == thisBankContract)||(isRegulatorNode)) + balance-=transactions[_transactionID].value; + } + + +} + +} + +/*Contract regulatorTransactionList +Must be deployed as a PUBLIC contract +Maintains a public transaction log without sensitive information like banks +involved and values. Additionally it maintains a public bank list, including +transaction and contract addresses. +*/ + +contract regulatorTransactionList { + + struct transaction { + bool exists; + uint timestamp; + bool blocked; +} + +struct Bank { + string name; + bool authorized; + bool exists; + address authorizedSender; +} + + address public regulator; + + mapping (bytes32 => transaction) public transactions; + + mapping (address => Bank) public banks; + + modifier onlyRegulator() { if (msg.sender != regulator) throw;_ + } + + function regulatorTransactionList() { + regulator=msg.sender; + } + + function addTransaction (bytes32 _transactionID) { + transactions[_transactionID].exists=true; + transactions[_transactionID].timestamp=block.timestamp; + transactions[_transactionID].blocked=false; + } + + function getTransactionExistance (bytes32 _transactionID) public constant + returns (bool) { + return (transactions[_transactionID].exists); +} + + function getTransactionState (bytes32 _transactionID) public constant + returns (bool) { + return (transactions[_transactionID].blocked); +} + + function getTransactionTimestamp (bytes32 _transactionID) public constant + returns (uint) { + return (transactions[_transactionID].timestamp); +} + + function getBankExistance (address _contract) public constant + returns (bool) { + return (banks[_contract].exists); +} + + function getBankState (address _contract) public constant + returns (bool) { + return (banks[_contract].authorized); +} + +function getBankSender (address _contract) public constant + returns (address) { + return (banks[_contract].authorizedSender); +} + +function getRegulator () public constant + returns (address) { + return (regulator); +} + +function blockTransaction(bytes32 _transactionID) onlyRegulator { + if (transactions[_transactionID].exists) { + transactions[_transactionID].blocked=true; + } +} + +function unblockTransaction(bytes32 _transactionID) onlyRegulator { + if (transactions[_transactionID].exists) { + transactions[_transactionID].blocked=false; + } +} + +function addBank (string _name, address _contract, address _sender) onlyRegulator { + banks[_contract].name=_name; + banks[_contract].exists=true; + banks[_contract].authorized=true; + banks[_contract].authorizedSender=_sender; +} + +function blockBank (address _contract) onlyRegulator { + banks[_contract].authorized=false; +} + +function authorizeBank (address _contract) onlyRegulator { + banks[_contract].authorized=true; +} + +} \ No newline at end of file diff --git a/examples/5nodesRTGS/deploy-bankContract-0-3-6.js b/examples/5nodesRTGS/deploy-bankContract-0-3-6.js new file mode 100644 index 00000000..2977dbc0 --- /dev/null +++ b/examples/5nodesRTGS/deploy-bankContract-0-3-6.js @@ -0,0 +1,18 @@ +var bankcontractContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}]); + + + +var bankcontract = bankcontractContract.new( + { + from: web3.eth.accounts[0], + data: '606060405260006000600050556000600160146101000a81548160ff02191690830217905550603c60026000505560006004600050555b33600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b611e99806100706000396000f360606040523615610103576000357c0100000000000000000000000000000000000000000000000000000000900480633c97239714610105578063422753681461011d57806343e92862146101355780635ac2d89414610194578063642f2eaf146101ac578063679e9f3a1461022257806369184f1514610245578063692a4e511461025d578063694fc108146102825780637a2dc88a146102bb5780638092f405146102f4578063859376701461030c578063885cbbab14610374578063a153ed6d14610383578063b69ef8a81461039b578063b9a60038146103be578063c3cb5b89146103e1578063dd8fee1414610411578063fb1669ca1461044a57610103565b005b61011b6004808035906020019091905050610462565b005b6101336004808035906020019091905050610a6b565b005b6101926004808035906020019091908035906020019082018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050909091905050610ad5565b005b6101aa6004808035906020019091905050610d62565b005b6101c26004808035906020019091905050611276565b604051808681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183151581526020018281526020019550505050505060405180910390f35b61022f6004805050611302565b6040518082815260200191505060405180910390f35b61025b600480803590602001909190505061130b565b005b61026a6004805050611396565b60405180821515815260200191505060405180910390f35b61028f60048050506113a9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102c860048050506113cf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61030a60048080359060200190919050506113f5565b005b6103726004808035906020019091908035906020019091908035906020019082018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050909091905050611480565b005b6103816004805050611988565b005b6103996004808035906020019091905050611a00565b005b6103a86004805050611ddc565b6040518082815260200191505060405180910390f35b6103cb6004805050611de5565b6040518082815260200191505060405180910390f35b6103f76004808035906020019091905050611dee565b604051808260001916815260200191505060405180910390f35b61041e6004805050611e09565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104606004808035906020019091905050611e2f565b005b600060006000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104c457610002565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250600660005060008560001916815260200190815260200160002060005060020160149054906101000a900460ff1615801561059857508273ffffffffffffffffffffffffffffffffffffffff1663c71cca1685604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150155b801561061757508273ffffffffffffffffffffffffffffffffffffffff1663054380f985604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001505b15610a64576001600660005060008660001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055503073ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561085b57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061076f5750600160149054906101000a900460ff165b156107aa5760066000506000856000191681526020019081526020016000206000506000016000505460006000828282505401925050819055505b600660005060008560001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d85604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506000604051808303816000876161da5a03f115610002575050505b3073ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6357600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806109775750600160149054906101000a900460ff165b156109b25760066000506000856000191681526020019081526020016000206000506000016000505460006000828282505403925050819055505b600660005060008560001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a153ed6d85604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506000604051808303816000876161da5a03f115610002575050505b5b5b50505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ac757610002565b806002600050819055505b50565b60006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf33604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001501515610b9257610002565b3330854286604051808673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018280519060200190808383829060006004602084601f0104600302600f01f1509050019550505050505060405180910390209150815081600760005060006004600050548152602001908152602001600020600050819055508360066000506000846000191681526020019081526020016000206000506000016000508190555033600660005060008460001916815260200190815260200160002060005060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff0219169083021790555030600660005060008460001916815260200190815260200160002060005060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055506000600660005060008460001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055506004600081815054809291906001019190505550505b505050565b600060006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635065426030604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f115610002575050506040518051906020015073ffffffffffffffffffffffffffffffffffffffff16141515610e4f57610002565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506002600050548373ffffffffffffffffffffffffffffffffffffffff16632fbff52086604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001504203118015610f2b5750600660005060008560001916815260200190815260200160002060005060020160149054906101000a900460ff16155b8015610fab57508273ffffffffffffffffffffffffffffffffffffffff1663c71cca1685604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150155b801561102a57508273ffffffffffffffffffffffffffffffffffffffff1663054380f985604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001505b1561126f573073ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561126e576001600660005060008660001916815260200190815260200160002060005060020160146101000a81548160ff02191690830217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806111825750600160149054906101000a900460ff165b156111bd5760066000506000856000191681526020019081526020016000206000506000016000505460006000828282505403925050819055505b600660005060008560001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d85604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506000604051808303816000876161da5a03f115610002575050505b5b505b505050565b60066000506020528060005260406000206000915090508060000160005054908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160149054906101000a900460ff16908060030160005054905085565b60026000505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561136757610002565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b50565b600160149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145157610002565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b50565b60006000600060006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635065426030604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f115610002575050506040518051906020015073ffffffffffffffffffffffffffffffffffffffff1614151561157157610002565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692503088884289604051808673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018280519060200190808383829060006004602084601f0104600302600f01f1509050019550505050505060405180910390209350835083600760005060006004600050548152602001908152602001600020600050819055508273ffffffffffffffffffffffffffffffffffffffff1663288bdecf89604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150158061177557508273ffffffffffffffffffffffffffffffffffffffff16638c41eae630604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150155b1561177f57610002565b8791508173ffffffffffffffffffffffffffffffffffffffff166343e928628888604051837c010000000000000000000000000000000000000000000000000000000002815260040180838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561182b5780820380516001836020036101000a031916815260200191505b5093505050506000604051808303816000876161da5a03f115610002575050508660066000506000866000191681526020019081526020016000206000506000016000508190555030600660005060008660001916815260200190815260200160002060005060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff0219169083021790555087600660005060008660001916815260200190815260200160002060005060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055506000600050546006600050600086600019168152602001908152602001600020600050600301600050819055506000600660005060008660001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055506004600081815054809291906001019190505550505b50505050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119e457610002565b6001600160146101000a81548160ff021916908302179055505b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf33604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001501515611abb57610002565b600660005060008360001916815260200190815260200160002060005060020160149054906101000a900460ff161515611dd7576001600660005060008460001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055503073ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c7e57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611c425750600160149054906101000a900460ff165b15611c7d5760066000506000836000191681526020019081526020016000206000506000016000505460006000828282505401925050819055505b5b3073ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611dd657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611d9a5750600160149054906101000a900460ff165b15611dd55760066000506000836000191681526020019081526020016000206000506000016000505460006000828282505403925050819055505b5b5b505b50565b60006000505481565b60046000505481565b60076000506020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e8b57610002565b806000600050819055505b5056', + gas: '4700000', + privateFor: ["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="] + }, function (e, contract){ + console.log(e, contract); + if (typeof contract.address !== 'undefined') { + console.log('Contract mined! address: "' + contract.address + '"\n'); + } + }) + + diff --git a/examples/5nodesRTGS/deploy-regulatorTransactionList-0-3-6.js b/examples/5nodesRTGS/deploy-regulatorTransactionList-0-3-6.js new file mode 100644 index 00000000..0f52f22e --- /dev/null +++ b/examples/5nodesRTGS/deploy-regulatorTransactionList-0-3-6.js @@ -0,0 +1,16 @@ +var regulatortransactionlistContract = web3.eth.contract([{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionExistance","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_contract","type":"address"},{"name":"_sender","type":"address"}],"name":"addBank","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"blockBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankExistance","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionTimestamp","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankSender","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"exists","type":"bool"},{"name":"timestamp","type":"uint256"},{"name":"blocked","type":"bool"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"authorizeBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"banks","outputs":[{"name":"name","type":"string"},{"name":"authorized","type":"bool"},{"name":"exists","type":"bool"},{"name":"authorizedSender","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankState","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"addTransaction","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"unblockTransaction","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionState","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"blockTransaction","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}]); + + +var regulatortransactionlist = regulatortransactionlistContract.new( + { + from: web3.eth.accounts[0], + data: '60606040525b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b610c678061003f6000396000f3606060405236156100d7576000357c010000000000000000000000000000000000000000000000000000000090048063054380f9146100d95780631eaa25561461010757806321574ff81461016f578063288bdecf146101875780632fbff520146101b557806350654260146101e1578063642f2eaf146102235780636f74a2c01461026157806380c3b8c2146102795780638c41eae61461035657806394bbaa8014610384578063b809e2f91461039c578063c71cca16146103b4578063dd8fee14146103e2578063e5f9f94d1461041b576100d7565b005b6100ef6004808035906020019091905050610433565b60405180821515815260200191505060405180910390f35b61016d6004808035906020019082018035906020019191908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505090909190803590602001909190803590602001909190505061046f565b005b610185600480803590602001909190505061069b565b005b61019d6004808035906020019091905050610744565b60405180821515815260200191505060405180910390f35b6101cb6004808035906020019091905050610792565b6040518082815260200191505060405180910390f35b6101f760048080359060200190919050506107c4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102396004808035906020019091905050610825565b6040518084151581526020018381526020018215158152602001935050505060405180910390f35b610277600480803590602001909190505061086f565b005b61028f6004808035906020019091905050610918565b6040518080602001851515815260200184151581526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252868181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156103445780601f1061031957610100808354040283529160200191610344565b820191906000526020600020905b81548152906001019060200180831161032757829003601f168201915b50509550505050505060405180910390f35b61036c6004808035906020019091905050610987565b60405180821515815260200191505060405180910390f35b61039a60048080359060200190919050506109d5565b005b6103b26004808035906020019091905050610a6f565b005b6103ca6004808035906020019091905050610b3a565b60405180821515815260200191505060405180910390f35b6103ef6004805050610b76565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104316004808035906020019091905050610b9c565b005b6000600160005060008360001916815260200190815260200160002060005060000160009054906101000a900460ff16905061046a565b919050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104cb57610002565b82600260005060008473ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000506000016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061054a57805160ff191683800117855561057b565b8280016001018555821561057b579182015b8281111561057a57825182600050559160200191906001019061055c565b5b5090506105a69190610588565b808211156105a25760008181506000905550600101610588565b5090565b50506001600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160016101000a81548160ff021916908302179055506001600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160006101000a81548160ff0219169083021790555080600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b505050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106f757610002565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160006101000a81548160ff021916908302179055505b50565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160019054906101000a900460ff16905061078d565b919050565b600060016000506000836000191681526020019081526020016000206000506001016000505490506107bf565b919050565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610820565b919050565b60016000506020528060005260406000206000915090508060000160009054906101000a900460ff16908060010160005054908060020160009054906101000a900460ff16905083565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108cb57610002565b6001600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160006101000a81548160ff021916908302179055505b50565b600260005060205280600052604060002060009150905080600001600050908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160009054906101000a900460ff1690506109d0565b919050565b6001600160005060008360001916815260200190815260200160002060005060000160006101000a81548160ff02191690830217905550426001600050600083600019168152602001908152602001600020600050600101600050819055506000600160005060008360001916815260200190815260200160002060005060020160006101000a81548160ff021916908302179055505b50565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610acb57610002565b600160005060008260001916815260200190815260200160002060005060000160009054906101000a900460ff1615610b36576000600160005060008360001916815260200190815260200160002060005060020160006101000a81548160ff021916908302179055505b5b50565b6000600160005060008360001916815260200190815260200160002060005060020160009054906101000a900460ff169050610b71565b919050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610bf857610002565b600160005060008260001916815260200190815260200160002060005060000160009054906101000a900460ff1615610c63576001600160005060008360001916815260200190815260200160002060005060020160006101000a81548160ff021916908302179055505b5b5056', + + gas: '4700000' + }, function (e, contract){ + console.log(e, contract); + if (typeof contract.address !== 'undefined') { + console.log('Contract mined! address: "' + contract.address + '"\n'); + } + }) + diff --git a/examples/5nodesRTGS/genesis.json b/examples/5nodesRTGS/genesis.json new file mode 100644 index 00000000..b50c821d --- /dev/null +++ b/examples/5nodesRTGS/genesis.json @@ -0,0 +1,47 @@ +{ + "alloc": { + "0x0000000000000000000000000000000000000020": { + "code": "606060405236156100c45760e060020a60003504631290948581146100c9578063284d163c146100f957806342169e4814610130578063488099a6146101395780634fe437d514610154578063559c390c1461015d57806368bb8bb61461025d57806372a571fc146102c857806386c1ff681461036957806398ba676d146103a0578063a7771ee31461040b578063adfaa72e14610433578063cf5289851461044e578063de8fa43114610457578063e814d1c71461046d578063f4ab9adf14610494575b610002565b610548600435600160a060020a03331660009081526003602052604090205460ff16156100c45760018190555b50565b610548600435600160a060020a03331660009081526005602052604090205460ff16156100c4576004546001141561055e57610002565b61045b60025481565b61054a60043560056020526000908152604090205460ff1681565b61045b60015481565b61045b60043560006000600060006000600050600186038154811015610002579080526002027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630192505b60018301548110156105d75760018301805484916000918490811015610002576000918252602080832090910154835282810193909352604091820181205485825292869052205410801561023257506001805490840180548591600091859081101561000257906000526020600020900160005054815260208101919091526040016000205410155b156102555760018301805482908110156100025760009182526020909120015491505b6001016101a8565b610548600435602435600160a060020a03331660009081526003602052604081205460ff16156100c4578054839010156105e45780548084038101808355908290829080158290116105df576002028160020283600052602060002091820191016105df919061066b565b610548600435600160a060020a03331660009081526005602052604090205460ff16156100c457600160a060020a0381166000908152604090205460ff1615156100f65760406000819020805460ff191660019081179091556004805490910190558051600160a060020a038316815290517f1a4ce6942f7aa91856332e618fc90159f13a340611a308f5d7327ba0707e56859181900360200190a16100f6565b610548600435600160a060020a03331660009081526003602052604090205460ff16156100c4576002546001141561071457610002565b61045b600435602435600060006000600050600185038154811015610002579080526002027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630181509050806001016000508381548110156100025750825250602090200154919050565b61054a600435600160a060020a03811660009081526003602052604090205460ff165b919050565b61054a60043560036020526000908152604090205460ff1681565b61045b60045481565b6000545b60408051918252519081900360200190f35b61054a600435600160a060020a03811660009081526005602052604090205460ff1661042e565b610548600435600160a060020a03331660009081526003602052604090205460ff16156100c457600160a060020a03811660009081526003602052604090205460ff1615156100f65760406000818120600160a060020a0384169182905260036020908152815460ff1916600190811790925560028054909201909155825191825291517f0ad2eca75347acd5160276fe4b5dad46987e4ff4af9e574195e3e9bc15d7e0ff929181900390910190a16100f6565b005b604080519115158252519081900360200190f35b600160a060020a03811660009081526005602052604090205460ff16156100f65760406000819020805460ff19169055600480546000190190558051600160a060020a038316815290517f8cee3054364d6799f1c8962580ad61273d9d38ca1ff26516bd1ad23c099a60229181900360200190a16100f6565b509392505050565b505050505b60008054600019850190811015610002578382526002027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563016020819052604082205490925014156106b8578060010160005080548060010182818154818355818115116106a5578183600052602060002091820191016106a5919061068d565b50506002015b808211156106a157600181018054600080835591825260208220610665918101905b808211156106a1576000815560010161068d565b5090565b5050506000928352506020909120018290555b600082815260208281526040918290208054600101905581514381529081018490528151600160a060020a033316927f3d03ba7f4b5227cdb385f2610906e5bcee147171603ec40005b30915ad20e258928290030190a2505050565b600160a060020a03811660009081526003602052604090205460ff16156100f65760406000819020805460ff19169055600280546000190190558051600160a060020a038316815290517f183393fc5cffbfc7d03d623966b85f76b9430f42d3aada2ac3f3deabc78899e89181900360200190a16100f656", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x02", + + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x04", + "0x29ecdbdf95c7f6ceec92d6150c697aa14abeb0f8595dd58d808842ea237d8494": "0x01", + "0x6aa118c6537572d8b515a9f9154be55a3377a8de7991cd23bf6e5ceb368688e3": "0x01", + "0x50793743212c6f01d326957d7069005b912f8215f10c7536be6b10782c6c44cd": "0x01", + "0x38f6c908c5cc7ca668cec2f476abe61b4dbb1df20f0ad8e07ef5dbf6a2f1ffd4": "0x01", + + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x02", + "0xaca3b76ed4968740c3180dd7fa37f4aa229a2c758a848f53920e9ccb4c4bb74e": "0x01", + "0xd188ba2dc293670542c1befaf7678b0859e5354a0727d1188b2afb6f47fe24d1": "0x01" + } + + }, + "0xed9d02e382b34818e88b88a309c7fe71e65f419d": { + "balance": "1000000000000000000000000000" + }, + "0xca843569e3427144cead5e4d5999a3d0ccf92b8e": { + "balance": "1000000000000000000000000000" + }, + "0x0fbdc686b912d7722dc86510934589e0aaf3b55a": { + "balance": "1000000000000000000000000000" + }, + "0x9186eb3d20cbd1f5f992a950d808c4495153abd5": { + "balance": "1000000000000000000000000000" + }, + "0x0638e1574728b6d862dd5d3a3e0942c3be47d996": { + "balance": "1000000000000000000000000000" + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "config": { + "homesteadBlock": 0 + }, + "difficulty": "0x0", + "extraData": "0x", + "gasLimit": "0x2FEFD800", + "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578", + "nonce": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" +} diff --git a/examples/5nodesRTGS/init.sh b/examples/5nodesRTGS/init.sh new file mode 100644 index 00000000..1c138e2f --- /dev/null +++ b/examples/5nodesRTGS/init.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -u +set -e + +echo "[*] Cleaning up temporary data directories" +rm -rf qdata +mkdir -p qdata/logs + +echo "[*] Configuring node 1: Bank 1" +mkdir -p qdata/dd1/keystore +cp keys/key1 qdata/dd1/keystore +geth --datadir qdata/dd1 init genesis.json + +echo "[*] Configuring node 2 as block maker and voter: Bank 2" +mkdir -p qdata/dd2/keystore +cp keys/key2 qdata/dd2/keystore +cp keys/key3 qdata/dd2/keystore +geth --datadir qdata/dd2 init genesis.json + +echo "[*] Configuring node 3 as voter: Bank 3" +mkdir -p qdata/dd3/keystore +cp keys/key4 qdata/dd3/keystore +geth --datadir qdata/dd3 init genesis.json + +echo "[*] Configuring node 4 as voter: Regulator" +mkdir -p qdata/dd4/keystore +cp keys/key5 qdata/dd4/keystore +geth --datadir qdata/dd4 init genesis.json + +echo "[*] Configuring node 5: Observer" +mkdir -p qdata/dd5/keystore +geth --datadir qdata/dd5 init genesis.json + diff --git a/examples/5nodesRTGS/keys/key1 b/examples/5nodesRTGS/keys/key1 new file mode 100644 index 00000000..b98da7b6 --- /dev/null +++ b/examples/5nodesRTGS/keys/key1 @@ -0,0 +1 @@ +{"address":"ed9d02e382b34818e88b88a309c7fe71e65f419d","crypto":{"cipher":"aes-128-ctr","ciphertext":"4e77046ba3f699e744acb4a89c36a3ea1158a1bd90a076d36675f4c883864377","cipherparams":{"iv":"a8932af2a3c0225ee8e872bc0e462c11"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"8ca49552b3e92f79c51f2cd3d38dfc723412c212e702bd337a3724e8937aff0f"},"mac":"6d1354fef5aa0418389b1a5d1f5ee0050d7273292a1171c51fd02f9ecff55264"},"id":"a65d1ac3-db7e-445d-a1cc-b6c5eeaa05e0","version":3} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/key2 b/examples/5nodesRTGS/keys/key2 new file mode 100644 index 00000000..03170fcc --- /dev/null +++ b/examples/5nodesRTGS/keys/key2 @@ -0,0 +1 @@ +{"address":"ca843569e3427144cead5e4d5999a3d0ccf92b8e","crypto":{"cipher":"aes-128-ctr","ciphertext":"01d409941ce57b83a18597058033657182ffb10ae15d7d0906b8a8c04c8d1e3a","cipherparams":{"iv":"0bfb6eadbe0ab7ffaac7e1be285fb4e5"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"7b90f455a95942c7c682e0ef080afc2b494ef71e749ba5b384700ecbe6f4a1bf"},"mac":"4cc851f9349972f851d03d75a96383a37557f7c0055763c673e922de55e9e307"},"id":"354e3b35-1fed-407d-a358-889a29111211","version":3} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/key3 b/examples/5nodesRTGS/keys/key3 new file mode 100644 index 00000000..a5ce8653 --- /dev/null +++ b/examples/5nodesRTGS/keys/key3 @@ -0,0 +1 @@ +{"address":"0fbdc686b912d7722dc86510934589e0aaf3b55a","crypto":{"cipher":"aes-128-ctr","ciphertext":"6b2c72c6793f3da8185e36536e02f574805e41c18f551f24b58346ef4ecf3640","cipherparams":{"iv":"582f27a739f39580410faa108d5cc59f"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"1a79b0db3f8cb5c2ae4fa6ccb2b5917ce446bd5e42c8d61faeee512b97b4ad4a"},"mac":"cecb44d2797d6946805d5d744ff803805477195fab1d2209eddc3d1158f2e403"},"id":"f7292e90-af71-49af-a5b3-40e8493f4681","version":3} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/key4 b/examples/5nodesRTGS/keys/key4 new file mode 100644 index 00000000..cb67894d --- /dev/null +++ b/examples/5nodesRTGS/keys/key4 @@ -0,0 +1 @@ +{"address":"9186eb3d20cbd1f5f992a950d808c4495153abd5","crypto":{"cipher":"aes-128-ctr","ciphertext":"d160a630a39be3ff35556055406d8ff2a635f0535fe298d62ccc812d8f7b3bd5","cipherparams":{"iv":"82fce06bc6e1658a5e81ccef3b753329"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"8d0c486db4c942721f4f5e96d48e9344805d101dad8159962b8a2008ac718548"},"mac":"4a92bda949068968d470320260ae1a825aa22f6a40fb8567c9f91d700c3f7e91"},"id":"bdb3b4f6-d8d0-4b00-8473-e223ef371b5c","version":3} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/key5 b/examples/5nodesRTGS/keys/key5 new file mode 100644 index 00000000..19ac810d --- /dev/null +++ b/examples/5nodesRTGS/keys/key5 @@ -0,0 +1 @@ +{"address":"0638e1574728b6d862dd5d3a3e0942c3be47d996","crypto":{"cipher":"aes-128-ctr","ciphertext":"d8119d67cb134bc65c53506577cfd633bbbf5acca976cea12dd507de3eb7fd6f","cipherparams":{"iv":"76e88f3f246d4bf9544448d1a27b06f4"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"6d05ade3ee96191ed73ea019f30c02cceb6fc0502c99f706b7b627158bfc2b0a"},"mac":"b39c2c56b35958c712225970b49238fb230d7981ef47d7c33c730c363b658d06"},"id":"00307b43-53a3-4e03-9d0c-4fcbb3da29df","version":3} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm1.key b/examples/5nodesRTGS/keys/tm1.key new file mode 100644 index 00000000..2f8c9e6a --- /dev/null +++ b/examples/5nodesRTGS/keys/tm1.key @@ -0,0 +1 @@ +{"data":{"bytes":"Wl+xSyXVuuqzpvznOS7dOobhcn4C5auxkFRi7yLtgtA="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm1.pub b/examples/5nodesRTGS/keys/tm1.pub new file mode 100644 index 00000000..e0f51363 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm1.pub @@ -0,0 +1 @@ +BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo= \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm1a.key b/examples/5nodesRTGS/keys/tm1a.key new file mode 100644 index 00000000..59e017cb --- /dev/null +++ b/examples/5nodesRTGS/keys/tm1a.key @@ -0,0 +1 @@ +{"data":{"bytes":"wGEar7J9G0JAgdisp61ZChyrJWeW2QPyKvecjjeVHOY="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm1a.pub b/examples/5nodesRTGS/keys/tm1a.pub new file mode 100644 index 00000000..eae34e2e --- /dev/null +++ b/examples/5nodesRTGS/keys/tm1a.pub @@ -0,0 +1 @@ +8SjRHlUBe4hAmTk3KDeJ96RhN+s10xRrHDrxEi1O5W0= \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm2.key b/examples/5nodesRTGS/keys/tm2.key new file mode 100644 index 00000000..d8c61a29 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm2.key @@ -0,0 +1 @@ +{"data":{"bytes":"nDFwJNHSiT1gNzKBy9WJvMhmYRkW3TzFUmPsNzR6oFk="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm2.pub b/examples/5nodesRTGS/keys/tm2.pub new file mode 100644 index 00000000..b3600dc1 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm2.pub @@ -0,0 +1 @@ +QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc= \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm2a.key b/examples/5nodesRTGS/keys/tm2a.key new file mode 100644 index 00000000..5f17e63f --- /dev/null +++ b/examples/5nodesRTGS/keys/tm2a.key @@ -0,0 +1 @@ +{"data":{"bytes":"rwfJC1kNa8BjPfc+zZXug+it9sdWa0vbdN6pp6IXlAs="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm2a.pub b/examples/5nodesRTGS/keys/tm2a.pub new file mode 100644 index 00000000..ab13763c --- /dev/null +++ b/examples/5nodesRTGS/keys/tm2a.pub @@ -0,0 +1 @@ +2T7xkjblN568N1QmPeElTjoeoNT4tkWYOJYxSMDO5i0= \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm3.key b/examples/5nodesRTGS/keys/tm3.key new file mode 100644 index 00000000..fe537b2a --- /dev/null +++ b/examples/5nodesRTGS/keys/tm3.key @@ -0,0 +1 @@ +{"data":{"bytes":"grQjd3dBp4qFs8/5Jdq7xjz++aUx/LXAqISFyPWaCRw="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm3.pub b/examples/5nodesRTGS/keys/tm3.pub new file mode 100644 index 00000000..887264e1 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm3.pub @@ -0,0 +1 @@ +oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8= \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm3a.key b/examples/5nodesRTGS/keys/tm3a.key new file mode 100644 index 00000000..c1893a3f --- /dev/null +++ b/examples/5nodesRTGS/keys/tm3a.key @@ -0,0 +1 @@ +{"data":{"bytes":"dZAr1f6Nlqe03dj3nBFKE9eSW2Tp66do7edRtKiKrew="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm3a.pub b/examples/5nodesRTGS/keys/tm3a.pub new file mode 100644 index 00000000..073aaed1 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm3a.pub @@ -0,0 +1 @@ +Xtda1lz7BhlawE7i0+irPiS9i9StS3Q0EtQ9/fOvPXw= \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm4.key b/examples/5nodesRTGS/keys/tm4.key new file mode 100644 index 00000000..0ee41782 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm4.key @@ -0,0 +1 @@ +{"data":{"bytes":"W8XcdJfOuxCrLcspSceNg9vh7Cwe8tXiIx5xPJ88OtQ="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm4.pub b/examples/5nodesRTGS/keys/tm4.pub new file mode 100644 index 00000000..4732f172 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm4.pub @@ -0,0 +1 @@ +R56gy4dn24YOjwyesTczYa8m5xhP6hF2uTMCju/1xkY= \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm4a.key b/examples/5nodesRTGS/keys/tm4a.key new file mode 100644 index 00000000..f46f65b8 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm4a.key @@ -0,0 +1 @@ +{"data":{"bytes":"NPUunmb2Z/BKDcZ+6Ve68DdmHxqtn5G998i1o42sNqw="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm4a.pub b/examples/5nodesRTGS/keys/tm4a.pub new file mode 100644 index 00000000..ea91d5e7 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm4a.pub @@ -0,0 +1 @@ +ui8aK5m91usNnp6X7ZHvyRc8MNpn8ge4i2avXmev2VQ= \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm5.key b/examples/5nodesRTGS/keys/tm5.key new file mode 100644 index 00000000..3c3ca784 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm5.key @@ -0,0 +1 @@ +{"data":{"bytes":"N9wH6bG0lWOCJtSnosatAskvzkrDApdrjaWkqjDyDzE="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm5.pub b/examples/5nodesRTGS/keys/tm5.pub new file mode 100644 index 00000000..6d947b8f --- /dev/null +++ b/examples/5nodesRTGS/keys/tm5.pub @@ -0,0 +1 @@ +UfNSeSGySeKg11DVNEnqrUtxYRVor4+CvluI8tVv62Y= \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm5a.key b/examples/5nodesRTGS/keys/tm5a.key new file mode 100644 index 00000000..44085400 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm5a.key @@ -0,0 +1 @@ +{"data":{"bytes":"SemNV0lKNKdUoFyhe0xmLZzVoLUshKvu5OwG2MfbHYM="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/5nodesRTGS/keys/tm5a.pub b/examples/5nodesRTGS/keys/tm5a.pub new file mode 100644 index 00000000..03c18a17 --- /dev/null +++ b/examples/5nodesRTGS/keys/tm5a.pub @@ -0,0 +1 @@ +/7PFjGizIvQGFVggkHaFDcv5nscjLKhPzqq3QIlpKwI= \ No newline at end of file diff --git a/examples/5nodesRTGS/passwords.txt b/examples/5nodesRTGS/passwords.txt new file mode 100644 index 00000000..e69de29b diff --git a/examples/5nodesRTGS/runscript.sh b/examples/5nodesRTGS/runscript.sh new file mode 100644 index 00000000..cf69fe89 --- /dev/null +++ b/examples/5nodesRTGS/runscript.sh @@ -0,0 +1,2 @@ +#!/bin/bash +PRIVATE_CONFIG=tm1.conf geth --exec "loadScript(\"$1\")" attach ipc:qdata/dd1/geth.ipc diff --git a/examples/5nodesRTGS/start.sh b/examples/5nodesRTGS/start.sh new file mode 100644 index 00000000..6c4323ed --- /dev/null +++ b/examples/5nodesRTGS/start.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -u +set -e +NETID=87234 +BOOTNODE_KEYHEX=77bd02ffa26e3fb8f324bda24ae588066f1873d95680104de5bc2db9e7b2e510 +BOOTNODE_ENODE=enode://6433e8fb82c4638a8a6d499d40eb7d8158883219600bfd49acb968e3a37ccced04c964fa87b3a78a2da1b71dc1b90275f4d055720bb67fad4a118a56925125dc@[127.0.0.1]:33445 + +GLOBAL_ARGS="--bootnodes $BOOTNODE_ENODE --networkid $NETID --rpc --rpcaddr 0.0.0.0 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum" + +echo "[*] Starting Constellation nodes" +nohup constellation-node tm1.conf 2>> qdata/logs/constellation1.log & +sleep 10 +nohup constellation-node tm2.conf 2>> qdata/logs/constellation2.log & +nohup constellation-node tm3.conf 2>> qdata/logs/constellation3.log & +nohup constellation-node tm4.conf 2>> qdata/logs/constellation4.log & +nohup constellation-node tm5.conf 2>> qdata/logs/constellation5.log & + +echo "[*] Starting bootnode" +nohup bootnode --nodekeyhex "$BOOTNODE_KEYHEX" --addr="127.0.0.1:33445" 2>>qdata/logs/bootnode.log & +echo "wait for bootnode to start..." +sleep 6 + +echo "[*] Starting node 1: Bank 1" +PRIVATE_CONFIG=tm1.conf nohup geth --datadir qdata/dd1 $GLOBAL_ARGS --rpcport 22000 --port 21000 --unlock 0 --password passwords.txt 2>>qdata/logs/1.log & + +echo "[*] Starting node 2: Bank 2" +PRIVATE_CONFIG=tm2.conf nohup geth --datadir qdata/dd2 $GLOBAL_ARGS --rpcport 22001 --port 21001 --voteaccount "0x0fbdc686b912d7722dc86510934589e0aaf3b55a" --votepassword "" --blockmakeraccount "0xca843569e3427144cead5e4d5999a3d0ccf92b8e" --blockmakerpassword "" --singleblockmaker --minblocktime 2 --maxblocktime 5 2>>qdata/logs/2.log & + +echo "[*] Starting node 3: Bank 3" +PRIVATE_CONFIG=tm3.conf nohup geth --datadir qdata/dd3 $GLOBAL_ARGS --rpcport 22003 --port 21003 --voteaccount "0x9186eb3d20cbd1f5f992a950d808c4495153abd5" --votepassword "" 2>>qdata/logs/3.log & + +echo "[*] Starting node 4: Regulator" +PRIVATE_CONFIG=tm4.conf nohup geth --datadir qdata/dd4 $GLOBAL_ARGS --rpcport 22004 --port 21004 --voteaccount "0x0638e1574728b6d862dd5d3a3e0942c3be47d996" --votepassword "" 2>>qdata/logs/4.log & + +echo "[*] Starting node 5: Observer" +PRIVATE_CONFIG=tm5.conf nohup geth --datadir qdata/dd5 $GLOBAL_ARGS --rpcport 22005 --port 21005 2>>qdata/logs/5.log & + + +echo "All nodes configured. See 'qdata/logs' for logs, and run 'geth attach qdata/dd4/geth.ipc' to attach to the regulator Geth node" diff --git a/examples/5nodesRTGS/stop.sh b/examples/5nodesRTGS/stop.sh new file mode 100644 index 00000000..fa1e0a0d --- /dev/null +++ b/examples/5nodesRTGS/stop.sh @@ -0,0 +1,2 @@ +#!/bin/bash +killall geth bootnode constellation-node diff --git a/examples/5nodesRTGS/tm1.conf b/examples/5nodesRTGS/tm1.conf new file mode 100644 index 00000000..fb1efb99 --- /dev/null +++ b/examples/5nodesRTGS/tm1.conf @@ -0,0 +1,9 @@ +url = "http://127.0.0.1:9000/" +port = 9000 +socketPath = "qdata/tm1.ipc" +otherNodeUrls = [] +publicKeyPath = "keys/tm1.pub" +privateKeyPath = "keys/tm1.key" +archivalPublicKeyPath = "keys/tm1a.pub" +archivalPrivateKeyPath = "keys/tm1a.key" +storagePath = "qdata/constellation1" diff --git a/examples/5nodesRTGS/tm2.conf b/examples/5nodesRTGS/tm2.conf new file mode 100644 index 00000000..e4c15073 --- /dev/null +++ b/examples/5nodesRTGS/tm2.conf @@ -0,0 +1,9 @@ +url = "http://127.0.0.1:9001/" +port = 9001 +socketPath = "qdata/tm2.ipc" +otherNodeUrls = ["http://127.0.0.1:9000/"] +publicKeyPath = "keys/tm2.pub" +privateKeyPath = "keys/tm2.key" +archivalPublicKeyPath = "keys/tm2a.pub" +archivalPrivateKeyPath = "keys/tm2a.key" +storagePath = "qdata/constellation2" diff --git a/examples/5nodesRTGS/tm3.conf b/examples/5nodesRTGS/tm3.conf new file mode 100644 index 00000000..4dca8ba0 --- /dev/null +++ b/examples/5nodesRTGS/tm3.conf @@ -0,0 +1,9 @@ +url = "http://127.0.0.1:9002/" +port = 9002 +socketPath = "qdata/tm3.ipc" +otherNodeUrls = ["http://127.0.0.1:9000/"] +publicKeyPath = "keys/tm3.pub" +privateKeyPath = "keys/tm3.key" +archivalPublicKeyPath = "keys/tm3a.pub" +archivalPrivateKeyPath = "keys/tm3a.key" +storagePath = "qdata/constellation3" diff --git a/examples/5nodesRTGS/tm4.conf b/examples/5nodesRTGS/tm4.conf new file mode 100644 index 00000000..c5c39aca --- /dev/null +++ b/examples/5nodesRTGS/tm4.conf @@ -0,0 +1,9 @@ +url = "http://127.0.0.1:9003/" +port = 9003 +socketPath = "qdata/tm4.ipc" +otherNodeUrls = ["http://127.0.0.1:9000/"] +publicKeyPath = "keys/tm4.pub" +privateKeyPath = "keys/tm4.key" +archivalPublicKeyPath = "keys/tm4a.pub" +archivalPrivateKeyPath = "keys/tm4a.key" +storagePath = "qdata/constellation4" diff --git a/examples/5nodesRTGS/tm5.conf b/examples/5nodesRTGS/tm5.conf new file mode 100644 index 00000000..91420465 --- /dev/null +++ b/examples/5nodesRTGS/tm5.conf @@ -0,0 +1,9 @@ +url = "http://127.0.0.1:9004/" +port = 9004 +socketPath = "qdata/tm5.ipc" +otherNodeUrls = ["http://127.0.0.1:9000/"] +publicKeyPath = "keys/tm5.pub" +privateKeyPath = "keys/tm5.key" +archivalPublicKeyPath = "keys/tm5a.pub" +archivalPrivateKeyPath = "keys/tm5a.key" +storagePath = "qdata/constellation5" From 80c898afbad20c21ffb485aaba499c617119eca6 Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Fri, 26 May 2017 16:05:24 -0300 Subject: [PATCH 02/31] Edited 5nodesRTGS README --- README.md | 1 + examples/5nodesRTGS/README.md | 236 ++++++++++++++++++++++++---------- 2 files changed, 172 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index da78c186..2f8b79ce 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ This repository contains setup examples for Quorum. Current examples include: * [7nodes](https://github.com/jpmorganchase/quorum-examples/tree/master/examples/7nodes): Starts up a fully-functioning Quorum environment consisting of 7 independent nodes with a mix of block makers, voters, and unprivileged nodes. From this example one can test consensus, privacy, and all the expected functionality of an Ethereum platform. * [permissions](https://github.com/jpmorganchase/quorum-examples/tree/master/examples/permissions): Focuses on how to add, remove, and update the list of nodes permitted to participate in the network. +* [5nodesRTGS](https://github.com/jpmorganchase/quorum-examples/tree/master/examples/5nodesRTGS): Starts up a set of 5 nodes that simulates a Real-time Gross Setlement environment with 3 banks, one regulator (typically a central bank) and an observer that cannot access the private data. The easiest way to get started with running the examples is to use the vagrant environment (see below). diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 5715dfcc..99fb5784 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -1,4 +1,4 @@ -# 7 nodes +# 5 nodes Real-time Gross Setlement This example configures 7 nodes, each with their own PrivateTransactionManager. Usage: @@ -6,72 +6,178 @@ This example configures 7 nodes, each with their own PrivateTransactionManager. - `start.sh`: Launch `constellation` and `geth` nodes, then send a private transaction - `stop.sh`: Stop all `constellation` and `geth` nodes -There are corresponding commands for running in Raft mode (`stop.sh` stays the same). +All logs and temporary data will be written to the `qdata` folder. - - `raft-init.sh` - - `raft-start.sh` +## The blockchain Real-time Gross Setlement (RTGS) problem +RTGS systems are very dependent of a central entity, but this design creates a single point of failure. Backup datacenters can help but do not solve the problem completely as there is no real distributed resiliency when using only backup infrastructures. The distributed consensus nature of the blockchain technology can be used to overcome this central point of failure, but at a great privacy cost as all stored data are fully accessible to all network members by default, and this kind of transparency is not allowed in a real bank interpayment network. Quorum privacy properties were used to overcome this problem when implementing a blockchain RTGS system. This example uses Quorum private and public smart contract communication. -All logs and temporary data will be written to the `qdata` folder. +## Smart contracts +There are two smart contracts in this example, both stored in the contracts.sol file and lightly commented: +1- bankContract +This contract implements the main logic of the RTGS system. One PRIVATE instance of the contract must be deployed for EACH participating bank on the network and it will store private transaction data and balance. It has many verification steps to avoid bank personification, fraud and overdraft transactions. Most of the checks are made by the contract itself, but the overdraft protection must be made by an active regulator node. +2- regulatorTransactionList +This contract stores and serves the public data to the private contracts. Examples of the public data are transactions hashes and participating banks information. + +## Transaction confirmation logic +Transactions are published privately by the sender bank and must only be sent to the recipient and to the regulator nodes (privateFor parameter). They are created in an UNCONFIRMED state and are only final if they are confirmed. After publishing the private transaction, the sender bank must publish the same transaction hash in the public transaction log (regulatorTransactionList public contract) to ensure that all the parts are aware of the transaction. Transactions can only be confirmed and reflect on bank balances if they are stored in the public transaction log and they can be confirmed by two ways: +1- By the regulator calling the confirmTransactionRegulator function +2- By the sender bank calling confirmTransactionBank function. This function ensures that the confirmation timer has expired before confirming the transaction. +This two phase commit is needed because there is no overdraft protecting in the bankContract code because different bank instances have different data. For example, bank1 smart contract published in the bank1 node has the balance variable set, but the same contract with the same address in the bank2 node has no value in the balance data because this data is private to bank1 and the regulator. The regulator node´s contracts have all the data as it must be part of every private transaction. The logic behind this proccess is that, after a transaction is published, the regulator can check the sender balance against the newly published transaction. If the value intended for the transfer is higher than the bank balance, the regulator must block this transaction during the confirmation time. If the value is below the balance OR if the regulator is offline, the sender bank can confirm its own transaction after the confirmation time. This is a resiliency feature to ensure that the RTGS system endures a regulator outage. + +##Environment setup +1- call init.sh to initialize accounts and keystores + +2- Bring the 5 nodes up calling start.sh + +3- Connect to the nodes calling: +terminal 1: ``$ geth attach ipc:qdata/dd1/geth.ipc`` +terminal 2: ``$ geth attach ipc:qdata/dd2/geth.ipc`` +terminal 3: ``$ geth attach ipc:qdata/dd3/geth.ipc`` +terminal 4: ``$ geth attach ipc:qdata/dd4/geth.ipc`` +terminal 5: ``$ geth attach ipc:qdata/dd5/geth.ipc`` + +Terminal 1-3 are banks 1-3, terminal 4 is the regulator and terminal 5 is the observer used to test privacy. + +4- Run the following command three times in the javascript quorum console on terminal 4 (regulator): ``loadScript("deploy-bankContract-0-3-6.js");``. The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82. +4.1- If you receive an error 500, wait for the constellation nodes to know their peers. In my low end lab it can take a while (some minutes). + +5- Take note of the 3 bank contract addresses. These are bank1, bank2 and bank3 private contracts instances addresses. + +6- Run the following command one time in the javascript console on terminal 4 (regulator): ``loadScript("deploy-regulatorTransactionList-0-3-6.js");`` + +7- Take note of the contract address. It is the public transaction log contract address. + +8- Run the following script in each of the five javascript quorum consoles (all terminals). Change the first 4 lines using the addresses written before. The addresses must be between double quotes (I.e. "0x937540f5002fd57b0111e049f2da603fcaec78b8"). + +`` +var addresstr = +var address1 = +var address2 = +var address3 = + +var abi = [{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] + +var abitr = [{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionExistance","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_contract","type":"address"},{"name":"_sender","type":"address"}],"name":"addBank","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"blockBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankExistance","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionTimestamp","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankSender","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"exists","type":"bool"},{"name":"timestamp","type":"uint256"},{"name":"blocked","type":"bool"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"authorizeBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"banks","outputs":[{"name":"name","type":"string"},{"name":"authorized","type":"bool"},{"name":"exists","type":"bool"},{"name":"authorizedSender","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankState","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"addTransaction","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"unblockTransaction","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionState","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"blockTransaction","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] + +var contracttr=eth.contract(abitr).at(addresstr) + +var contract1=eth.contract(abi).at(address1) + +var contract2=eth.contract(abi).at(address2) + +var contract3=eth.contract(abi).at(address3) + +var bank1="0xed9d02e382b34818e88b88a309c7fe71e65f419d" +var bank2="0xca843569e3427144cead5e4d5999a3d0ccf92b8e" +var bank3="0x9186eb3d20cbd1f5f992a950d808c4495153abd5" +var regulator="0x0638e1574728b6d862dd5d3a3e0942c3be47d996" + +contract1.balance() +contract2.balance() +contract3.balance() +`` + +9- You should see "0" as return to all contract balances calls on every node. It is fine, the contracts are still empty. + +10- Run the script below ONLY on regulator node (node 4), it will initialize all the basic data in all contracts like the public transaction log address, who is the regulator node, etc. + +`` +var bank1InitialBalance=10000; +var bank2InitialBalance=20000; +var bank3InitialBalance=30000; + +contract1.setTransactionListAddress(addresstr,{from:eth.coinbase,privateFor:["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="]}); +contract2.setTransactionListAddress(addresstr,{from:eth.coinbase,privateFor:["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="]}); +contract3.setTransactionListAddress(addresstr,{from:eth.coinbase,privateFor:["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="]}); + +contract1.setBalance(bank1InitialBalance,{from:eth.coinbase,privateFor:["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo="]}); +contract2.setBalance(bank2InitialBalance,{from:eth.coinbase,privateFor:["QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="]}); +contract3.setBalance(bank3InitialBalance,{from:eth.coinbase,privateFor:["oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="]}); + +contract1.setRegulatorNode({from:eth.coinbase,privateFor:["UfNSeSGySeKg11DVNEnqrUtxYRVor4+CvluI8tVv62Y="]}); +contract2.setRegulatorNode({from:eth.coinbase,privateFor:["UfNSeSGySeKg11DVNEnqrUtxYRVor4+CvluI8tVv62Y="]}); +contract3.setRegulatorNode({from:eth.coinbase,privateFor:["UfNSeSGySeKg11DVNEnqrUtxYRVor4+CvluI8tVv62Y="]}); + +contract1.setThisBankContract(contract1.address,{from:eth.coinbase,privateFor:["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo="]}); +contract2.setThisBankContract(contract1.address,{from:eth.coinbase,privateFor:["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo="]}); +contract3.setThisBankContract(contract1.address,{from:eth.coinbase,privateFor:["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo="]}); + +contract1.setThisBankContract(contract2.address,{from:eth.coinbase,privateFor:["QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="]}); +contract2.setThisBankContract(contract2.address,{from:eth.coinbase,privateFor:["QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="]}); +contract3.setThisBankContract(contract2.address,{from:eth.coinbase,privateFor:["QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="]}); + +contract1.setThisBankContract(contract3.address,{from:eth.coinbase,privateFor:["oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="]}); +contract2.setThisBankContract(contract3.address,{from:eth.coinbase,privateFor:["oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="]}); +contract3.setThisBankContract(contract3.address,{from:eth.coinbase,privateFor:["oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="]}); + +contracttr.addBank("Bank1",contract1.address,bank1,{from:eth.coinbase}); +contracttr.addBank("Bank2",contract2.address,bank2,{from:eth.coinbase}); +contracttr.addBank("Bank3",contract3.address,bank3,{from:eth.coinbase}); +`` ## Testing Privacy -You can run the 7node example to test the privacy features of Quorum. As described in the Quick Start section of the [README](https://github.com/jpmorganchase/quorum), the final step of the 7node `start.sh` script was the sending of a private transaction to generate a (private) smart contract (SimpleStorage) sent from node 1 "for" node 7 (denoted by the public key passed via privateFor: ["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="] in the sendTransaction call). We'll begin by demonstrating only nodes 1 and 7 are able to view the initial state of the contract. Next we have node 1 update the state of this contract and again verify only nodes 1 and 7 are able to see the updated state of the contract after the block containing the update transaction is validated by the network. - -For this test it is recommended to use separate terminal windows running geth JavaScript console attached to node 1, node 7, and any node 2-6 (in our example we'll choose node 4). - -In each terminal, ensure you are in the 7nodes dir before running the below. - -* If you aren't already running the 7nodes example, in terminal 1 run ``$ ./init.sh `` followed by ``$ ./start.sh `` -* In terminal 1 run ``$ geth attach ipc:qdata/dd1/geth.ipc`` -* In terminal 2 run ``$ geth attach ipc:qdata/dd4/geth.ipc`` -* In terminal 3 run ``$ geth attach ipc:qdata/dd7/geth.ipc`` - -For each of the 3 nodes we'll use the built-in JavaScript by setting the variable ```address``` assigned to the simpleStorage contract address created by the node 1. The address can be found in the node 1's log file 7nodes/qdata/logs/1.log, or alternatively by reading the `contractAddress` param after calling `eth.getTransactionReceipt(txHash)` ([Ethereum API documentation](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactionreceipt)), passing in the transaction hash that was logged in the console that you ran the 7nodes example in. Replace the address below with the address value found in the 1.log file: -``` -> var address = "0x1932c48b2bf8102ba33b4a6b545c32236e342f34"; -``` -Next we'll use ```eth.contract``` to define a contract class with the simpleStorage ABI definition as follows: -``` -> var abi = [{"constant":true,"inputs":[],"name":"storedData","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"initVal","type":"uint256"}],"type":"constructor"}]; -> var private = eth.contract(abi).at(address) -``` -The function calls are now available on the contract instance and you can call those methods on the contract. Let's start by examining the initial value of the contract to make sure that only nodes 1 and 7 can see the initialized value. -* In terminal window 1 (node 1) -``` -> private.get() -42 -``` -* In terminal window 2 (node 4) -``` -> private.get() -0 -``` -* In terminal window 3 (node 7) -``` -> private.get() -42 -``` - -So we now see nodes 1 and 7 are able to read the state of the private contract and it's initial value is 42. Node 4 is unable to read the state. Next we'll have node 1 set the state to the value `4` and verify only nodes 1 and 7 are able to view the new state. - -In terminal window 1 (node 1) -``` -> private.set(4,{from:eth.coinbase,privateFor:["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="]}); -"0xacf293b491cccd1b99d0cfb08464a68791cc7b5bc14a9b6e4ff44b46889a8f70" -``` -You can check the log files in ~7nodes/qdata/logs directory to see each node validating the block with this new private transaction. Once the block containing the transaction has been validated we can once again check the state from each node 1, 4, and 7. -* In terminal window 1 (node 1) -``` -> private.get() -4 -``` -* In terminal window 2 (node 4) -``` -> private.get() + +1- Run the script below on every terminal. +``contract1.balance() +contract2.balance() +contract3.balance()`` + +2- Terminals 1-3 should only have its respective bank balance, i.e., terminal 1 output must be: +``contract1.balance() +10000 +contract2.balance() 0 -``` -* In terminal window 3 (node 7) -``` -> private.get() -4 -``` -And there you have it. All 7 nodes are validating the same blockchain of transactions, the private transactions carrying nothing other than a 512 bit hash, and only parties to private transactions are able to view and update the state of private contracts. +contract3.balance() +0`` + +Terminal 4 (regulator) output must be: +``contract1.balance() +10000 +contract2.balance() +20000 +contract3.balance() +30000`` + +## Testing transactions confirmed by the regulator +Testing a transaction where bank1 sends 10 to bank2: +1- Issue the command below on terminal 1: +''contract1.sendValue(address2,10,"random1",{from:eth.coinbase,gas:500000,privateFor:["R56gy4dn24YOjwyesTczYa8m5xhP6hF2uTMCju/1xkY=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="]});'' + +2- Wait until this transaction is mined. After some seconds, you should see a non zero hash after issuing: ``contract1.transactionIDs(0)`` on terminal 1. + +3- Write the transaction hash to the public transaction log issuing ``contracttr.addTransaction(contract1.transactionIDs(0),{from:eth.coinbase,gas:500000});`` on terminal 1. + +4- Check that only bank1, bank2 and the regulator can see the private transaction data issuing ``contract1.transactionIDs(0)`` on all terminals. Bank3 and observer nodes have no private data of this transaction. + +5- Check that the public transaction data is available to all nodes issuing contracttr.transactions(contract1.transactionIDs(0)) on all nodes. They all have knowledge of the existance of a transaction with this hash, but have no access to the private data. + +6- The regulator transaction confirmation: Issue the command below in the regulator node (terminal 4): +``contract1.confirmTransactionRegulator(contract1.transactionIDs(0),{from:eth.coinbase,gas:500000,privateFor:["QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo="]});`` + +7- Check that the balances of bank1 and bank2 are updated privately by inter private contracts function calls. +``contract1.balance()`` +``contract2.balance()`` + +## Testing transactions confirmed by the sender bank +1- Repeat steps 1-5 above. Remember that the index of the transaction is updated, so commands like ``contract1.transactionIDs(0)`` must be changed to ``contract1.transactionIDs(1)``. + +2- Wait at least the confirmation time seconds (default 60); + +3- The bank self-confirmation: Issue the command below in the sender bank node (terminal 1). Remember to update the transactionID index as needed. +``contract1.confirmTransactionBank(contract1.transactionIDs(1),{from:eth.coinbase,gas:500000,privateFor:["R56gy4dn24YOjwyesTczYa8m5xhP6hF2uTMCju/1xkY=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="]});`` + +## Testing transactions blocking +1- Repeat steps 1-5 of the "Testing transactions confirmed by the regulator" steps. Remember that the index of the transaction is updated, so commands like ``contract1.transactionIDs(1)`` must be changed to ``contract1.transactionIDs(2)``. + +2- Block the transaction issuing the command below in the regulator node (terminal 4): +``contracttr.blockTransaction(contract1.transactionIDs(2),{from:eth.coinbase,gas:500000});`` + +3- Try to confirm the transaction, either by the sender bank after confirmation time or by the regulator. It must not work. + +4- Unblock the transaction issuing the command below in the regulator node (terminal 4): +``contracttr.unblockTransaction(contract1.transactionIDs(2),{from:eth.coinbase,gas:500000});`` + +5- Now the transaction can be confirmed. + +## Other functions +Banks can be blocked entirely using the blockBank function in the regulatorTransactionList contract. From 5c3cc712f5728891c9bb9cb7ebe630842d837285 Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Fri, 26 May 2017 16:09:42 -0300 Subject: [PATCH 03/31] Edited 5nodesRTGS README --- examples/5nodesRTGS/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 99fb5784..349dca39 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -31,14 +31,20 @@ This two phase commit is needed because there is no overdraft protecting in the 3- Connect to the nodes calling: terminal 1: ``$ geth attach ipc:qdata/dd1/geth.ipc`` + terminal 2: ``$ geth attach ipc:qdata/dd2/geth.ipc`` + terminal 3: ``$ geth attach ipc:qdata/dd3/geth.ipc`` + terminal 4: ``$ geth attach ipc:qdata/dd4/geth.ipc`` + terminal 5: ``$ geth attach ipc:qdata/dd5/geth.ipc`` Terminal 1-3 are banks 1-3, terminal 4 is the regulator and terminal 5 is the observer used to test privacy. -4- Run the following command three times in the javascript quorum console on terminal 4 (regulator): ``loadScript("deploy-bankContract-0-3-6.js");``. The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82. +4- Run the following command three times in the javascript quorum console on terminal 4 (regulator): +``loadScript("deploy-bankContract-0-3-6.js");`` +The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82. 4.1- If you receive an error 500, wait for the constellation nodes to know their peers. In my low end lab it can take a while (some minutes). 5- Take note of the 3 bank contract addresses. These are bank1, bank2 and bank3 private contracts instances addresses. From c6240525853c5297e22dc05bf40e7dfed74b7243 Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Fri, 26 May 2017 16:11:13 -0300 Subject: [PATCH 04/31] Edited 5nodesRTGS README --- examples/5nodesRTGS/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 349dca39..ba992eb1 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -30,6 +30,7 @@ This two phase commit is needed because there is no overdraft protecting in the 2- Bring the 5 nodes up calling start.sh 3- Connect to the nodes calling: + terminal 1: ``$ geth attach ipc:qdata/dd1/geth.ipc`` terminal 2: ``$ geth attach ipc:qdata/dd2/geth.ipc`` @@ -44,6 +45,7 @@ Terminal 1-3 are banks 1-3, terminal 4 is the regulator and terminal 5 is the ob 4- Run the following command three times in the javascript quorum console on terminal 4 (regulator): ``loadScript("deploy-bankContract-0-3-6.js");`` + The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82. 4.1- If you receive an error 500, wait for the constellation nodes to know their peers. In my low end lab it can take a while (some minutes). @@ -55,11 +57,10 @@ The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82 8- Run the following script in each of the five javascript quorum consoles (all terminals). Change the first 4 lines using the addresses written before. The addresses must be between double quotes (I.e. "0x937540f5002fd57b0111e049f2da603fcaec78b8"). -`` -var addresstr = -var address1 = -var address2 = -var address3 = +``var addresstr = `` +``var address1 = `` +``var address2 = `` +``var address3 = `` var abi = [{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] From 432b7fd9a24164beadebe1c1e3403d3ca0b3b17c Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Fri, 26 May 2017 16:12:46 -0300 Subject: [PATCH 05/31] Edited 5nodesRTGS README --- examples/5nodesRTGS/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index ba992eb1..563f823f 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -57,10 +57,10 @@ The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82 8- Run the following script in each of the five javascript quorum consoles (all terminals). Change the first 4 lines using the addresses written before. The addresses must be between double quotes (I.e. "0x937540f5002fd57b0111e049f2da603fcaec78b8"). -``var addresstr = `` -``var address1 = `` -``var address2 = `` -``var address3 = `` +```var addresstr = +var address1 = +var address2 = +var address3 = ``` var abi = [{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] From 6ecb904f85b9e54bb62358fdeab65f2eba8d4ce6 Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Fri, 26 May 2017 16:14:17 -0300 Subject: [PATCH 06/31] Edited 5nodesRTGS README --- examples/5nodesRTGS/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 563f823f..e3067925 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -57,10 +57,12 @@ The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82 8- Run the following script in each of the five javascript quorum consoles (all terminals). Change the first 4 lines using the addresses written before. The addresses must be between double quotes (I.e. "0x937540f5002fd57b0111e049f2da603fcaec78b8"). -```var addresstr = +``` +var addresstr = var address1 = var address2 = -var address3 = ``` +var address3 = +``` var abi = [{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] From d6c96d3c32f213157327448a3d725083b8d352af Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Fri, 26 May 2017 16:16:51 -0300 Subject: [PATCH 07/31] Edited 5nodesRTGS README --- examples/5nodesRTGS/README.md | 47 ++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index e3067925..267c7432 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -62,7 +62,6 @@ var addresstr = var address1 = var address2 = var address3 = -``` var abi = [{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] @@ -84,13 +83,13 @@ var regulator="0x0638e1574728b6d862dd5d3a3e0942c3be47d996" contract1.balance() contract2.balance() contract3.balance() -`` +``` 9- You should see "0" as return to all contract balances calls on every node. It is fine, the contracts are still empty. 10- Run the script below ONLY on regulator node (node 4), it will initialize all the basic data in all contracts like the public transaction log address, who is the regulator node, etc. -`` +``` var bank1InitialBalance=10000; var bank2InitialBalance=20000; var bank3InitialBalance=30000; @@ -122,30 +121,36 @@ contract3.setThisBankContract(contract3.address,{from:eth.coinbase,privateFor:[" contracttr.addBank("Bank1",contract1.address,bank1,{from:eth.coinbase}); contracttr.addBank("Bank2",contract2.address,bank2,{from:eth.coinbase}); contracttr.addBank("Bank3",contract3.address,bank3,{from:eth.coinbase}); -`` +``` ## Testing Privacy 1- Run the script below on every terminal. -``contract1.balance() +``` +contract1.balance() contract2.balance() -contract3.balance()`` +contract3.balance() +``` 2- Terminals 1-3 should only have its respective bank balance, i.e., terminal 1 output must be: -``contract1.balance() -10000 -contract2.balance() -0 -contract3.balance() -0`` +``` +> contract1.balance() +> 10000 +> contract2.balance() +> 0 +> contract3.balance() +> 0 +``` Terminal 4 (regulator) output must be: -``contract1.balance() -10000 -contract2.balance() -20000 -contract3.balance() -30000`` +``` +> contract1.balance() +> 10000 +> contract2.balance() +> 20000 +> contract3.balance() +> 30000 +``` ## Testing transactions confirmed by the regulator Testing a transaction where bank1 sends 10 to bank2: @@ -164,8 +169,10 @@ Testing a transaction where bank1 sends 10 to bank2: ``contract1.confirmTransactionRegulator(contract1.transactionIDs(0),{from:eth.coinbase,gas:500000,privateFor:["QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo="]});`` 7- Check that the balances of bank1 and bank2 are updated privately by inter private contracts function calls. -``contract1.balance()`` -``contract2.balance()`` +``` +contract1.balance() +contract2.balance() +``` ## Testing transactions confirmed by the sender bank 1- Repeat steps 1-5 above. Remember that the index of the transaction is updated, so commands like ``contract1.transactionIDs(0)`` must be changed to ``contract1.transactionIDs(1)``. From 1a2f63c293b8fdc921b47b7557e446450fe154c8 Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Fri, 26 May 2017 18:09:59 -0300 Subject: [PATCH 08/31] Edited 5nodesRTGS README --- examples/5nodesRTGS/README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 267c7432..fd9f221f 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -13,15 +13,22 @@ RTGS systems are very dependent of a central entity, but this design creates a s ## Smart contracts There are two smart contracts in this example, both stored in the contracts.sol file and lightly commented: + 1- bankContract + This contract implements the main logic of the RTGS system. One PRIVATE instance of the contract must be deployed for EACH participating bank on the network and it will store private transaction data and balance. It has many verification steps to avoid bank personification, fraud and overdraft transactions. Most of the checks are made by the contract itself, but the overdraft protection must be made by an active regulator node. + 2- regulatorTransactionList + This contract stores and serves the public data to the private contracts. Examples of the public data are transactions hashes and participating banks information. ## Transaction confirmation logic Transactions are published privately by the sender bank and must only be sent to the recipient and to the regulator nodes (privateFor parameter). They are created in an UNCONFIRMED state and are only final if they are confirmed. After publishing the private transaction, the sender bank must publish the same transaction hash in the public transaction log (regulatorTransactionList public contract) to ensure that all the parts are aware of the transaction. Transactions can only be confirmed and reflect on bank balances if they are stored in the public transaction log and they can be confirmed by two ways: + 1- By the regulator calling the confirmTransactionRegulator function + 2- By the sender bank calling confirmTransactionBank function. This function ensures that the confirmation timer has expired before confirming the transaction. + This two phase commit is needed because there is no overdraft protecting in the bankContract code because different bank instances have different data. For example, bank1 smart contract published in the bank1 node has the balance variable set, but the same contract with the same address in the bank2 node has no value in the balance data because this data is private to bank1 and the regulator. The regulator node´s contracts have all the data as it must be part of every private transaction. The logic behind this proccess is that, after a transaction is published, the regulator can check the sender balance against the newly published transaction. If the value intended for the transfer is higher than the bank balance, the regulator must block this transaction during the confirmation time. If the value is below the balance OR if the regulator is offline, the sender bank can confirm its own transaction after the confirmation time. This is a resiliency feature to ensure that the RTGS system endures a regulator outage. ##Environment setup @@ -47,7 +54,8 @@ Terminal 1-3 are banks 1-3, terminal 4 is the regulator and terminal 5 is the ob ``loadScript("deploy-bankContract-0-3-6.js");`` The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82. -4.1- If you receive an error 500, wait for the constellation nodes to know their peers. In my low end lab it can take a while (some minutes). + +4.1- If you receive an error like "Error: Non-200 status code: &{Status:500 Internal Server Error", wait for the constellation nodes to know their peers. In my low end lab it can take a while (some minutes). 5- Take note of the 3 bank contract addresses. These are bank1, bank2 and bank3 private contracts instances addresses. @@ -155,7 +163,7 @@ Terminal 4 (regulator) output must be: ## Testing transactions confirmed by the regulator Testing a transaction where bank1 sends 10 to bank2: 1- Issue the command below on terminal 1: -''contract1.sendValue(address2,10,"random1",{from:eth.coinbase,gas:500000,privateFor:["R56gy4dn24YOjwyesTczYa8m5xhP6hF2uTMCju/1xkY=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="]});'' +``contract1.sendValue(address2,10,"random1",{from:eth.coinbase,gas:500000,privateFor:["R56gy4dn24YOjwyesTczYa8m5xhP6hF2uTMCju/1xkY=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="]});`` 2- Wait until this transaction is mined. After some seconds, you should see a non zero hash after issuing: ``contract1.transactionIDs(0)`` on terminal 1. @@ -163,7 +171,7 @@ Testing a transaction where bank1 sends 10 to bank2: 4- Check that only bank1, bank2 and the regulator can see the private transaction data issuing ``contract1.transactionIDs(0)`` on all terminals. Bank3 and observer nodes have no private data of this transaction. -5- Check that the public transaction data is available to all nodes issuing contracttr.transactions(contract1.transactionIDs(0)) on all nodes. They all have knowledge of the existance of a transaction with this hash, but have no access to the private data. +5- Check that the public transaction data is available to all nodes issuing ``contracttr.transactions(contract1.transactionIDs(0))`` on all nodes. They all have knowledge of the existance of a transaction with this hash, but have no access to the private data. 6- The regulator transaction confirmation: Issue the command below in the regulator node (terminal 4): ``contract1.confirmTransactionRegulator(contract1.transactionIDs(0),{from:eth.coinbase,gas:500000,privateFor:["QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo="]});`` From f72fdcc803ec2d901128967069b3cf8d7fe652a0 Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Fri, 26 May 2017 18:12:59 -0300 Subject: [PATCH 09/31] Edited 5nodesRTGS README --- examples/5nodesRTGS/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index fd9f221f..1f61e86f 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -53,7 +53,7 @@ Terminal 1-3 are banks 1-3, terminal 4 is the regulator and terminal 5 is the ob 4- Run the following command three times in the javascript quorum console on terminal 4 (regulator): ``loadScript("deploy-bankContract-0-3-6.js");`` -The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82. +The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82 (https://github.com/jpmorganchase/quorum/issues/82). 4.1- If you receive an error like "Error: Non-200 status code: &{Status:500 Internal Server Error", wait for the constellation nodes to know their peers. In my low end lab it can take a while (some minutes). From 8b33dfdfb87cb8fe0c5a144ef3d3edaa5aa64efe Mon Sep 17 00:00:00 2001 From: Tyrone Lobban Date: Fri, 14 Jul 2017 13:56:08 +0100 Subject: [PATCH 10/31] Update README.md given that this will not be merged into jpmorganchase repo, users should run the 5Nodes RTGS example from this repo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2f8b79ce..97010cf5 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This repository contains setup examples for Quorum. Current examples include: * [7nodes](https://github.com/jpmorganchase/quorum-examples/tree/master/examples/7nodes): Starts up a fully-functioning Quorum environment consisting of 7 independent nodes with a mix of block makers, voters, and unprivileged nodes. From this example one can test consensus, privacy, and all the expected functionality of an Ethereum platform. * [permissions](https://github.com/jpmorganchase/quorum-examples/tree/master/examples/permissions): Focuses on how to add, remove, and update the list of nodes permitted to participate in the network. -* [5nodesRTGS](https://github.com/jpmorganchase/quorum-examples/tree/master/examples/5nodesRTGS): Starts up a set of 5 nodes that simulates a Real-time Gross Setlement environment with 3 banks, one regulator (typically a central bank) and an observer that cannot access the private data. +* [5nodesRTGS](https://github.com/rsarres/quorum-examples/tree/master/examples/5nodesRTGS): Starts up a set of 5 nodes that simulates a Real-time Gross Setlement environment with 3 banks, one regulator (typically a central bank) and an observer that cannot access the private data. The easiest way to get started with running the examples is to use the vagrant environment (see below). @@ -28,7 +28,7 @@ Quorum examples. ### Running ```sh -git clone https://github.com/jpmorganchase/quorum-examples +git clone https://github.com/rsarres/quorum-examples cd quorum-examples vagrant up # (should take 5 or so minutes) From da4c3e99138a9b538b12c0d552736cf7f461bf8a Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Mon, 24 Jul 2017 15:20:22 -0300 Subject: [PATCH 11/31] 5nodesRTGS README.md update --- examples/5nodesRTGS/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 1f61e86f..f6bed4eb 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -1,6 +1,6 @@ # 5 nodes Real-time Gross Setlement -This example configures 7 nodes, each with their own PrivateTransactionManager. Usage: +This example configures 5 nodes, each with their own PrivateTransactionManager. Usage: - `init.sh`: Initialize accounts and keystores - `start.sh`: Launch `constellation` and `geth` nodes, then send a private transaction From aba5ca3ca65d937d4267310a62fbb5a8970125f5 Mon Sep 17 00:00:00 2001 From: Rafael Sarres de Almeida Date: Thu, 31 Aug 2017 12:16:39 -0300 Subject: [PATCH 12/31] Examples cleanup and README update --- README.md | 16 +- examples/7nodes/.gitignore | 2 - examples/7nodes/README.md | 77 -------- examples/7nodes/bench-private-async.sh | 13 -- examples/7nodes/bench-private-sync.sh | 13 -- examples/7nodes/bench-public-sync.sh | 13 -- examples/7nodes/genesis.json | 47 ----- examples/7nodes/init.sh | 40 ---- examples/7nodes/keys/key1 | 1 - examples/7nodes/keys/key2 | 1 - examples/7nodes/keys/key3 | 1 - examples/7nodes/keys/key4 | 1 - examples/7nodes/keys/key5 | 1 - examples/7nodes/keys/tm1.key | 1 - examples/7nodes/keys/tm1.pub | 1 - examples/7nodes/keys/tm1a.key | 1 - examples/7nodes/keys/tm1a.pub | 1 - examples/7nodes/keys/tm2.key | 1 - examples/7nodes/keys/tm2.pub | 1 - examples/7nodes/keys/tm2a.key | 1 - examples/7nodes/keys/tm2a.pub | 1 - examples/7nodes/keys/tm3.key | 1 - examples/7nodes/keys/tm3.pub | 1 - examples/7nodes/keys/tm3a.key | 1 - examples/7nodes/keys/tm3a.pub | 1 - examples/7nodes/keys/tm4.key | 1 - examples/7nodes/keys/tm4.pub | 1 - examples/7nodes/keys/tm4a.key | 1 - examples/7nodes/keys/tm4a.pub | 1 - examples/7nodes/keys/tm5.key | 1 - examples/7nodes/keys/tm5.pub | 1 - examples/7nodes/keys/tm5a.key | 1 - examples/7nodes/keys/tm5a.pub | 1 - examples/7nodes/keys/tm6.key | 1 - examples/7nodes/keys/tm6.pub | 1 - examples/7nodes/keys/tm6a.key | 1 - examples/7nodes/keys/tm6a.pub | 1 - examples/7nodes/keys/tm7.key | 1 - examples/7nodes/keys/tm7.pub | 1 - examples/7nodes/keys/tm7a.key | 1 - examples/7nodes/keys/tm7a.pub | 1 - examples/7nodes/passwords.txt | 0 examples/7nodes/raft-init.sh | 54 ------ examples/7nodes/raft-start.sh | 45 ----- examples/7nodes/raft/nodekey1 | 1 - examples/7nodes/raft/nodekey2 | 1 - examples/7nodes/raft/nodekey3 | 1 - examples/7nodes/raft/nodekey4 | 1 - examples/7nodes/raft/nodekey5 | 1 - examples/7nodes/raft/nodekey6 | 1 - examples/7nodes/raft/nodekey7 | 1 - examples/7nodes/raft/static-nodes.json | 9 - examples/7nodes/runscript.sh | 2 - examples/7nodes/script1.js | 19 -- examples/7nodes/send-private-async.lua | 3 - examples/7nodes/send-private-sync.lua | 3 - examples/7nodes/send-public-sync.lua | 3 - examples/7nodes/start.sh | 51 ----- examples/7nodes/stop.sh | 2 - examples/7nodes/tm1.conf | 9 - examples/7nodes/tm2.conf | 9 - examples/7nodes/tm3.conf | 9 - examples/7nodes/tm4.conf | 9 - examples/7nodes/tm5.conf | 9 - examples/7nodes/tm6.conf | 9 - examples/7nodes/tm7.conf | 9 - examples/permissions/README.md | 139 -------------- examples/permissions/run_nodes.sh | 251 ------------------------- examples/permissions/stop.sh | 4 - 69 files changed, 8 insertions(+), 901 deletions(-) delete mode 100644 examples/7nodes/.gitignore delete mode 100644 examples/7nodes/README.md delete mode 100755 examples/7nodes/bench-private-async.sh delete mode 100755 examples/7nodes/bench-private-sync.sh delete mode 100755 examples/7nodes/bench-public-sync.sh delete mode 100644 examples/7nodes/genesis.json delete mode 100755 examples/7nodes/init.sh delete mode 100644 examples/7nodes/keys/key1 delete mode 100644 examples/7nodes/keys/key2 delete mode 100644 examples/7nodes/keys/key3 delete mode 100644 examples/7nodes/keys/key4 delete mode 100644 examples/7nodes/keys/key5 delete mode 100644 examples/7nodes/keys/tm1.key delete mode 100644 examples/7nodes/keys/tm1.pub delete mode 100644 examples/7nodes/keys/tm1a.key delete mode 100644 examples/7nodes/keys/tm1a.pub delete mode 100644 examples/7nodes/keys/tm2.key delete mode 100644 examples/7nodes/keys/tm2.pub delete mode 100644 examples/7nodes/keys/tm2a.key delete mode 100644 examples/7nodes/keys/tm2a.pub delete mode 100644 examples/7nodes/keys/tm3.key delete mode 100644 examples/7nodes/keys/tm3.pub delete mode 100644 examples/7nodes/keys/tm3a.key delete mode 100644 examples/7nodes/keys/tm3a.pub delete mode 100644 examples/7nodes/keys/tm4.key delete mode 100644 examples/7nodes/keys/tm4.pub delete mode 100644 examples/7nodes/keys/tm4a.key delete mode 100644 examples/7nodes/keys/tm4a.pub delete mode 100644 examples/7nodes/keys/tm5.key delete mode 100644 examples/7nodes/keys/tm5.pub delete mode 100644 examples/7nodes/keys/tm5a.key delete mode 100644 examples/7nodes/keys/tm5a.pub delete mode 100644 examples/7nodes/keys/tm6.key delete mode 100644 examples/7nodes/keys/tm6.pub delete mode 100644 examples/7nodes/keys/tm6a.key delete mode 100644 examples/7nodes/keys/tm6a.pub delete mode 100644 examples/7nodes/keys/tm7.key delete mode 100644 examples/7nodes/keys/tm7.pub delete mode 100644 examples/7nodes/keys/tm7a.key delete mode 100644 examples/7nodes/keys/tm7a.pub delete mode 100644 examples/7nodes/passwords.txt delete mode 100755 examples/7nodes/raft-init.sh delete mode 100755 examples/7nodes/raft-start.sh delete mode 100644 examples/7nodes/raft/nodekey1 delete mode 100644 examples/7nodes/raft/nodekey2 delete mode 100644 examples/7nodes/raft/nodekey3 delete mode 100644 examples/7nodes/raft/nodekey4 delete mode 100644 examples/7nodes/raft/nodekey5 delete mode 100644 examples/7nodes/raft/nodekey6 delete mode 100644 examples/7nodes/raft/nodekey7 delete mode 100644 examples/7nodes/raft/static-nodes.json delete mode 100755 examples/7nodes/runscript.sh delete mode 100644 examples/7nodes/script1.js delete mode 100644 examples/7nodes/send-private-async.lua delete mode 100644 examples/7nodes/send-private-sync.lua delete mode 100644 examples/7nodes/send-public-sync.lua delete mode 100755 examples/7nodes/start.sh delete mode 100755 examples/7nodes/stop.sh delete mode 100644 examples/7nodes/tm1.conf delete mode 100644 examples/7nodes/tm2.conf delete mode 100644 examples/7nodes/tm3.conf delete mode 100644 examples/7nodes/tm4.conf delete mode 100644 examples/7nodes/tm5.conf delete mode 100644 examples/7nodes/tm6.conf delete mode 100644 examples/7nodes/tm7.conf delete mode 100644 examples/permissions/README.md delete mode 100755 examples/permissions/run_nodes.sh delete mode 100755 examples/permissions/stop.sh diff --git a/README.md b/README.md index 97010cf5..a2ac2dd3 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,8 @@ This repository contains setup examples for Quorum. -Current examples include: -* [7nodes](https://github.com/jpmorganchase/quorum-examples/tree/master/examples/7nodes): Starts up a fully-functioning Quorum environment consisting of 7 independent nodes with a mix of block makers, voters, and unprivileged nodes. From this example one can test consensus, privacy, and all the expected functionality of an Ethereum platform. -* [permissions](https://github.com/jpmorganchase/quorum-examples/tree/master/examples/permissions): Focuses on how to add, remove, and update the list of nodes permitted to participate in the network. -* [5nodesRTGS](https://github.com/rsarres/quorum-examples/tree/master/examples/5nodesRTGS): Starts up a set of 5 nodes that simulates a Real-time Gross Setlement environment with 3 banks, one regulator (typically a central bank) and an observer that cannot access the private data. +Current BACEN example is: +* [5nodesRTGS](https://github.com/bacen/quorum-examples/tree/master/examples/5nodesRTGS): Starts up a set of 5 nodes that simulates a Real-time Gross Setlement environment with 3 banks, one regulator (typically a central bank) and an observer that cannot access the private data. The easiest way to get started with running the examples is to use the vagrant environment (see below). @@ -28,10 +26,12 @@ Quorum examples. ### Running ```sh -git clone https://github.com/rsarres/quorum-examples +git clone https://github.com/bacen/quorum-examples cd quorum-examples +cd examples +cd 5nodesRTGS vagrant up -# (should take 5 or so minutes) +# (should take 5 or so minutes, requires internet connection) vagrant ssh ``` @@ -39,8 +39,8 @@ vagrant ssh exist, please run `sudo rm -r /opt/vagrant/embedded/bin/curl`. This is usually due to issues with the version of curl bundled with Vagrant.) -Once in the VM environment, `cd quorum-examples` then simply follow the -instructions for the demo you'd like to run. +Once in the VM environment, `cd quorum-examples/5nodesRTGS` then simply follow the +README instructions. To shut down the Vagrant instance, run `vagrant suspend`. To delete it, run `vagrant destroy`. To start from scratch, run `vagrant up` after destroying the diff --git a/examples/7nodes/.gitignore b/examples/7nodes/.gitignore deleted file mode 100644 index 0811418c..00000000 --- a/examples/7nodes/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -qdata/ -nohup.out diff --git a/examples/7nodes/README.md b/examples/7nodes/README.md deleted file mode 100644 index 5715dfcc..00000000 --- a/examples/7nodes/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# 7 nodes - -This example configures 7 nodes, each with their own PrivateTransactionManager. Usage: - - - `init.sh`: Initialize accounts and keystores - - `start.sh`: Launch `constellation` and `geth` nodes, then send a private transaction - - `stop.sh`: Stop all `constellation` and `geth` nodes - -There are corresponding commands for running in Raft mode (`stop.sh` stays the same). - - - `raft-init.sh` - - `raft-start.sh` - -All logs and temporary data will be written to the `qdata` folder. - -## Testing Privacy -You can run the 7node example to test the privacy features of Quorum. As described in the Quick Start section of the [README](https://github.com/jpmorganchase/quorum), the final step of the 7node `start.sh` script was the sending of a private transaction to generate a (private) smart contract (SimpleStorage) sent from node 1 "for" node 7 (denoted by the public key passed via privateFor: ["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="] in the sendTransaction call). We'll begin by demonstrating only nodes 1 and 7 are able to view the initial state of the contract. Next we have node 1 update the state of this contract and again verify only nodes 1 and 7 are able to see the updated state of the contract after the block containing the update transaction is validated by the network. - -For this test it is recommended to use separate terminal windows running geth JavaScript console attached to node 1, node 7, and any node 2-6 (in our example we'll choose node 4). - -In each terminal, ensure you are in the 7nodes dir before running the below. - -* If you aren't already running the 7nodes example, in terminal 1 run ``$ ./init.sh `` followed by ``$ ./start.sh `` -* In terminal 1 run ``$ geth attach ipc:qdata/dd1/geth.ipc`` -* In terminal 2 run ``$ geth attach ipc:qdata/dd4/geth.ipc`` -* In terminal 3 run ``$ geth attach ipc:qdata/dd7/geth.ipc`` - -For each of the 3 nodes we'll use the built-in JavaScript by setting the variable ```address``` assigned to the simpleStorage contract address created by the node 1. The address can be found in the node 1's log file 7nodes/qdata/logs/1.log, or alternatively by reading the `contractAddress` param after calling `eth.getTransactionReceipt(txHash)` ([Ethereum API documentation](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactionreceipt)), passing in the transaction hash that was logged in the console that you ran the 7nodes example in. Replace the address below with the address value found in the 1.log file: -``` -> var address = "0x1932c48b2bf8102ba33b4a6b545c32236e342f34"; -``` -Next we'll use ```eth.contract``` to define a contract class with the simpleStorage ABI definition as follows: -``` -> var abi = [{"constant":true,"inputs":[],"name":"storedData","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"initVal","type":"uint256"}],"type":"constructor"}]; -> var private = eth.contract(abi).at(address) -``` -The function calls are now available on the contract instance and you can call those methods on the contract. Let's start by examining the initial value of the contract to make sure that only nodes 1 and 7 can see the initialized value. -* In terminal window 1 (node 1) -``` -> private.get() -42 -``` -* In terminal window 2 (node 4) -``` -> private.get() -0 -``` -* In terminal window 3 (node 7) -``` -> private.get() -42 -``` - -So we now see nodes 1 and 7 are able to read the state of the private contract and it's initial value is 42. Node 4 is unable to read the state. Next we'll have node 1 set the state to the value `4` and verify only nodes 1 and 7 are able to view the new state. - -In terminal window 1 (node 1) -``` -> private.set(4,{from:eth.coinbase,privateFor:["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="]}); -"0xacf293b491cccd1b99d0cfb08464a68791cc7b5bc14a9b6e4ff44b46889a8f70" -``` -You can check the log files in ~7nodes/qdata/logs directory to see each node validating the block with this new private transaction. Once the block containing the transaction has been validated we can once again check the state from each node 1, 4, and 7. -* In terminal window 1 (node 1) -``` -> private.get() -4 -``` -* In terminal window 2 (node 4) -``` -> private.get() -0 -``` -* In terminal window 3 (node 7) -``` -> private.get() -4 -``` -And there you have it. All 7 nodes are validating the same blockchain of transactions, the private transactions carrying nothing other than a 512 bit hash, and only parties to private transactions are able to view and update the state of private contracts. diff --git a/examples/7nodes/bench-private-async.sh b/examples/7nodes/bench-private-async.sh deleted file mode 100755 index 8b92ebb9..00000000 --- a/examples/7nodes/bench-private-async.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -set -u -set -e -# c = number of concurrent connections (sending transactions over and over) -# d = duration, e.g. 30 (30 seconds), 5m, 1h -# t = threads Wrk should use, e.g. 2 -# -# Example: ./bench-private-async.sh 10 1m 2 -c=$1 -d=$2 -t=$3 -curl -d '' http://localhost:22000/ -wrk -s send-private-async.lua -c $c -d $d -t $t http://localhost:22000/ diff --git a/examples/7nodes/bench-private-sync.sh b/examples/7nodes/bench-private-sync.sh deleted file mode 100755 index 784e3046..00000000 --- a/examples/7nodes/bench-private-sync.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -set -u -set -e -# c = number of concurrent connections (sending transactions over and over) -# d = duration, e.g. 30 (30 seconds), 5m, 1h -# t = threads Wrk should use, e.g. 2 -# -# Example: ./bench-private-sync.sh 10 1m 2 -c=$1 -d=$2 -t=$3 -curl -d '' http://localhost:22000/ -wrk -s send-private-sync.lua -c $c -d $d -t $t http://localhost:22000/ diff --git a/examples/7nodes/bench-public-sync.sh b/examples/7nodes/bench-public-sync.sh deleted file mode 100755 index 06816d18..00000000 --- a/examples/7nodes/bench-public-sync.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -set -u -set -e -# c = number of concurrent connections (sending transactions over and over) -# d = duration, e.g. 30 (30 seconds), 5m, 1h -# t = threads Wrk should use, e.g. 2 -# -# Example: ./bench-public-sync.sh 10 1m 2 -c=$1 -d=$2 -t=$3 -curl -d '' http://localhost:22000/ -wrk -s send-public-sync.lua -c $c -d $d -t $t http://localhost:22000/ diff --git a/examples/7nodes/genesis.json b/examples/7nodes/genesis.json deleted file mode 100644 index b50c821d..00000000 --- a/examples/7nodes/genesis.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "alloc": { - "0x0000000000000000000000000000000000000020": { - "code": "606060405236156100c45760e060020a60003504631290948581146100c9578063284d163c146100f957806342169e4814610130578063488099a6146101395780634fe437d514610154578063559c390c1461015d57806368bb8bb61461025d57806372a571fc146102c857806386c1ff681461036957806398ba676d146103a0578063a7771ee31461040b578063adfaa72e14610433578063cf5289851461044e578063de8fa43114610457578063e814d1c71461046d578063f4ab9adf14610494575b610002565b610548600435600160a060020a03331660009081526003602052604090205460ff16156100c45760018190555b50565b610548600435600160a060020a03331660009081526005602052604090205460ff16156100c4576004546001141561055e57610002565b61045b60025481565b61054a60043560056020526000908152604090205460ff1681565b61045b60015481565b61045b60043560006000600060006000600050600186038154811015610002579080526002027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630192505b60018301548110156105d75760018301805484916000918490811015610002576000918252602080832090910154835282810193909352604091820181205485825292869052205410801561023257506001805490840180548591600091859081101561000257906000526020600020900160005054815260208101919091526040016000205410155b156102555760018301805482908110156100025760009182526020909120015491505b6001016101a8565b610548600435602435600160a060020a03331660009081526003602052604081205460ff16156100c4578054839010156105e45780548084038101808355908290829080158290116105df576002028160020283600052602060002091820191016105df919061066b565b610548600435600160a060020a03331660009081526005602052604090205460ff16156100c457600160a060020a0381166000908152604090205460ff1615156100f65760406000819020805460ff191660019081179091556004805490910190558051600160a060020a038316815290517f1a4ce6942f7aa91856332e618fc90159f13a340611a308f5d7327ba0707e56859181900360200190a16100f6565b610548600435600160a060020a03331660009081526003602052604090205460ff16156100c4576002546001141561071457610002565b61045b600435602435600060006000600050600185038154811015610002579080526002027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630181509050806001016000508381548110156100025750825250602090200154919050565b61054a600435600160a060020a03811660009081526003602052604090205460ff165b919050565b61054a60043560036020526000908152604090205460ff1681565b61045b60045481565b6000545b60408051918252519081900360200190f35b61054a600435600160a060020a03811660009081526005602052604090205460ff1661042e565b610548600435600160a060020a03331660009081526003602052604090205460ff16156100c457600160a060020a03811660009081526003602052604090205460ff1615156100f65760406000818120600160a060020a0384169182905260036020908152815460ff1916600190811790925560028054909201909155825191825291517f0ad2eca75347acd5160276fe4b5dad46987e4ff4af9e574195e3e9bc15d7e0ff929181900390910190a16100f6565b005b604080519115158252519081900360200190f35b600160a060020a03811660009081526005602052604090205460ff16156100f65760406000819020805460ff19169055600480546000190190558051600160a060020a038316815290517f8cee3054364d6799f1c8962580ad61273d9d38ca1ff26516bd1ad23c099a60229181900360200190a16100f6565b509392505050565b505050505b60008054600019850190811015610002578382526002027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563016020819052604082205490925014156106b8578060010160005080548060010182818154818355818115116106a5578183600052602060002091820191016106a5919061068d565b50506002015b808211156106a157600181018054600080835591825260208220610665918101905b808211156106a1576000815560010161068d565b5090565b5050506000928352506020909120018290555b600082815260208281526040918290208054600101905581514381529081018490528151600160a060020a033316927f3d03ba7f4b5227cdb385f2610906e5bcee147171603ec40005b30915ad20e258928290030190a2505050565b600160a060020a03811660009081526003602052604090205460ff16156100f65760406000819020805460ff19169055600280546000190190558051600160a060020a038316815290517f183393fc5cffbfc7d03d623966b85f76b9430f42d3aada2ac3f3deabc78899e89181900360200190a16100f656", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "0x02", - - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x04", - "0x29ecdbdf95c7f6ceec92d6150c697aa14abeb0f8595dd58d808842ea237d8494": "0x01", - "0x6aa118c6537572d8b515a9f9154be55a3377a8de7991cd23bf6e5ceb368688e3": "0x01", - "0x50793743212c6f01d326957d7069005b912f8215f10c7536be6b10782c6c44cd": "0x01", - "0x38f6c908c5cc7ca668cec2f476abe61b4dbb1df20f0ad8e07ef5dbf6a2f1ffd4": "0x01", - - "0x0000000000000000000000000000000000000000000000000000000000000004": "0x02", - "0xaca3b76ed4968740c3180dd7fa37f4aa229a2c758a848f53920e9ccb4c4bb74e": "0x01", - "0xd188ba2dc293670542c1befaf7678b0859e5354a0727d1188b2afb6f47fe24d1": "0x01" - } - - }, - "0xed9d02e382b34818e88b88a309c7fe71e65f419d": { - "balance": "1000000000000000000000000000" - }, - "0xca843569e3427144cead5e4d5999a3d0ccf92b8e": { - "balance": "1000000000000000000000000000" - }, - "0x0fbdc686b912d7722dc86510934589e0aaf3b55a": { - "balance": "1000000000000000000000000000" - }, - "0x9186eb3d20cbd1f5f992a950d808c4495153abd5": { - "balance": "1000000000000000000000000000" - }, - "0x0638e1574728b6d862dd5d3a3e0942c3be47d996": { - "balance": "1000000000000000000000000000" - } - }, - "coinbase": "0x0000000000000000000000000000000000000000", - "config": { - "homesteadBlock": 0 - }, - "difficulty": "0x0", - "extraData": "0x", - "gasLimit": "0x2FEFD800", - "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578", - "nonce": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": "0x00" -} diff --git a/examples/7nodes/init.sh b/examples/7nodes/init.sh deleted file mode 100755 index 30a2405d..00000000 --- a/examples/7nodes/init.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -set -u -set -e - -echo "[*] Cleaning up temporary data directories" -rm -rf qdata -mkdir -p qdata/logs - -echo "[*] Configuring node 1" -mkdir -p qdata/dd1/keystore -cp keys/key1 qdata/dd1/keystore -geth --datadir qdata/dd1 init genesis.json - -echo "[*] Configuring node 2 as block maker and voter" -mkdir -p qdata/dd2/keystore -cp keys/key2 qdata/dd2/keystore -cp keys/key3 qdata/dd2/keystore -geth --datadir qdata/dd2 init genesis.json - -echo "[*] Configuring node 3" -mkdir -p qdata/dd3/keystore -geth --datadir qdata/dd3 init genesis.json - -echo "[*] Configuring node 4 as voter" -mkdir -p qdata/dd4/keystore -cp keys/key4 qdata/dd4/keystore -geth --datadir qdata/dd4 init genesis.json - -echo "[*] Configuring node 5 as voter" -mkdir -p qdata/dd5/keystore -cp keys/key5 qdata/dd5/keystore -geth --datadir qdata/dd5 init genesis.json - -echo "[*] Configuring node 6" -mkdir -p qdata/dd6/keystore -geth --datadir qdata/dd6 init genesis.json - -echo "[*] Configuring node 7" -mkdir -p qdata/dd7/keystore -geth --datadir qdata/dd7 init genesis.json diff --git a/examples/7nodes/keys/key1 b/examples/7nodes/keys/key1 deleted file mode 100644 index b98da7b6..00000000 --- a/examples/7nodes/keys/key1 +++ /dev/null @@ -1 +0,0 @@ -{"address":"ed9d02e382b34818e88b88a309c7fe71e65f419d","crypto":{"cipher":"aes-128-ctr","ciphertext":"4e77046ba3f699e744acb4a89c36a3ea1158a1bd90a076d36675f4c883864377","cipherparams":{"iv":"a8932af2a3c0225ee8e872bc0e462c11"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"8ca49552b3e92f79c51f2cd3d38dfc723412c212e702bd337a3724e8937aff0f"},"mac":"6d1354fef5aa0418389b1a5d1f5ee0050d7273292a1171c51fd02f9ecff55264"},"id":"a65d1ac3-db7e-445d-a1cc-b6c5eeaa05e0","version":3} \ No newline at end of file diff --git a/examples/7nodes/keys/key2 b/examples/7nodes/keys/key2 deleted file mode 100644 index 03170fcc..00000000 --- a/examples/7nodes/keys/key2 +++ /dev/null @@ -1 +0,0 @@ -{"address":"ca843569e3427144cead5e4d5999a3d0ccf92b8e","crypto":{"cipher":"aes-128-ctr","ciphertext":"01d409941ce57b83a18597058033657182ffb10ae15d7d0906b8a8c04c8d1e3a","cipherparams":{"iv":"0bfb6eadbe0ab7ffaac7e1be285fb4e5"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"7b90f455a95942c7c682e0ef080afc2b494ef71e749ba5b384700ecbe6f4a1bf"},"mac":"4cc851f9349972f851d03d75a96383a37557f7c0055763c673e922de55e9e307"},"id":"354e3b35-1fed-407d-a358-889a29111211","version":3} \ No newline at end of file diff --git a/examples/7nodes/keys/key3 b/examples/7nodes/keys/key3 deleted file mode 100644 index a5ce8653..00000000 --- a/examples/7nodes/keys/key3 +++ /dev/null @@ -1 +0,0 @@ -{"address":"0fbdc686b912d7722dc86510934589e0aaf3b55a","crypto":{"cipher":"aes-128-ctr","ciphertext":"6b2c72c6793f3da8185e36536e02f574805e41c18f551f24b58346ef4ecf3640","cipherparams":{"iv":"582f27a739f39580410faa108d5cc59f"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"1a79b0db3f8cb5c2ae4fa6ccb2b5917ce446bd5e42c8d61faeee512b97b4ad4a"},"mac":"cecb44d2797d6946805d5d744ff803805477195fab1d2209eddc3d1158f2e403"},"id":"f7292e90-af71-49af-a5b3-40e8493f4681","version":3} \ No newline at end of file diff --git a/examples/7nodes/keys/key4 b/examples/7nodes/keys/key4 deleted file mode 100644 index cb67894d..00000000 --- a/examples/7nodes/keys/key4 +++ /dev/null @@ -1 +0,0 @@ -{"address":"9186eb3d20cbd1f5f992a950d808c4495153abd5","crypto":{"cipher":"aes-128-ctr","ciphertext":"d160a630a39be3ff35556055406d8ff2a635f0535fe298d62ccc812d8f7b3bd5","cipherparams":{"iv":"82fce06bc6e1658a5e81ccef3b753329"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"8d0c486db4c942721f4f5e96d48e9344805d101dad8159962b8a2008ac718548"},"mac":"4a92bda949068968d470320260ae1a825aa22f6a40fb8567c9f91d700c3f7e91"},"id":"bdb3b4f6-d8d0-4b00-8473-e223ef371b5c","version":3} \ No newline at end of file diff --git a/examples/7nodes/keys/key5 b/examples/7nodes/keys/key5 deleted file mode 100644 index 19ac810d..00000000 --- a/examples/7nodes/keys/key5 +++ /dev/null @@ -1 +0,0 @@ -{"address":"0638e1574728b6d862dd5d3a3e0942c3be47d996","crypto":{"cipher":"aes-128-ctr","ciphertext":"d8119d67cb134bc65c53506577cfd633bbbf5acca976cea12dd507de3eb7fd6f","cipherparams":{"iv":"76e88f3f246d4bf9544448d1a27b06f4"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"6d05ade3ee96191ed73ea019f30c02cceb6fc0502c99f706b7b627158bfc2b0a"},"mac":"b39c2c56b35958c712225970b49238fb230d7981ef47d7c33c730c363b658d06"},"id":"00307b43-53a3-4e03-9d0c-4fcbb3da29df","version":3} \ No newline at end of file diff --git a/examples/7nodes/keys/tm1.key b/examples/7nodes/keys/tm1.key deleted file mode 100644 index 2f8c9e6a..00000000 --- a/examples/7nodes/keys/tm1.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"Wl+xSyXVuuqzpvznOS7dOobhcn4C5auxkFRi7yLtgtA="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm1.pub b/examples/7nodes/keys/tm1.pub deleted file mode 100644 index e0f51363..00000000 --- a/examples/7nodes/keys/tm1.pub +++ /dev/null @@ -1 +0,0 @@ -BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo= \ No newline at end of file diff --git a/examples/7nodes/keys/tm1a.key b/examples/7nodes/keys/tm1a.key deleted file mode 100644 index 59e017cb..00000000 --- a/examples/7nodes/keys/tm1a.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"wGEar7J9G0JAgdisp61ZChyrJWeW2QPyKvecjjeVHOY="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm1a.pub b/examples/7nodes/keys/tm1a.pub deleted file mode 100644 index eae34e2e..00000000 --- a/examples/7nodes/keys/tm1a.pub +++ /dev/null @@ -1 +0,0 @@ -8SjRHlUBe4hAmTk3KDeJ96RhN+s10xRrHDrxEi1O5W0= \ No newline at end of file diff --git a/examples/7nodes/keys/tm2.key b/examples/7nodes/keys/tm2.key deleted file mode 100644 index d8c61a29..00000000 --- a/examples/7nodes/keys/tm2.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"nDFwJNHSiT1gNzKBy9WJvMhmYRkW3TzFUmPsNzR6oFk="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm2.pub b/examples/7nodes/keys/tm2.pub deleted file mode 100644 index b3600dc1..00000000 --- a/examples/7nodes/keys/tm2.pub +++ /dev/null @@ -1 +0,0 @@ -QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc= \ No newline at end of file diff --git a/examples/7nodes/keys/tm2a.key b/examples/7nodes/keys/tm2a.key deleted file mode 100644 index 5f17e63f..00000000 --- a/examples/7nodes/keys/tm2a.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"rwfJC1kNa8BjPfc+zZXug+it9sdWa0vbdN6pp6IXlAs="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm2a.pub b/examples/7nodes/keys/tm2a.pub deleted file mode 100644 index ab13763c..00000000 --- a/examples/7nodes/keys/tm2a.pub +++ /dev/null @@ -1 +0,0 @@ -2T7xkjblN568N1QmPeElTjoeoNT4tkWYOJYxSMDO5i0= \ No newline at end of file diff --git a/examples/7nodes/keys/tm3.key b/examples/7nodes/keys/tm3.key deleted file mode 100644 index f949eaf6..00000000 --- a/examples/7nodes/keys/tm3.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"tMxUVR8bX7aq/TbpVHc2QV3SN2iUuExBwefAuFsO0Lg="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm3.pub b/examples/7nodes/keys/tm3.pub deleted file mode 100644 index 4ee9d9f9..00000000 --- a/examples/7nodes/keys/tm3.pub +++ /dev/null @@ -1 +0,0 @@ -1iTZde/ndBHvzhcl7V68x44Vx7pl8nwx9LqnM/AfJUg= \ No newline at end of file diff --git a/examples/7nodes/keys/tm3a.key b/examples/7nodes/keys/tm3a.key deleted file mode 100644 index 2fe948c3..00000000 --- a/examples/7nodes/keys/tm3a.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"yLcbICXicELZOnvpkDXB2UkQUiNAMIfsEOsgtFOGkQU="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm3a.pub b/examples/7nodes/keys/tm3a.pub deleted file mode 100644 index 5766a7cb..00000000 --- a/examples/7nodes/keys/tm3a.pub +++ /dev/null @@ -1 +0,0 @@ -3nLS1GSlPs3/AccoZ20WTBrYP/ua5KDlUM1uGrDKHTs= \ No newline at end of file diff --git a/examples/7nodes/keys/tm4.key b/examples/7nodes/keys/tm4.key deleted file mode 100644 index fe537b2a..00000000 --- a/examples/7nodes/keys/tm4.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"grQjd3dBp4qFs8/5Jdq7xjz++aUx/LXAqISFyPWaCRw="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm4.pub b/examples/7nodes/keys/tm4.pub deleted file mode 100644 index 887264e1..00000000 --- a/examples/7nodes/keys/tm4.pub +++ /dev/null @@ -1 +0,0 @@ -oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8= \ No newline at end of file diff --git a/examples/7nodes/keys/tm4a.key b/examples/7nodes/keys/tm4a.key deleted file mode 100644 index c1893a3f..00000000 --- a/examples/7nodes/keys/tm4a.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"dZAr1f6Nlqe03dj3nBFKE9eSW2Tp66do7edRtKiKrew="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm4a.pub b/examples/7nodes/keys/tm4a.pub deleted file mode 100644 index 073aaed1..00000000 --- a/examples/7nodes/keys/tm4a.pub +++ /dev/null @@ -1 +0,0 @@ -Xtda1lz7BhlawE7i0+irPiS9i9StS3Q0EtQ9/fOvPXw= \ No newline at end of file diff --git a/examples/7nodes/keys/tm5.key b/examples/7nodes/keys/tm5.key deleted file mode 100644 index 0ee41782..00000000 --- a/examples/7nodes/keys/tm5.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"W8XcdJfOuxCrLcspSceNg9vh7Cwe8tXiIx5xPJ88OtQ="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm5.pub b/examples/7nodes/keys/tm5.pub deleted file mode 100644 index 4732f172..00000000 --- a/examples/7nodes/keys/tm5.pub +++ /dev/null @@ -1 +0,0 @@ -R56gy4dn24YOjwyesTczYa8m5xhP6hF2uTMCju/1xkY= \ No newline at end of file diff --git a/examples/7nodes/keys/tm5a.key b/examples/7nodes/keys/tm5a.key deleted file mode 100644 index f46f65b8..00000000 --- a/examples/7nodes/keys/tm5a.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"NPUunmb2Z/BKDcZ+6Ve68DdmHxqtn5G998i1o42sNqw="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm5a.pub b/examples/7nodes/keys/tm5a.pub deleted file mode 100644 index ea91d5e7..00000000 --- a/examples/7nodes/keys/tm5a.pub +++ /dev/null @@ -1 +0,0 @@ -ui8aK5m91usNnp6X7ZHvyRc8MNpn8ge4i2avXmev2VQ= \ No newline at end of file diff --git a/examples/7nodes/keys/tm6.key b/examples/7nodes/keys/tm6.key deleted file mode 100644 index 3c3ca784..00000000 --- a/examples/7nodes/keys/tm6.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"N9wH6bG0lWOCJtSnosatAskvzkrDApdrjaWkqjDyDzE="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm6.pub b/examples/7nodes/keys/tm6.pub deleted file mode 100644 index 6d947b8f..00000000 --- a/examples/7nodes/keys/tm6.pub +++ /dev/null @@ -1 +0,0 @@ -UfNSeSGySeKg11DVNEnqrUtxYRVor4+CvluI8tVv62Y= \ No newline at end of file diff --git a/examples/7nodes/keys/tm6a.key b/examples/7nodes/keys/tm6a.key deleted file mode 100644 index 44085400..00000000 --- a/examples/7nodes/keys/tm6a.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"SemNV0lKNKdUoFyhe0xmLZzVoLUshKvu5OwG2MfbHYM="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm6a.pub b/examples/7nodes/keys/tm6a.pub deleted file mode 100644 index 03c18a17..00000000 --- a/examples/7nodes/keys/tm6a.pub +++ /dev/null @@ -1 +0,0 @@ -/7PFjGizIvQGFVggkHaFDcv5nscjLKhPzqq3QIlpKwI= \ No newline at end of file diff --git a/examples/7nodes/keys/tm7.key b/examples/7nodes/keys/tm7.key deleted file mode 100644 index d9bd42d0..00000000 --- a/examples/7nodes/keys/tm7.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"lesaO6EWbmL1rie1biy851BnN1QsRRDK4kWUimlK0EA="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm7.pub b/examples/7nodes/keys/tm7.pub deleted file mode 100644 index 2eb5c229..00000000 --- a/examples/7nodes/keys/tm7.pub +++ /dev/null @@ -1 +0,0 @@ -ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc= \ No newline at end of file diff --git a/examples/7nodes/keys/tm7a.key b/examples/7nodes/keys/tm7a.key deleted file mode 100644 index e871a951..00000000 --- a/examples/7nodes/keys/tm7a.key +++ /dev/null @@ -1 +0,0 @@ -{"data":{"bytes":"yko+cM/ULnan7wjcrOqWEW+G9nmr1DQATAxpmiiqH8E="},"type":"unlocked"} \ No newline at end of file diff --git a/examples/7nodes/keys/tm7a.pub b/examples/7nodes/keys/tm7a.pub deleted file mode 100644 index bebd1d9d..00000000 --- a/examples/7nodes/keys/tm7a.pub +++ /dev/null @@ -1 +0,0 @@ -jqSRkPFJ8S1EZtYhnn3ZxMRWglbUvZ0+Rb1W5JquaBk= \ No newline at end of file diff --git a/examples/7nodes/passwords.txt b/examples/7nodes/passwords.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/7nodes/raft-init.sh b/examples/7nodes/raft-init.sh deleted file mode 100755 index be9c1ba6..00000000 --- a/examples/7nodes/raft-init.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -set -u -set -e - -echo "[*] Cleaning up temporary data directories" -rm -rf qdata -mkdir -p qdata/logs - -echo "[*] Configuring node 1" -mkdir -p qdata/dd1/{keystore,geth} -cp raft/static-nodes.json qdata/dd1 -cp keys/key1 qdata/dd1/keystore -cp raft/nodekey1 qdata/dd1/geth/nodekey -geth --datadir qdata/dd1 init genesis.json - -echo "[*] Configuring node 2" -mkdir -p qdata/dd2/{keystore,geth} -cp raft/static-nodes.json qdata/dd2 -cp keys/key2 qdata/dd2/keystore -cp keys/key3 qdata/dd2/keystore -cp raft/nodekey2 qdata/dd2/geth/nodekey -geth --datadir qdata/dd2 init genesis.json - -echo "[*] Configuring node 3" -mkdir -p qdata/dd3/{keystore,geth} -cp raft/static-nodes.json qdata/dd3 -cp raft/nodekey3 qdata/dd3/geth/nodekey -geth --datadir qdata/dd3 init genesis.json - -echo "[*] Configuring node 4 as voter" -mkdir -p qdata/dd4/{keystore,geth} -cp raft/static-nodes.json qdata/dd4 -cp keys/key4 qdata/dd4/keystore -cp raft/nodekey4 qdata/dd4/geth/nodekey -geth --datadir qdata/dd4 init genesis.json - -echo "[*] Configuring node 5 as voter" -mkdir -p qdata/dd5/{keystore,geth} -cp raft/static-nodes.json qdata/dd5 -cp keys/key5 qdata/dd5/keystore -cp raft/nodekey5 qdata/dd5/geth/nodekey -geth --datadir qdata/dd5 init genesis.json - -echo "[*] Configuring node 6" -mkdir -p qdata/dd6/{keystore,geth} -cp raft/static-nodes.json qdata/dd6 -cp raft/nodekey6 qdata/dd6/geth/nodekey -geth --datadir qdata/dd6 init genesis.json - -echo "[*] Configuring node 7" -mkdir -p qdata/dd7/{keystore,geth} -cp raft/static-nodes.json qdata/dd7 -cp raft/nodekey7 qdata/dd7/geth/nodekey -geth --datadir qdata/dd7 init genesis.json diff --git a/examples/7nodes/raft-start.sh b/examples/7nodes/raft-start.sh deleted file mode 100755 index 7770631e..00000000 --- a/examples/7nodes/raft-start.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -set -u -set -e - -GLOBAL_ARGS="--raft --rpc --rpcaddr 0.0.0.0 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum" - -echo "[*] Starting Constellation nodes" -nohup constellation-node tm1.conf 2>> qdata/logs/constellation1.log & -sleep 1 -nohup constellation-node tm2.conf 2>> qdata/logs/constellation2.log & -nohup constellation-node tm3.conf 2>> qdata/logs/constellation3.log & -nohup constellation-node tm4.conf 2>> qdata/logs/constellation4.log & -nohup constellation-node tm5.conf 2>> qdata/logs/constellation5.log & -nohup constellation-node tm6.conf 2>> qdata/logs/constellation6.log & -nohup constellation-node tm7.conf 2>> qdata/logs/constellation7.log & - -sleep 1 - -echo "[*] Starting node 1" -PRIVATE_CONFIG=tm1.conf nohup geth --datadir qdata/dd1 $GLOBAL_ARGS --rpcport 22000 --port 21000 --unlock 0 --password passwords.txt 2>>qdata/logs/1.log & - -echo "[*] Starting node 2" -PRIVATE_CONFIG=tm2.conf nohup geth --datadir qdata/dd2 $GLOBAL_ARGS --rpcport 22001 --port 21001 2>>qdata/logs/2.log & - -echo "[*] Starting node 3" -PRIVATE_CONFIG=tm3.conf nohup geth --datadir qdata/dd3 $GLOBAL_ARGS --rpcport 22002 --port 21002 2>>qdata/logs/3.log & - -echo "[*] Starting node 4" -PRIVATE_CONFIG=tm4.conf nohup geth --datadir qdata/dd4 $GLOBAL_ARGS --rpcport 22003 --port 21003 2>>qdata/logs/4.log & - -echo "[*] Starting node 5" -PRIVATE_CONFIG=tm5.conf nohup geth --datadir qdata/dd5 $GLOBAL_ARGS --rpcport 22004 --port 21004 2>>qdata/logs/5.log & - -echo "[*] Starting node 6" -PRIVATE_CONFIG=tm6.conf nohup geth --datadir qdata/dd6 $GLOBAL_ARGS --rpcport 22005 --port 21005 2>>qdata/logs/6.log & - -echo "[*] Starting node 7" -PRIVATE_CONFIG=tm7.conf nohup geth --datadir qdata/dd7 $GLOBAL_ARGS --rpcport 22006 --port 21006 2>>qdata/logs/7.log & - -echo "[*] Waiting for nodes to start" -sleep 10 -echo "[*] Sending first transaction" -PRIVATE_CONFIG=tm1.conf geth --exec 'loadScript("script1.js")' attach ipc:qdata/dd1/geth.ipc - -echo "All nodes configured. See 'qdata/logs' for logs, and run e.g. 'geth attach qdata/dd1/geth.ipc' to attach to the first Geth node" diff --git a/examples/7nodes/raft/nodekey1 b/examples/7nodes/raft/nodekey1 deleted file mode 100644 index 8c8bd26d..00000000 --- a/examples/7nodes/raft/nodekey1 +++ /dev/null @@ -1 +0,0 @@ -1be3b50b31734be48452c29d714941ba165ef0cbf3ccea8ca16c45e3d8d45fb0 diff --git a/examples/7nodes/raft/nodekey2 b/examples/7nodes/raft/nodekey2 deleted file mode 100644 index 73b1b72e..00000000 --- a/examples/7nodes/raft/nodekey2 +++ /dev/null @@ -1 +0,0 @@ -9bdd6a2e7cc1ca4a4019029df3834d2633ea6e14034d6dcc3b944396fe13a08b diff --git a/examples/7nodes/raft/nodekey3 b/examples/7nodes/raft/nodekey3 deleted file mode 100644 index 5a53a14d..00000000 --- a/examples/7nodes/raft/nodekey3 +++ /dev/null @@ -1 +0,0 @@ -722f11686b2277dcbd72713d8a3c81c666b585c337d47f503c3c1f3c17cf001d diff --git a/examples/7nodes/raft/nodekey4 b/examples/7nodes/raft/nodekey4 deleted file mode 100644 index 5372a1f7..00000000 --- a/examples/7nodes/raft/nodekey4 +++ /dev/null @@ -1 +0,0 @@ -6af685c4de99d44c620ccd9464d19bdeb62a750b9ae49b1740fb28d68a0e5c7d diff --git a/examples/7nodes/raft/nodekey5 b/examples/7nodes/raft/nodekey5 deleted file mode 100644 index 752d993d..00000000 --- a/examples/7nodes/raft/nodekey5 +++ /dev/null @@ -1 +0,0 @@ -103bb5d20384b9af9f693d4287822fef6da7d79cb2317ed815f0081c7ea8d17d diff --git a/examples/7nodes/raft/nodekey6 b/examples/7nodes/raft/nodekey6 deleted file mode 100644 index 0a8d3211..00000000 --- a/examples/7nodes/raft/nodekey6 +++ /dev/null @@ -1 +0,0 @@ -79999aef8d5197446b6051df47f01fd4d6dd1997aec3f5282e77ea27b6727346 diff --git a/examples/7nodes/raft/nodekey7 b/examples/7nodes/raft/nodekey7 deleted file mode 100644 index 5ece6e2a..00000000 --- a/examples/7nodes/raft/nodekey7 +++ /dev/null @@ -1 +0,0 @@ -e85dae073b504871ffd7946bf5f45e6fa8dc09eb1536a48c4b6822332008973d diff --git a/examples/7nodes/raft/static-nodes.json b/examples/7nodes/raft/static-nodes.json deleted file mode 100644 index 99c6486d..00000000 --- a/examples/7nodes/raft/static-nodes.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - "enode://ac6b1096ca56b9f6d004b779ae3728bf83f8e22453404cc3cef16a3d9b96608bc67c4b30db88e0a5a6c6390213f7acbe1153ff6d23ce57380104288ae19373ef@127.0.0.1:21000?discport=0", - "enode://0ba6b9f606a43a95edc6247cdb1c1e105145817be7bcafd6b2c0ba15d58145f0dc1a194f70ba73cd6f4cdd6864edc7687f311254c7555cc32e4d45aeb1b80416@127.0.0.1:21001?discport=0", - "enode://579f786d4e2830bbcc02815a27e8a9bacccc9605df4dc6f20bcc1a6eb391e7225fff7cb83e5b4ecd1f3a94d8b733803f2f66b7e871961e7b029e22c155c3a778@127.0.0.1:21002?discport=0", - "enode://3d9ca5956b38557aba991e31cf510d4df641dce9cc26bfeb7de082f0c07abb6ede3a58410c8f249dabeecee4ad3979929ac4c7c496ad20b8cfdd061b7401b4f5@127.0.0.1:21003?discport=0", - "enode://3701f007bfa4cb26512d7df18e6bbd202e8484a6e11d387af6e482b525fa25542d46ff9c99db87bd419b980c24a086117a397f6d8f88e74351b41693880ea0cb@127.0.0.1:21004?discport=0", - "enode://eacaa74c4b0e7a9e12d2fe5fee6595eda841d6d992c35dbbcc50fcee4aa86dfbbdeff7dc7e72c2305d5a62257f82737a8cffc80474c15c611c037f52db1a3a7b@127.0.0.1:21005?discport=0", - "enode://239c1f044a2b03b6c4713109af036b775c5418fe4ca63b04b1ce00124af00ddab7cc088fc46020cdc783b6207efe624551be4c06a994993d8d70f684688fb7cf@127.0.0.1:21006?discport=0" -] diff --git a/examples/7nodes/runscript.sh b/examples/7nodes/runscript.sh deleted file mode 100755 index cf69fe89..00000000 --- a/examples/7nodes/runscript.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -PRIVATE_CONFIG=tm1.conf geth --exec "loadScript(\"$1\")" attach ipc:qdata/dd1/geth.ipc diff --git a/examples/7nodes/script1.js b/examples/7nodes/script1.js deleted file mode 100644 index c260796f..00000000 --- a/examples/7nodes/script1.js +++ /dev/null @@ -1,19 +0,0 @@ -a = eth.accounts[0] -web3.eth.defaultAccount = a; - -var simpleSource = 'contract simplestorage { uint public storedData; function simplestorage(uint initVal) { storedData = initVal; } function set(uint x) { storedData = x; } function get() constant returns (uint retVal) { return storedData; } }' -var simpleCompiled = web3.eth.compile.solidity(simpleSource); -var simpleRoot = Object.keys(simpleCompiled)[0]; -var simpleContract = web3.eth.contract(simpleCompiled[simpleRoot].info.abiDefinition); -var simple = simpleContract.new(42, {from:web3.eth.accounts[0], data: simpleCompiled[simpleRoot].code, gas: 300000, privateFor: ["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="]}, function(e, contract) { - if (e) { - console.log("err creating contract", e); - } else { - if (!contract.address) { - console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); - } else { - console.log("Contract mined! Address: " + contract.address); - console.log(contract); - } - } -}); diff --git a/examples/7nodes/send-private-async.lua b/examples/7nodes/send-private-async.lua deleted file mode 100644 index ee08441c..00000000 --- a/examples/7nodes/send-private-async.lua +++ /dev/null @@ -1,3 +0,0 @@ -wrk.method = "POST" -wrk.body = '{"jsonrpc":"2.0","method":"eth_sendTransactionAsync","params":[{"from": "0xed9d02e382b34818e88b88a309c7fe71e65f419d", "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", "gas": "0x76c0", "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", "privateFor": ["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="]}],"id":1}' -wrk.headers["Content-Type"] = "application/json" diff --git a/examples/7nodes/send-private-sync.lua b/examples/7nodes/send-private-sync.lua deleted file mode 100644 index 9b2ab422..00000000 --- a/examples/7nodes/send-private-sync.lua +++ /dev/null @@ -1,3 +0,0 @@ -wrk.method = "POST" -wrk.body = '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from": "0xed9d02e382b34818e88b88a309c7fe71e65f419d", "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", "gas": "0x76c0", "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", "privateFor": ["ROAZBWtSacxXQrOe3FGAqJDyJjFePR5ce4TSIzmJ0Bc="]}],"id":1}' -wrk.headers["Content-Type"] = "application/json" diff --git a/examples/7nodes/send-public-sync.lua b/examples/7nodes/send-public-sync.lua deleted file mode 100644 index c96ef618..00000000 --- a/examples/7nodes/send-public-sync.lua +++ /dev/null @@ -1,3 +0,0 @@ -wrk.method = "POST" -wrk.body = '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from": "0xed9d02e382b34818e88b88a309c7fe71e65f419d", "to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567", "gas": "0x76c0", "data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"}],"id":1}' -wrk.headers["Content-Type"] = "application/json" diff --git a/examples/7nodes/start.sh b/examples/7nodes/start.sh deleted file mode 100755 index 7763d79d..00000000 --- a/examples/7nodes/start.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -set -u -set -e -NETID=87234 -BOOTNODE_KEYHEX=77bd02ffa26e3fb8f324bda24ae588066f1873d95680104de5bc2db9e7b2e510 -BOOTNODE_ENODE=enode://61077a284f5ba7607ab04f33cfde2750d659ad9af962516e159cf6ce708646066cd927a900944ce393b98b95c914e4d6c54b099f568342647a1cd4a262cc0423@[127.0.0.1]:33445 - -GLOBAL_ARGS="--bootnodes $BOOTNODE_ENODE --networkid $NETID --rpc --rpcaddr 0.0.0.0 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum" - -echo "[*] Starting Constellation nodes" -nohup constellation-node tm1.conf 2>> qdata/logs/constellation1.log & -sleep 1 -nohup constellation-node tm2.conf 2>> qdata/logs/constellation2.log & -nohup constellation-node tm3.conf 2>> qdata/logs/constellation3.log & -nohup constellation-node tm4.conf 2>> qdata/logs/constellation4.log & -nohup constellation-node tm5.conf 2>> qdata/logs/constellation5.log & -nohup constellation-node tm6.conf 2>> qdata/logs/constellation6.log & -nohup constellation-node tm7.conf 2>> qdata/logs/constellation7.log & - -echo "[*] Starting bootnode" -nohup bootnode --nodekeyhex "$BOOTNODE_KEYHEX" --addr="127.0.0.1:33445" 2>>qdata/logs/bootnode.log & -echo "wait for bootnode to start..." -sleep 6 - -echo "[*] Starting node 1" -PRIVATE_CONFIG=tm1.conf nohup geth --datadir qdata/dd1 $GLOBAL_ARGS --rpcport 22000 --port 21000 --unlock 0 --password passwords.txt 2>>qdata/logs/1.log & - -echo "[*] Starting node 2" -PRIVATE_CONFIG=tm2.conf nohup geth --datadir qdata/dd2 $GLOBAL_ARGS --rpcport 22001 --port 21001 --voteaccount "0x0fbdc686b912d7722dc86510934589e0aaf3b55a" --votepassword "" --blockmakeraccount "0xca843569e3427144cead5e4d5999a3d0ccf92b8e" --blockmakerpassword "" --singleblockmaker --minblocktime 2 --maxblocktime 5 2>>qdata/logs/2.log & - -echo "[*] Starting node 3" -PRIVATE_CONFIG=tm3.conf nohup geth --datadir qdata/dd3 $GLOBAL_ARGS --rpcport 22002 --port 21002 2>>qdata/logs/3.log & - -echo "[*] Starting node 4" -PRIVATE_CONFIG=tm4.conf nohup geth --datadir qdata/dd4 $GLOBAL_ARGS --rpcport 22003 --port 21003 --voteaccount "0x9186eb3d20cbd1f5f992a950d808c4495153abd5" --votepassword "" 2>>qdata/logs/4.log & - -echo "[*] Starting node 5" -PRIVATE_CONFIG=tm5.conf nohup geth --datadir qdata/dd5 $GLOBAL_ARGS --rpcport 22004 --port 21004 --voteaccount "0x0638e1574728b6d862dd5d3a3e0942c3be47d996" --votepassword "" 2>>qdata/logs/5.log & - -echo "[*] Starting node 6" -PRIVATE_CONFIG=tm6.conf nohup geth --datadir qdata/dd6 $GLOBAL_ARGS --rpcport 22005 --port 21005 2>>qdata/logs/6.log & - -echo "[*] Starting node 7" -PRIVATE_CONFIG=tm7.conf nohup geth --datadir qdata/dd7 $GLOBAL_ARGS --rpcport 22006 --port 21006 2>>qdata/logs/7.log & - -echo "[*] Waiting for nodes to start" -sleep 10 -echo "[*] Sending first transaction" -PRIVATE_CONFIG=tm1.conf geth --exec 'loadScript("script1.js")' attach ipc:qdata/dd1/geth.ipc - -echo "All nodes configured. See 'qdata/logs' for logs, and run e.g. 'geth attach qdata/dd1/geth.ipc' to attach to the first Geth node" diff --git a/examples/7nodes/stop.sh b/examples/7nodes/stop.sh deleted file mode 100755 index fa1e0a0d..00000000 --- a/examples/7nodes/stop.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -killall geth bootnode constellation-node diff --git a/examples/7nodes/tm1.conf b/examples/7nodes/tm1.conf deleted file mode 100644 index fb1efb99..00000000 --- a/examples/7nodes/tm1.conf +++ /dev/null @@ -1,9 +0,0 @@ -url = "http://127.0.0.1:9000/" -port = 9000 -socketPath = "qdata/tm1.ipc" -otherNodeUrls = [] -publicKeyPath = "keys/tm1.pub" -privateKeyPath = "keys/tm1.key" -archivalPublicKeyPath = "keys/tm1a.pub" -archivalPrivateKeyPath = "keys/tm1a.key" -storagePath = "qdata/constellation1" diff --git a/examples/7nodes/tm2.conf b/examples/7nodes/tm2.conf deleted file mode 100644 index e4c15073..00000000 --- a/examples/7nodes/tm2.conf +++ /dev/null @@ -1,9 +0,0 @@ -url = "http://127.0.0.1:9001/" -port = 9001 -socketPath = "qdata/tm2.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm2.pub" -privateKeyPath = "keys/tm2.key" -archivalPublicKeyPath = "keys/tm2a.pub" -archivalPrivateKeyPath = "keys/tm2a.key" -storagePath = "qdata/constellation2" diff --git a/examples/7nodes/tm3.conf b/examples/7nodes/tm3.conf deleted file mode 100644 index 4dca8ba0..00000000 --- a/examples/7nodes/tm3.conf +++ /dev/null @@ -1,9 +0,0 @@ -url = "http://127.0.0.1:9002/" -port = 9002 -socketPath = "qdata/tm3.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm3.pub" -privateKeyPath = "keys/tm3.key" -archivalPublicKeyPath = "keys/tm3a.pub" -archivalPrivateKeyPath = "keys/tm3a.key" -storagePath = "qdata/constellation3" diff --git a/examples/7nodes/tm4.conf b/examples/7nodes/tm4.conf deleted file mode 100644 index c5c39aca..00000000 --- a/examples/7nodes/tm4.conf +++ /dev/null @@ -1,9 +0,0 @@ -url = "http://127.0.0.1:9003/" -port = 9003 -socketPath = "qdata/tm4.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm4.pub" -privateKeyPath = "keys/tm4.key" -archivalPublicKeyPath = "keys/tm4a.pub" -archivalPrivateKeyPath = "keys/tm4a.key" -storagePath = "qdata/constellation4" diff --git a/examples/7nodes/tm5.conf b/examples/7nodes/tm5.conf deleted file mode 100644 index 91420465..00000000 --- a/examples/7nodes/tm5.conf +++ /dev/null @@ -1,9 +0,0 @@ -url = "http://127.0.0.1:9004/" -port = 9004 -socketPath = "qdata/tm5.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm5.pub" -privateKeyPath = "keys/tm5.key" -archivalPublicKeyPath = "keys/tm5a.pub" -archivalPrivateKeyPath = "keys/tm5a.key" -storagePath = "qdata/constellation5" diff --git a/examples/7nodes/tm6.conf b/examples/7nodes/tm6.conf deleted file mode 100644 index a06326ef..00000000 --- a/examples/7nodes/tm6.conf +++ /dev/null @@ -1,9 +0,0 @@ -url = "http://127.0.0.1:9006/" -port = 9006 -socketPath = "qdata/tm6.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm6.pub" -privateKeyPath = "keys/tm6.key" -archivalPublicKeyPath = "keys/tm6a.pub" -archivalPrivateKeyPath = "keys/tm6a.key" -storagePath = "qdata/constellation6" diff --git a/examples/7nodes/tm7.conf b/examples/7nodes/tm7.conf deleted file mode 100644 index c83a8f89..00000000 --- a/examples/7nodes/tm7.conf +++ /dev/null @@ -1,9 +0,0 @@ -url = "http://127.0.0.1:9005/" -port = 9005 -socketPath = "qdata/tm7.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm7.pub" -privateKeyPath = "keys/tm7.key" -archivalPublicKeyPath = "keys/tm7a.pub" -archivalPrivateKeyPath = "keys/tm7a.key" -storagePath = "qdata/constellation7" diff --git a/examples/permissions/README.md b/examples/permissions/README.md deleted file mode 100644 index 3488ae5f..00000000 --- a/examples/permissions/README.md +++ /dev/null @@ -1,139 +0,0 @@ - -# Node Permissioning Example - -Node Permissioning is a feature in Quorum that allows only a pre-defined set of nodes (as identified by their remotekey/enodes) to connect to the permissioned network. - -This example demonstrates the following: -* Sets up a network with a combination of permissioned and non-permissioned nodes in the cluster. -* Enabling / Disabling the permissions from command line. -* Details of permissioned-nodes.json file. -* Demonstrate that only the nodes that are specified in permissioned-nodes.json can connect to the network. - -## Usage - -``` -./run_nodes.sh GETH_BINARY DATADIR_BASE PERMISSONED_NODES NON_PERMISSIONED_NODES - -where: - - GETH_BINARY is the geth command you want to use - DATADIR_BASE is the folder under which node specific datadir will be created - PERMISSONED_NODES is the number of Permissioned Nodes to start. - NON_PERMISSIONED_NODES is number of non permissioned nodes to start. - -``` - -For example: -``` -$ ./run_nodes.sh /usr/local/bin/geth /tmp/chaindata 5 3 -``` -will start 5 permissioned nodes with node numbers from 1-5 and 3 -non-permissioned nodes from 6-8. - -or: - -``` -./run_nodes.sh default -``` - -to use default settings. - -Sample output (condensed for clarity): - -``` -$ ./run_nodes.sh default -* -Initializing Environment -*** Starting Permissioned Nodes **** -Running Permissioned Nodes -Started Permissioned node 1 with enode://8475a01f22a1f48116dc1f0d22ecaaaf77e5 -Started Permissioned node 2 with enode://b5660501f496e60e59ded734a889c97b7da9 -Started Permissioned node 3 with enode://54bd7ff4bd971fb80493cf47064553959176 -Started Permissioned node 4 with enode://24a62b436686d550e92c84cc314565012d71 -Started Permissioned node 5 with enode://246740a1ccb5d6f419c1f86e002332a58e246 - -*** All permissioned nodes Started. Please check the output for any errors **** - -*** Starting UnPermissioned Nodes **** - -Started Unpermissioned node 6 with enode://4c80d699a358a915635ae4cc3cedeacb92d -Started Unpermissioned node 7 with enode://005be0525b47039923bb4ed7ab53f14a53b4 -Started Unpermissioned node 8 with enode://375d1b75c230ff7434a4b2534fb1eb6482a6 - -*** All Unpermissoned nodes Started. Please check the output for any errors **** - -**** Update permissions config on each node *** -copying permissioned-nodes.json to pdata/1 -copying permissioned-nodes.json to pdata/2 -copying permissioned-nodes.json to pdata/3 -copying permissioned-nodes.json to pdata/4 -copying permissioned-nodes.json to pdata/5 -``` - -* ### Verify only permissioned nodes are connected to the network. - -* Attach to the individual nodes via - `geth attach ipc:/path/to/geth.ipc` and use `admin.peers` to check the connected nodes. - -``` -geth attach ipc:./pdata/1/geth.ipc -instance: Geth/node_1/v1.5.0-unstable-42adaae1/darwin/go1.6.2 -> admin.peers -[{ - caps: ["eth/62", "eth/63"], - id: "246740a1ccb5d6f419c1f86e002332a58e246f39f411d61e51b763a3f226a082fba275652c9ce01e5d5f81a7ba2850bea4611247d745e278f3a558e6345ee75a", - name: "Geth/node_5/v1.5.0-unstable-42adaae1/darwin/go1.6.2", - network: { - localAddress: "127.0.0.1:59706", - remoteAddress: "127.0.0.1:30305" - }, - protocols: { - eth: { - difficulty: 17179869184, - head: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", - version: 63 - } - } -}, { - caps: ["eth/62", "eth/63"], - id: "54bd7ff4bd971fb80493cf470645539591767d492a8229dcb8adc10129fc4c6bfd8f6044c75e806c4c9fdcec4e9b956d00d495ce273e9ae6c7347b90a9f5356b", - name: "Geth/node_3/v1.5.0-unstable-42adaae1/darwin/go1.6.2", - network: { - localAddress: "127.0.0.1:30301", - remoteAddress: "127.0.0.1:56980" - }, - protocols: { - eth: { - difficulty: 17179869184, - head: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", - version: 63 - } - } -}] -``` - - -* You can also inspect the log files under `logs/node*.log` for further diagnostics messages around incoming / outgoing connection requests. Grep for `ALLOWED-BY` or `DENIED-BY`. Please be sure to enable verobsity for p2p module. - -* #### Permissioning configuration - - Permissioning is granted based on the remote key of the geth node. The remote keys are specified in the permissioned-nodes.json and is placed under individual nodes . - - The below sample permissioned-nodes.json provides a list of nodes permissioned to join the network ( node ids truncated for clarity) - -``` -[ - "enode://8475a01f22a1f48116dc1f0d22ecaaaf77e[::]:30301", - "enode://b5660501f496e60e59ded734a889c97b7da[::]:30302", - "enode://54bd7ff4bd971fb80493cf4706455395917[::]:30303" -] -``` - -* #### Enabling/Disabling permissions - - An individual node can enable/disable permissioning by passing the `-permissioned` command line flag. If enabled, then only the nodes that are in the `/permissioned-nodes.json` can connect to it. Further, these are the only nodes that this node can make outbound connections to as well. - -``` -MISCELLANEOUS OPTIONS: ---permissioned If enabled, the node will allow only a defined list of nodes to connect -``` diff --git a/examples/permissions/run_nodes.sh b/examples/permissions/run_nodes.sh deleted file mode 100755 index a0acc3f0..00000000 --- a/examples/permissions/run_nodes.sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/bash - -set -e - -HOST=localhost - -display_usage() { - printf "\n\n======= Either run the script with default setup by exeucting 'run_nodes.sh default' OR Set up the following parameters=======\n" - printf "\nUsage:[$0 GETH_BINARY DATADIR_BASE PERMISSONED_NODES, NODE_PERMISSIONED_NODES]. \n where: - GETH_BINARY is the geth command you want to use - DATADIR_BASE is the folder under which node specific datadir will be created - PERMISSONED_NODES is the number of Permissioned Nodes. - NODE_PERMISSIONED_NODES is number of non permissioned nodes.\n" - printf "\nFor Example:[$0 /usr/local/bin/geth /Users/Library/Ethereum/chaindata 5 3] will start 5 permissioned nodes with node numbers from 1 to 5 & - 3 non permissioned nodes from 5 to 8\n\n" - - } - -validate_inputs() -{ - if [ ! -x $1 ]; then - echo " Geth $1 does exist. Please specify a valid geth executable" - exit 1 - else: - echo "Will use $1 for geth exectuable" - fi - - if [ ! -d $2 ]; then - echo " BASE DATADIR $2 does not exist. Please specify a valid BASE DATADIR." - exit 1 - else: - echo "Will use $2 for Nodes datadir." - fi - - printf "Nodes: $3, $4\n" - if [ "$3" -le 0 ] ; then - echo "Invalid nodes count. Please specify a number greater than 0 and less than $4." - exit 1 - fi - - if [ 10 -lt $4 ]; then - echo "Too many nodes to run for an example. Please specify a number less than 10." - exit 1 - fi - -} - -initialize() -{ - - ############################################### - ### ENVIRONMENT VARIBALES ############# - echo "Initializing Environment " - QUORUM_BIN=$1 - DATADIR_BASE=$2 - BOOTNODE_KEYHEX=77bd02ffa26e3fb8f324bda24ae588066f1873d95680104de5bc2db9e7b2e510 - BOOTNODE_ENODE=enode://6433e8fb82c4638a8a6d499d40eb7d8158883219600bfd49acb968e3a37ccced04c964fa87b3a78a2da1b71dc1b90275f4d055720bb67fad4a118a56925125dc@[127.0.0.1]:33445 - NETWORK_ID=1441 - LOGDIR=$DATADIR_BASE/logs - PERMISSIONED_CONFIG="permissioned-nodes.json" - BASE_PORT=3030 - BASE_RPC_PORT=854 - - VERBOSITY="--vmodule p2p=5" # Needed to view the debug logs - # VERBOSITY="" - PERMISSIONED="--permissioned" # - - #PERMISSIONED="" - set PERMISSIONED to "" if running in non permissioned mode - ############################################### - mkdir -p $LOGDIR - mkdir -p $DATADIR_BASE - printf "Initialization done. QUORUM_BIN: $QUORUM_BIN DATADIR_BASE: $DATADIR_BASE\n" -} - -start_bootnode() -{ - echo -n "[*] Starting bootnode... " - nohup bootnode --nodekeyhex "$BOOTNODE_KEYHEX" --addr="127.0.0.1:33445" 2>>$LOGDIR/bootnode.log & - echo -n "waiting... " - sleep 6 - echo -n "done" -} - -ALL_NODES= - -run_permissioned_nodes() -{ - # run in permssioned node - START=1 - END=$1 - - echo "Running Permissioned Nodes" - PERMISSIONED_NODES+="[" - for ((NODE_NUM=START;NODE_NUM<=END;NODE_NUM++)); do - #clean up previous logs - cp /dev/null $LOGDIR/node$NODE_NUM.log - echo "======== Starting Node: ===== " $NODE_NUM - LISTEN_PORT=$BASE_PORT$NODE_NUM - RPC_PORT=$BASE_RPC_PORT$NODE_NUM - DATADIR=$(readlink -f $DATADIR_BASE/$NODE_NUM) - LOGFILE=$(readlink -f $LOGDIR/node$NODE_NUM.log) - printf "Starting $NODE_NUM with datadir $DATADIR on $HOST:$LISTEN_PORT with RPC Port http://$HOST:$RPC_PORT\n" - COMMAND="$QUORUM_BIN $PERMISSIONED --datadir $DATADIR $VERBOSITY --identity node_$NODE_NUM --networkid=$NETWORK_ID --rpc --port $LISTEN_PORT --rpcaddr $HOST --rpcport $RPC_PORT --bootnodes $BOOTNODE_ENODE" - mkdir -p $DATADIR - echo "nohup $COMMAND 2>> $LOGFILE &" > $DATADIR/start.sh - chmod 755 $DATADIR/start.sh - $DATADIR/start.sh - sleep 5 - ERROR=`awk '/Fatal/ {print $1}' $LOGFILE` - NODE_ID=`awk '/Listening, enode/{ print $5 }' $LOGFILE` - printf "Started Permissioned node $NODE_NUM with ${NODE_ID}\n" - ALL_NODES+="\"$NODE_ID\"," - if [ ${NODE_NUM} == ${END} ]; then - PERMISSIONED_NODES+="\"$NODE_ID\"" - else - PERMISSIONED_NODES+="\"$NODE_ID\"," - fi - - done - PERMISSIONED_NODES+="]" -} - - -run_nonpermissioned_nodes() -{ - # run in permssioned node - START=$1 - END=START+$2 - echo "Running unpermissioned Nodes" - for ((NODE_NUM=START+1;NODE_NUM<=END;NODE_NUM++)); do - #clean up previous logs - cp /dev/null $LOGDIR/node$NODE_NUM.log - echo "======== Starting Node: ===== " $NODE_NUM - LISTEN_PORT=$BASE_PORT$NODE_NUM - RPC_PORT=$BASE_RPC_PORT$NODE_NUM - DATADIR="$DATADIR_BASE/"$NODE_NUM - LOGFILE=$LOGDIR/node$NODE_NUM.log - printf "#Starting $NODE_NUM with datadir $DATADIR on $HOST:$LISTEN_PORT\n" - COMMAND="$QUORUM_BIN $PERMISSIONED --datadir $DATADIR $VERBOSITY --identity node_$NODE_NUM --networkid=$NETWORK_ID --rpc --port $LISTEN_PORT --rpcaddr $HOST --rpcport $RPC_PORT" - printf "Executing command $COMMAND\n" - $COMMAND 2>> $LOGFILE & - sleep 10 - ERROR=`awk '/Fatal/ {print $1}' $LOGFILE` - NODE_ID=`awk '/Listening, enode/{ print $5 }' $LOGFILE` - ALL_NODES+="\"$NODE_ID\"," - printf "Started Unpermissioned node $NODE_NUM with ${NODE_ID}\n" - done - - echo $ALL_NODES > all_nodes - - -} - -update_permissions_file() -{ - - START=1 - END=$1 - echo $PERMISSIONED_NODES > $PERMISSIONED_CONFIG - for ((NODE_NUM=START;NODE_NUM<=END;NODE_NUM++)); do - DATADIR="$DATADIR_BASE/"$NODE_NUM - echo "copying $PERMISSIONED_CONFIG to $DATADIR" - cp $PERMISSIONED_CONFIG $DATADIR - done -} - -# allowed_pattern="ALLOWED-BY" -# denied_pattern="DENIED_BY" - -verify_permissioning() -{ - echo "Verify permissioning" - # grep ALLOWED-BY node*.log - -} - -set_defaults_args() -{ - - QUORUM_BIN='/usr/local/bin/geth' - mkdir -p qdata - DATADIR_BASE="./qdata" - - -} - -#### Run the main script -PERMISSIONED_NODES=() - - -run_default(){ - - printf "**** Validating inputs *** \n" - # QUORUM_BIN='/usr/local/bin/geth' - QUORUM_BIN='/usr/local/bin/geth' - mkdir -p qdata - DATADIR_BASE='./qdata' - PERM_NODES=5 - NON_PERM_NODES=3 - -} - -run_custom(){ - - printf "**** Validating inputs *** $1, $2, $3, $4\n" - QUORUM_BIN=$1 - DATADIR_BASE=$2 - PERM_NODES=$3 - NON_PERM_NODES=$4 - initialize $QUORUM_BIN $DATADIR_BASE - validate_inputs $QUORUM_BIN $DATADIR_BASE $PERM_NODES $NON_PERM_NODES - -} - -cleanup(){ - printf "cleaning up logs" - rm -rf logs/ -} - -if [[ $1 == 'default' ]]; then - printf "*** Running dafault setup ***" - run_default -else - printf "*** Running Custom setup" - if [ $# -ne 4 ] - then - display_usage - exit 1 - fi - run_custom $1 $2 $3 $4 -fi - -set -u - -printf "**** Initialize Environment **** \n" -initialize $QUORUM_BIN $DATADIR_BASE - -start_bootnode - -printf "\n*** Starting Permissioned Nodes **** \n" -run_permissioned_nodes $PERM_NODES -printf "\n*** All permissioned nodes Started. Please check the output for any errors **** \n" - -printf "\n*** Starting UnPermissioned Nodes **** \n" -run_nonpermissioned_nodes $PERM_NODES $NON_PERM_NODES -printf "\n*** All Unpermissoned nodes Started. Please check the output for any errors **** \n" - -printf "\n**** Update permissions config on each node *** \n" -update_permissions_file $PERM_NODES -printf "\n **** End of Script **** \n" - diff --git a/examples/permissions/stop.sh b/examples/permissions/stop.sh deleted file mode 100755 index 2919f95c..00000000 --- a/examples/permissions/stop.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -killall geth bootnode - From 0df608e3ff0324aabd11da4016d2d465b94ff8e5 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 23 Nov 2017 18:51:43 +0000 Subject: [PATCH 13/31] Quorum 2.0.0 compatibility and raft consensus --- examples/5nodesRTGS/README.md | 13 +- examples/5nodesRTGS/contracts.sol | 365 ------------------ .../5nodesRTGS/deploy-bankContract-0-3-6.js | 2 +- .../deploy-regulatorTransactionList-0-3-6.js | 2 +- examples/5nodesRTGS/genesis.json | 45 +-- examples/5nodesRTGS/init.sh | 33 -- examples/5nodesRTGS/runscript.sh | 2 - examples/5nodesRTGS/start.sh | 39 -- examples/5nodesRTGS/stop.sh | 0 examples/5nodesRTGS/tm1.conf | 53 ++- examples/5nodesRTGS/tm2.conf | 53 ++- examples/5nodesRTGS/tm3.conf | 53 ++- examples/5nodesRTGS/tm4.conf | 53 ++- examples/5nodesRTGS/tm5.conf | 53 ++- 14 files changed, 250 insertions(+), 516 deletions(-) delete mode 100644 examples/5nodesRTGS/contracts.sol delete mode 100644 examples/5nodesRTGS/init.sh delete mode 100644 examples/5nodesRTGS/runscript.sh delete mode 100644 examples/5nodesRTGS/start.sh mode change 100644 => 100755 examples/5nodesRTGS/stop.sh diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index f6bed4eb..1296fa5c 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -2,8 +2,8 @@ This example configures 5 nodes, each with their own PrivateTransactionManager. Usage: - - `init.sh`: Initialize accounts and keystores - - `start.sh`: Launch `constellation` and `geth` nodes, then send a private transaction + - `raft-init.sh`: Initialize accounts and keystores + - `raft-start.sh`: Launch `constellation` and `geth` nodes, then send a private transaction - `stop.sh`: Stop all `constellation` and `geth` nodes All logs and temporary data will be written to the `qdata` folder. @@ -31,7 +31,13 @@ Transactions are published privately by the sender bank and must only be sent to This two phase commit is needed because there is no overdraft protecting in the bankContract code because different bank instances have different data. For example, bank1 smart contract published in the bank1 node has the balance variable set, but the same contract with the same address in the bank2 node has no value in the balance data because this data is private to bank1 and the regulator. The regulator node´s contracts have all the data as it must be part of every private transaction. The logic behind this proccess is that, after a transaction is published, the regulator can check the sender balance against the newly published transaction. If the value intended for the transfer is higher than the bank balance, the regulator must block this transaction during the confirmation time. If the value is below the balance OR if the regulator is offline, the sender bank can confirm its own transaction after the confirmation time. This is a resiliency feature to ensure that the RTGS system endures a regulator outage. -##Environment setup +## Environment setup +## Virtual machine Quorum and Constellation install +1- Start with a clean Ubuntu 16.04 virtual machine install + +2- Run "bootstrap.sh" script to install Constellation, GO and Quorum + +## Quorum set up and start 1- call init.sh to initialize accounts and keystores 2- Bring the 5 nodes up calling start.sh @@ -50,6 +56,7 @@ terminal 5: ``$ geth attach ipc:qdata/dd5/geth.ipc`` Terminal 1-3 are banks 1-3, terminal 4 is the regulator and terminal 5 is the observer used to test privacy. +##Running 5nodesRTGS example 4- Run the following command three times in the javascript quorum console on terminal 4 (regulator): ``loadScript("deploy-bankContract-0-3-6.js");`` diff --git a/examples/5nodesRTGS/contracts.sol b/examples/5nodesRTGS/contracts.sol deleted file mode 100644 index 81fa59d8..00000000 --- a/examples/5nodesRTGS/contracts.sol +++ /dev/null @@ -1,365 +0,0 @@ -/* -bankContract: JPMorgan Quorum smart contract example implementing a private -payment system -Must be deployed as a PRIVATE contract -Initialization: -- Each bank must have an instance of the contract deployed. -- Bank balances must be set privately by the regulator node on each -bank contract instance. This information is only shared between the bank and -the regulator . -- Transactions are private. Each transaction sensitive information is only shared -between the sender, receiver and regulator. -- The list of participating banks must be set by the regulator - -Usage: -- Banks can send money calling sendValue function using only its authorized -account (authorizedSender). A random value must be provided to ensure an unique -transaction ID. If a constant value is passed on every transaction, a -transaction ID collision can occur if two transactions with the same sender, -destination and value are mined in the same block. - -- Transactions are created on an unconfirmed status and they are not -settled. The finality is only achieved after the transaction is confirmed. - -- Transaction IDs must be published on an public contract that stores the -transaction log. This ensures that the regulator has knowledge of all the -transactions. If the regulator sees a transaction in the log that was not -copied privately by the sender to him, he can block it immediately. - -- Only the regulator can confirm a transaction during the confirmation time -(60 seconds by default). During this period, the regulator can read the -transaction and compare it to the bank balance. If the bank has enough money, -the regulator confirms the transaction calling confirmTransactionRegulator -function. - -- If a published transaction would cause an overdraft if confirmed, the -regulator can block it so the bank cannot confirm the transaction after -the confirmation time. - -- If the regulator does not act (blocking or confirming) during the -confirmation time, the sender can confirm its own transaction. This proccess -ensures that the system can endure a regulator outage. - -- Transaction confirmation will reflect on both smart contracts balance -immediatelly (sender and receiver). - -Known problems: -- Fail to provide a random value to the sendValue like using the same value -on every transaction can lead to duplicated transaction IDs in case of fast -multiple identical transactions. - -*/ - -contract bankContract { -uint public balance=0; -address public thisBankContract; -bool public isRegulatorNode = false; -uint public confirmationTime = 60; - -address public TransactionListAddress; - -//totalTransactions: counts all the transactions that the bank is part of, -//confirmed or not. -uint public totalTransactions = 0; - -struct transaction { - uint value; - address senderContract; - address destinationContract; - bool confirmed; - uint senderBalanceAtTransfer; -} - -mapping (bytes32 => transaction) public transactions; -mapping (uint => bytes32) public transactionIDs; - - -modifier onlyRegulator() { - regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); - if (msg.sender != transactionListContractModifier.getRegulator()) throw;_ -} - -//This modifier ensures that the msg.sender is a valid bank contract address - -modifier validSenderContract() { - regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); - if (!transactionListContractModifier.getBankExistance(msg.sender)) throw;_ -} - -//This modifier ensures that the msg.sender is THE valid bank transaction -//address. It prevents bank impersonation attack -modifier authorizedSender() { - regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); - if (transactionListContractModifier.getBankSender(address(this))!= msg.sender) throw;_ -} - -function setTransactionListAddress (address _contractAddress) onlyRegulator { - TransactionListAddress = _contractAddress; -} - -/* sendValue: creates a private transaction between banks. The transaction -is stored in the private transaction log that is only shared between the sender, -the receiver and the regulator. The transaction is created NOT CONFIRMED. In -this state, no funds have changed hands. The funds are only moved and balances -updated if the transaction is CONFIRMED in a another function call, achieving -finality -*/ -function sendValue (address _destination , uint _value, string _random) authorizedSender { - -uint destinationTransactionID; -bytes32 transactionID; - -regulatorTransactionList transactionListContract = regulatorTransactionList(TransactionListAddress); - -transactionID=sha3(address(this),_destination,_value,block.timestamp,_random); - -transactionIDs[totalTransactions]=transactionID; - -if ((!transactionListContract.getBankExistance(_destination))|| -(!transactionListContract.getBankState(address(this)))) throw; - -bankContract destinationContract = bankContract(_destination); -destinationContract.receiveValue(_value,_random); - -transactions[transactionID].value=_value; -transactions[transactionID].senderContract=address(this); -transactions[transactionID].destinationContract=_destination; -transactions[transactionID].senderBalanceAtTransfer=balance; -transactions[transactionID].confirmed=false; - -totalTransactions++; - -} - -/* receiveValue: creates a copy of the transaction created by the sendValue -function in the recipient bank contract. -*/ -function receiveValue (uint _value, string _random) validSenderContract { - -bytes32 transactionID; - -transactionID=sha3(msg.sender,address(this),_value,block.timestamp,_random); - -transactionIDs[totalTransactions]=transactionID; - -transactions[transactionID].value=_value; -transactions[transactionID].senderContract=msg.sender; -transactions[transactionID].destinationContract=address(this); -transactions[transactionID].confirmed=false; - -totalTransactions++; - -} - -function setRegulatorNode () onlyRegulator { - isRegulatorNode=true; -} - -function setBalance(uint _balance) onlyRegulator { - balance=_balance; -} - - -function setConfirmationTime(uint _seconds) onlyRegulator { - confirmationTime=_seconds; -} - -function setThisBankContract(address _thisBankContract) onlyRegulator { - thisBankContract = _thisBankContract; -} - -/*confirmTransactionRegulator: regulator exclusive function to confirm a -transaction. The transaction MUST be in the public transaction log to be -confirmed, even by the regulator. This ensures that every part is aware of the -transaction or must report inconsistence to the regulator. Overdraft protection -was not possible because there is no consensus on private contracts. -Balances are updated on both contracts if all checks are successful. -*/ -function confirmTransactionRegulator(bytes32 _transactionID) onlyRegulator { - - regulatorTransactionList transactionListContract = regulatorTransactionList(TransactionListAddress); - - if ((!transactions[_transactionID].confirmed)&& - (!transactionListContract.getTransactionState(_transactionID))&& - (transactionListContract.getTransactionExistance(_transactionID))) { - transactions[_transactionID].confirmed=true; - - if (transactions[_transactionID].destinationContract == address(this)) { - if ((transactions[_transactionID].destinationContract == thisBankContract) || - (isRegulatorNode)) { - balance+=transactions[_transactionID].value; - } - bankContract senderContract = bankContract(transactions[_transactionID].senderContract); - - senderContract.confirmTransactionPair(_transactionID); - } - - if (transactions[_transactionID].senderContract == address(this)) { - if ((transactions[_transactionID].senderContract == thisBankContract) || - (isRegulatorNode)) { - balance-=transactions[_transactionID].value; - } - bankContract destinationContract = bankContract(transactions[_transactionID].destinationContract); - - destinationContract.confirmTransactionPair(_transactionID); - } - } -} - -/*confirmTransactionBank: bank exclusive function to confirm a -transaction. A bank can only confirm a transaction after the confirmationTime -seconds has passed. The transaction MUST be in the public transaction log to be -confirmed. This ensures that every part is aware of the -transaction or must report inconsistence to the regulator. Overdraft protection -was not possible because there is no consensus on private contracts. -Balances are updated on both contracts if all checks are successful. -*/ -function confirmTransactionBank(bytes32 _transactionID) authorizedSender { - - regulatorTransactionList transactionListContract = regulatorTransactionList(TransactionListAddress); - - if ((block.timestamp-transactionListContract.getTransactionTimestamp(_transactionID) > confirmationTime) && - (!transactions[_transactionID].confirmed)&& - (!transactionListContract.getTransactionState(_transactionID))&& - (transactionListContract.getTransactionExistance(_transactionID))){ - - if (transactions[_transactionID].senderContract == address(this)) { - transactions[_transactionID].confirmed=true; - if ((transactions[_transactionID].senderContract == thisBankContract) || - (isRegulatorNode)) - balance-=transactions[_transactionID].value; - - bankContract destinationContract = bankContract(transactions[_transactionID].destinationContract); - - destinationContract.confirmTransactionPair(_transactionID); - } - - } -} - -/*confirmTransactionPair: updates the balance of the other leg of the -transaction. Can only be called by a bank contract address -*/ -function confirmTransactionPair(bytes32 _transactionID) validSenderContract { - - if (!transactions[_transactionID].confirmed) { - transactions[_transactionID].confirmed=true; - - if (transactions[_transactionID].destinationContract == address(this)) - if ((transactions[_transactionID].destinationContract == thisBankContract)||(isRegulatorNode)) - balance+=transactions[_transactionID].value; - - if (transactions[_transactionID].senderContract == address(this)) - if ((transactions[_transactionID].senderContract == thisBankContract)||(isRegulatorNode)) - balance-=transactions[_transactionID].value; - } - - -} - -} - -/*Contract regulatorTransactionList -Must be deployed as a PUBLIC contract -Maintains a public transaction log without sensitive information like banks -involved and values. Additionally it maintains a public bank list, including -transaction and contract addresses. -*/ - -contract regulatorTransactionList { - - struct transaction { - bool exists; - uint timestamp; - bool blocked; -} - -struct Bank { - string name; - bool authorized; - bool exists; - address authorizedSender; -} - - address public regulator; - - mapping (bytes32 => transaction) public transactions; - - mapping (address => Bank) public banks; - - modifier onlyRegulator() { if (msg.sender != regulator) throw;_ - } - - function regulatorTransactionList() { - regulator=msg.sender; - } - - function addTransaction (bytes32 _transactionID) { - transactions[_transactionID].exists=true; - transactions[_transactionID].timestamp=block.timestamp; - transactions[_transactionID].blocked=false; - } - - function getTransactionExistance (bytes32 _transactionID) public constant - returns (bool) { - return (transactions[_transactionID].exists); -} - - function getTransactionState (bytes32 _transactionID) public constant - returns (bool) { - return (transactions[_transactionID].blocked); -} - - function getTransactionTimestamp (bytes32 _transactionID) public constant - returns (uint) { - return (transactions[_transactionID].timestamp); -} - - function getBankExistance (address _contract) public constant - returns (bool) { - return (banks[_contract].exists); -} - - function getBankState (address _contract) public constant - returns (bool) { - return (banks[_contract].authorized); -} - -function getBankSender (address _contract) public constant - returns (address) { - return (banks[_contract].authorizedSender); -} - -function getRegulator () public constant - returns (address) { - return (regulator); -} - -function blockTransaction(bytes32 _transactionID) onlyRegulator { - if (transactions[_transactionID].exists) { - transactions[_transactionID].blocked=true; - } -} - -function unblockTransaction(bytes32 _transactionID) onlyRegulator { - if (transactions[_transactionID].exists) { - transactions[_transactionID].blocked=false; - } -} - -function addBank (string _name, address _contract, address _sender) onlyRegulator { - banks[_contract].name=_name; - banks[_contract].exists=true; - banks[_contract].authorized=true; - banks[_contract].authorizedSender=_sender; -} - -function blockBank (address _contract) onlyRegulator { - banks[_contract].authorized=false; -} - -function authorizeBank (address _contract) onlyRegulator { - banks[_contract].authorized=true; -} - -} \ No newline at end of file diff --git a/examples/5nodesRTGS/deploy-bankContract-0-3-6.js b/examples/5nodesRTGS/deploy-bankContract-0-3-6.js index 2977dbc0..ff271589 100644 --- a/examples/5nodesRTGS/deploy-bankContract-0-3-6.js +++ b/examples/5nodesRTGS/deploy-bankContract-0-3-6.js @@ -5,7 +5,7 @@ var bankcontractContract = web3.eth.contract([{"constant":false,"inputs":[{"name var bankcontract = bankcontractContract.new( { from: web3.eth.accounts[0], - data: '606060405260006000600050556000600160146101000a81548160ff02191690830217905550603c60026000505560006004600050555b33600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b611e99806100706000396000f360606040523615610103576000357c0100000000000000000000000000000000000000000000000000000000900480633c97239714610105578063422753681461011d57806343e92862146101355780635ac2d89414610194578063642f2eaf146101ac578063679e9f3a1461022257806369184f1514610245578063692a4e511461025d578063694fc108146102825780637a2dc88a146102bb5780638092f405146102f4578063859376701461030c578063885cbbab14610374578063a153ed6d14610383578063b69ef8a81461039b578063b9a60038146103be578063c3cb5b89146103e1578063dd8fee1414610411578063fb1669ca1461044a57610103565b005b61011b6004808035906020019091905050610462565b005b6101336004808035906020019091905050610a6b565b005b6101926004808035906020019091908035906020019082018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050909091905050610ad5565b005b6101aa6004808035906020019091905050610d62565b005b6101c26004808035906020019091905050611276565b604051808681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183151581526020018281526020019550505050505060405180910390f35b61022f6004805050611302565b6040518082815260200191505060405180910390f35b61025b600480803590602001909190505061130b565b005b61026a6004805050611396565b60405180821515815260200191505060405180910390f35b61028f60048050506113a9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102c860048050506113cf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61030a60048080359060200190919050506113f5565b005b6103726004808035906020019091908035906020019091908035906020019082018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050909091905050611480565b005b6103816004805050611988565b005b6103996004808035906020019091905050611a00565b005b6103a86004805050611ddc565b6040518082815260200191505060405180910390f35b6103cb6004805050611de5565b6040518082815260200191505060405180910390f35b6103f76004808035906020019091905050611dee565b604051808260001916815260200191505060405180910390f35b61041e6004805050611e09565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104606004808035906020019091905050611e2f565b005b600060006000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104c457610002565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250600660005060008560001916815260200190815260200160002060005060020160149054906101000a900460ff1615801561059857508273ffffffffffffffffffffffffffffffffffffffff1663c71cca1685604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150155b801561061757508273ffffffffffffffffffffffffffffffffffffffff1663054380f985604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001505b15610a64576001600660005060008660001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055503073ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561085b57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061076f5750600160149054906101000a900460ff165b156107aa5760066000506000856000191681526020019081526020016000206000506000016000505460006000828282505401925050819055505b600660005060008560001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d85604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506000604051808303816000876161da5a03f115610002575050505b3073ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6357600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806109775750600160149054906101000a900460ff165b156109b25760066000506000856000191681526020019081526020016000206000506000016000505460006000828282505403925050819055505b600660005060008560001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a153ed6d85604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506000604051808303816000876161da5a03f115610002575050505b5b5b50505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ac757610002565b806002600050819055505b50565b60006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf33604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001501515610b9257610002565b3330854286604051808673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018280519060200190808383829060006004602084601f0104600302600f01f1509050019550505050505060405180910390209150815081600760005060006004600050548152602001908152602001600020600050819055508360066000506000846000191681526020019081526020016000206000506000016000508190555033600660005060008460001916815260200190815260200160002060005060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff0219169083021790555030600660005060008460001916815260200190815260200160002060005060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055506000600660005060008460001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055506004600081815054809291906001019190505550505b505050565b600060006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635065426030604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f115610002575050506040518051906020015073ffffffffffffffffffffffffffffffffffffffff16141515610e4f57610002565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506002600050548373ffffffffffffffffffffffffffffffffffffffff16632fbff52086604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001504203118015610f2b5750600660005060008560001916815260200190815260200160002060005060020160149054906101000a900460ff16155b8015610fab57508273ffffffffffffffffffffffffffffffffffffffff1663c71cca1685604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150155b801561102a57508273ffffffffffffffffffffffffffffffffffffffff1663054380f985604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001505b1561126f573073ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561126e576001600660005060008660001916815260200190815260200160002060005060020160146101000a81548160ff02191690830217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806111825750600160149054906101000a900460ff165b156111bd5760066000506000856000191681526020019081526020016000206000506000016000505460006000828282505403925050819055505b600660005060008560001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d85604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506000604051808303816000876161da5a03f115610002575050505b5b505b505050565b60066000506020528060005260406000206000915090508060000160005054908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160149054906101000a900460ff16908060030160005054905085565b60026000505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561136757610002565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b50565b600160149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145157610002565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b50565b60006000600060006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635065426030604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f115610002575050506040518051906020015073ffffffffffffffffffffffffffffffffffffffff1614151561157157610002565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692503088884289604051808673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018280519060200190808383829060006004602084601f0104600302600f01f1509050019550505050505060405180910390209350835083600760005060006004600050548152602001908152602001600020600050819055508273ffffffffffffffffffffffffffffffffffffffff1663288bdecf89604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150158061177557508273ffffffffffffffffffffffffffffffffffffffff16638c41eae630604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150155b1561177f57610002565b8791508173ffffffffffffffffffffffffffffffffffffffff166343e928628888604051837c010000000000000000000000000000000000000000000000000000000002815260040180838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561182b5780820380516001836020036101000a031916815260200191505b5093505050506000604051808303816000876161da5a03f115610002575050508660066000506000866000191681526020019081526020016000206000506000016000508190555030600660005060008660001916815260200190815260200160002060005060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff0219169083021790555087600660005060008660001916815260200190815260200160002060005060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055506000600050546006600050600086600019168152602001908152602001600020600050600301600050819055506000600660005060008660001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055506004600081815054809291906001019190505550505b50505050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119e457610002565b6001600160146101000a81548160ff021916908302179055505b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf33604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001501515611abb57610002565b600660005060008360001916815260200190815260200160002060005060020160149054906101000a900460ff161515611dd7576001600660005060008460001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055503073ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c7e57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611c425750600160149054906101000a900460ff165b15611c7d5760066000506000836000191681526020019081526020016000206000506000016000505460006000828282505401925050819055505b5b3073ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611dd657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611d9a5750600160149054906101000a900460ff165b15611dd55760066000506000836000191681526020019081526020016000206000506000016000505460006000828282505403925050819055505b5b5b505b50565b60006000505481565b60046000505481565b60076000506020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e8b57610002565b806000600050819055505b5056', + data: '0x606060405260006000600050556000600160146101000a81548160ff02191690830217905550603c60026000505560006004600050555b33600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b611e99806100706000396000f360606040523615610103576000357c0100000000000000000000000000000000000000000000000000000000900480633c97239714610105578063422753681461011d57806343e92862146101355780635ac2d89414610194578063642f2eaf146101ac578063679e9f3a1461022257806369184f1514610245578063692a4e511461025d578063694fc108146102825780637a2dc88a146102bb5780638092f405146102f4578063859376701461030c578063885cbbab14610374578063a153ed6d14610383578063b69ef8a81461039b578063b9a60038146103be578063c3cb5b89146103e1578063dd8fee1414610411578063fb1669ca1461044a57610103565b005b61011b6004808035906020019091905050610462565b005b6101336004808035906020019091905050610a6b565b005b6101926004808035906020019091908035906020019082018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050909091905050610ad5565b005b6101aa6004808035906020019091905050610d62565b005b6101c26004808035906020019091905050611276565b604051808681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183151581526020018281526020019550505050505060405180910390f35b61022f6004805050611302565b6040518082815260200191505060405180910390f35b61025b600480803590602001909190505061130b565b005b61026a6004805050611396565b60405180821515815260200191505060405180910390f35b61028f60048050506113a9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102c860048050506113cf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61030a60048080359060200190919050506113f5565b005b6103726004808035906020019091908035906020019091908035906020019082018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050909091905050611480565b005b6103816004805050611988565b005b6103996004808035906020019091905050611a00565b005b6103a86004805050611ddc565b6040518082815260200191505060405180910390f35b6103cb6004805050611de5565b6040518082815260200191505060405180910390f35b6103f76004808035906020019091905050611dee565b604051808260001916815260200191505060405180910390f35b61041e6004805050611e09565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104606004808035906020019091905050611e2f565b005b600060006000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104c457610002565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169250600660005060008560001916815260200190815260200160002060005060020160149054906101000a900460ff1615801561059857508273ffffffffffffffffffffffffffffffffffffffff1663c71cca1685604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150155b801561061757508273ffffffffffffffffffffffffffffffffffffffff1663054380f985604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001505b15610a64576001600660005060008660001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055503073ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561085b57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061076f5750600160149054906101000a900460ff165b156107aa5760066000506000856000191681526020019081526020016000206000506000016000505460006000828282505401925050819055505b600660005060008560001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d85604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506000604051808303816000876161da5a03f115610002575050505b3073ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6357600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806109775750600160149054906101000a900460ff165b156109b25760066000506000856000191681526020019081526020016000206000506000016000505460006000828282505403925050819055505b600660005060008560001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a153ed6d85604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506000604051808303816000876161da5a03f115610002575050505b5b5b50505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ac757610002565b806002600050819055505b50565b60006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf33604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001501515610b9257610002565b3330854286604051808673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018280519060200190808383829060006004602084601f0104600302600f01f1509050019550505050505060405180910390209150815081600760005060006004600050548152602001908152602001600020600050819055508360066000506000846000191681526020019081526020016000206000506000016000508190555033600660005060008460001916815260200190815260200160002060005060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff0219169083021790555030600660005060008460001916815260200190815260200160002060005060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055506000600660005060008460001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055506004600081815054809291906001019190505550505b505050565b600060006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635065426030604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f115610002575050506040518051906020015073ffffffffffffffffffffffffffffffffffffffff16141515610e4f57610002565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506002600050548373ffffffffffffffffffffffffffffffffffffffff16632fbff52086604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001504203118015610f2b5750600660005060008560001916815260200190815260200160002060005060020160149054906101000a900460ff16155b8015610fab57508273ffffffffffffffffffffffffffffffffffffffff1663c71cca1685604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150155b801561102a57508273ffffffffffffffffffffffffffffffffffffffff1663054380f985604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001505b1561126f573073ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561126e576001600660005060008660001916815260200190815260200160002060005060020160146101000a81548160ff02191690830217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008660001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806111825750600160149054906101000a900460ff165b156111bd5760066000506000856000191681526020019081526020016000206000506000016000505460006000828282505403925050819055505b600660005060008560001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d85604051827c010000000000000000000000000000000000000000000000000000000002815260040180826000191681526020019150506000604051808303816000876161da5a03f115610002575050505b5b505b505050565b60066000506020528060005260406000206000915090508060000160005054908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160149054906101000a900460ff16908060030160005054905085565b60026000505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561136757610002565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b50565b600160149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145157610002565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b50565b60006000600060006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16635065426030604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f115610002575050506040518051906020015073ffffffffffffffffffffffffffffffffffffffff1614151561157157610002565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692503088884289604051808673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018280519060200190808383829060006004602084601f0104600302600f01f1509050019550505050505060405180910390209350835083600760005060006004600050548152602001908152602001600020600050819055508273ffffffffffffffffffffffffffffffffffffffff1663288bdecf89604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150158061177557508273ffffffffffffffffffffffffffffffffffffffff16638c41eae630604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f1156100025750505060405180519060200150155b1561177f57610002565b8791508173ffffffffffffffffffffffffffffffffffffffff166343e928628888604051837c010000000000000000000000000000000000000000000000000000000002815260040180838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561182b5780820380516001836020036101000a031916815260200191505b5093505050506000604051808303816000876161da5a03f115610002575050508660066000506000866000191681526020019081526020016000206000506000016000508190555030600660005060008660001916815260200190815260200160002060005060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff0219169083021790555087600660005060008660001916815260200190815260200160002060005060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055506000600050546006600050600086600019168152602001908152602001600020600050600301600050819055506000600660005060008660001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055506004600081815054809291906001019190505550505b50505050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119e457610002565b6001600160146101000a81548160ff021916908302179055505b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf33604051827c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506020604051808303816000876161da5a03f11561000257505050604051805190602001501515611abb57610002565b600660005060008360001916815260200190815260200160002060005060020160149054906101000a900460ff161515611dd7576001600660005060008460001916815260200190815260200160002060005060020160146101000a81548160ff021916908302179055503073ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c7e57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611c425750600160149054906101000a900460ff165b15611c7d5760066000506000836000191681526020019081526020016000206000506000016000505460006000828282505401925050819055505b5b3073ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611dd657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600660005060008460001916815260200190815260200160002060005060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611d9a5750600160149054906101000a900460ff165b15611dd55760066000506000836000191681526020019081526020016000206000506000016000505460006000828282505403925050819055505b5b5b505b50565b60006000505481565b60046000505481565b60076000506020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e8b57610002565b806000600050819055505b5056', gas: '4700000', privateFor: ["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="] }, function (e, contract){ diff --git a/examples/5nodesRTGS/deploy-regulatorTransactionList-0-3-6.js b/examples/5nodesRTGS/deploy-regulatorTransactionList-0-3-6.js index 0f52f22e..ccf31446 100644 --- a/examples/5nodesRTGS/deploy-regulatorTransactionList-0-3-6.js +++ b/examples/5nodesRTGS/deploy-regulatorTransactionList-0-3-6.js @@ -4,7 +4,7 @@ var regulatortransactionlistContract = web3.eth.contract([{"constant":true,"inpu var regulatortransactionlist = regulatortransactionlistContract.new( { from: web3.eth.accounts[0], - data: '60606040525b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b610c678061003f6000396000f3606060405236156100d7576000357c010000000000000000000000000000000000000000000000000000000090048063054380f9146100d95780631eaa25561461010757806321574ff81461016f578063288bdecf146101875780632fbff520146101b557806350654260146101e1578063642f2eaf146102235780636f74a2c01461026157806380c3b8c2146102795780638c41eae61461035657806394bbaa8014610384578063b809e2f91461039c578063c71cca16146103b4578063dd8fee14146103e2578063e5f9f94d1461041b576100d7565b005b6100ef6004808035906020019091905050610433565b60405180821515815260200191505060405180910390f35b61016d6004808035906020019082018035906020019191908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505090909190803590602001909190803590602001909190505061046f565b005b610185600480803590602001909190505061069b565b005b61019d6004808035906020019091905050610744565b60405180821515815260200191505060405180910390f35b6101cb6004808035906020019091905050610792565b6040518082815260200191505060405180910390f35b6101f760048080359060200190919050506107c4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102396004808035906020019091905050610825565b6040518084151581526020018381526020018215158152602001935050505060405180910390f35b610277600480803590602001909190505061086f565b005b61028f6004808035906020019091905050610918565b6040518080602001851515815260200184151581526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252868181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156103445780601f1061031957610100808354040283529160200191610344565b820191906000526020600020905b81548152906001019060200180831161032757829003601f168201915b50509550505050505060405180910390f35b61036c6004808035906020019091905050610987565b60405180821515815260200191505060405180910390f35b61039a60048080359060200190919050506109d5565b005b6103b26004808035906020019091905050610a6f565b005b6103ca6004808035906020019091905050610b3a565b60405180821515815260200191505060405180910390f35b6103ef6004805050610b76565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104316004808035906020019091905050610b9c565b005b6000600160005060008360001916815260200190815260200160002060005060000160009054906101000a900460ff16905061046a565b919050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104cb57610002565b82600260005060008473ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000506000016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061054a57805160ff191683800117855561057b565b8280016001018555821561057b579182015b8281111561057a57825182600050559160200191906001019061055c565b5b5090506105a69190610588565b808211156105a25760008181506000905550600101610588565b5090565b50506001600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160016101000a81548160ff021916908302179055506001600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160006101000a81548160ff0219169083021790555080600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b505050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106f757610002565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160006101000a81548160ff021916908302179055505b50565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160019054906101000a900460ff16905061078d565b919050565b600060016000506000836000191681526020019081526020016000206000506001016000505490506107bf565b919050565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610820565b919050565b60016000506020528060005260406000206000915090508060000160009054906101000a900460ff16908060010160005054908060020160009054906101000a900460ff16905083565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108cb57610002565b6001600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160006101000a81548160ff021916908302179055505b50565b600260005060205280600052604060002060009150905080600001600050908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160009054906101000a900460ff1690506109d0565b919050565b6001600160005060008360001916815260200190815260200160002060005060000160006101000a81548160ff02191690830217905550426001600050600083600019168152602001908152602001600020600050600101600050819055506000600160005060008360001916815260200190815260200160002060005060020160006101000a81548160ff021916908302179055505b50565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610acb57610002565b600160005060008260001916815260200190815260200160002060005060000160009054906101000a900460ff1615610b36576000600160005060008360001916815260200190815260200160002060005060020160006101000a81548160ff021916908302179055505b5b50565b6000600160005060008360001916815260200190815260200160002060005060020160009054906101000a900460ff169050610b71565b919050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610bf857610002565b600160005060008260001916815260200190815260200160002060005060000160009054906101000a900460ff1615610c63576001600160005060008360001916815260200190815260200160002060005060020160006101000a81548160ff021916908302179055505b5b5056', + data: '0x60606040525b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b610c678061003f6000396000f3606060405236156100d7576000357c010000000000000000000000000000000000000000000000000000000090048063054380f9146100d95780631eaa25561461010757806321574ff81461016f578063288bdecf146101875780632fbff520146101b557806350654260146101e1578063642f2eaf146102235780636f74a2c01461026157806380c3b8c2146102795780638c41eae61461035657806394bbaa8014610384578063b809e2f91461039c578063c71cca16146103b4578063dd8fee14146103e2578063e5f9f94d1461041b576100d7565b005b6100ef6004808035906020019091905050610433565b60405180821515815260200191505060405180910390f35b61016d6004808035906020019082018035906020019191908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505090909190803590602001909190803590602001909190505061046f565b005b610185600480803590602001909190505061069b565b005b61019d6004808035906020019091905050610744565b60405180821515815260200191505060405180910390f35b6101cb6004808035906020019091905050610792565b6040518082815260200191505060405180910390f35b6101f760048080359060200190919050506107c4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102396004808035906020019091905050610825565b6040518084151581526020018381526020018215158152602001935050505060405180910390f35b610277600480803590602001909190505061086f565b005b61028f6004808035906020019091905050610918565b6040518080602001851515815260200184151581526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252868181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156103445780601f1061031957610100808354040283529160200191610344565b820191906000526020600020905b81548152906001019060200180831161032757829003601f168201915b50509550505050505060405180910390f35b61036c6004808035906020019091905050610987565b60405180821515815260200191505060405180910390f35b61039a60048080359060200190919050506109d5565b005b6103b26004808035906020019091905050610a6f565b005b6103ca6004808035906020019091905050610b3a565b60405180821515815260200191505060405180910390f35b6103ef6004805050610b76565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104316004808035906020019091905050610b9c565b005b6000600160005060008360001916815260200190815260200160002060005060000160009054906101000a900460ff16905061046a565b919050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104cb57610002565b82600260005060008473ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000506000016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061054a57805160ff191683800117855561057b565b8280016001018555821561057b579182015b8281111561057a57825182600050559160200191906001019061055c565b5b5090506105a69190610588565b808211156105a25760008181506000905550600101610588565b5090565b50506001600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160016101000a81548160ff021916908302179055506001600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160006101000a81548160ff0219169083021790555080600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908302179055505b505050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106f757610002565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160006101000a81548160ff021916908302179055505b50565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160019054906101000a900460ff16905061078d565b919050565b600060016000506000836000191681526020019081526020016000206000506001016000505490506107bf565b919050565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610820565b919050565b60016000506020528060005260406000206000915090508060000160009054906101000a900460ff16908060010160005054908060020160009054906101000a900460ff16905083565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108cb57610002565b6001600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160006101000a81548160ff021916908302179055505b50565b600260005060205280600052604060002060009150905080600001600050908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000600260005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060010160009054906101000a900460ff1690506109d0565b919050565b6001600160005060008360001916815260200190815260200160002060005060000160006101000a81548160ff02191690830217905550426001600050600083600019168152602001908152602001600020600050600101600050819055506000600160005060008360001916815260200190815260200160002060005060020160006101000a81548160ff021916908302179055505b50565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610acb57610002565b600160005060008260001916815260200190815260200160002060005060000160009054906101000a900460ff1615610b36576000600160005060008360001916815260200190815260200160002060005060020160006101000a81548160ff021916908302179055505b5b50565b6000600160005060008360001916815260200190815260200160002060005060020160009054906101000a900460ff169050610b71565b919050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610bf857610002565b600160005060008260001916815260200190815260200160002060005060000160009054906101000a900460ff1615610c63576001600160005060008360001916815260200190815260200160002060005060020160006101000a81548160ff021916908302179055505b5b5056', gas: '4700000' }, function (e, contract){ diff --git a/examples/5nodesRTGS/genesis.json b/examples/5nodesRTGS/genesis.json index b50c821d..3f3b3f2a 100644 --- a/examples/5nodesRTGS/genesis.json +++ b/examples/5nodesRTGS/genesis.json @@ -1,45 +1,16 @@ { - "alloc": { - "0x0000000000000000000000000000000000000020": { - "code": "606060405236156100c45760e060020a60003504631290948581146100c9578063284d163c146100f957806342169e4814610130578063488099a6146101395780634fe437d514610154578063559c390c1461015d57806368bb8bb61461025d57806372a571fc146102c857806386c1ff681461036957806398ba676d146103a0578063a7771ee31461040b578063adfaa72e14610433578063cf5289851461044e578063de8fa43114610457578063e814d1c71461046d578063f4ab9adf14610494575b610002565b610548600435600160a060020a03331660009081526003602052604090205460ff16156100c45760018190555b50565b610548600435600160a060020a03331660009081526005602052604090205460ff16156100c4576004546001141561055e57610002565b61045b60025481565b61054a60043560056020526000908152604090205460ff1681565b61045b60015481565b61045b60043560006000600060006000600050600186038154811015610002579080526002027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630192505b60018301548110156105d75760018301805484916000918490811015610002576000918252602080832090910154835282810193909352604091820181205485825292869052205410801561023257506001805490840180548591600091859081101561000257906000526020600020900160005054815260208101919091526040016000205410155b156102555760018301805482908110156100025760009182526020909120015491505b6001016101a8565b610548600435602435600160a060020a03331660009081526003602052604081205460ff16156100c4578054839010156105e45780548084038101808355908290829080158290116105df576002028160020283600052602060002091820191016105df919061066b565b610548600435600160a060020a03331660009081526005602052604090205460ff16156100c457600160a060020a0381166000908152604090205460ff1615156100f65760406000819020805460ff191660019081179091556004805490910190558051600160a060020a038316815290517f1a4ce6942f7aa91856332e618fc90159f13a340611a308f5d7327ba0707e56859181900360200190a16100f6565b610548600435600160a060020a03331660009081526003602052604090205460ff16156100c4576002546001141561071457610002565b61045b600435602435600060006000600050600185038154811015610002579080526002027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630181509050806001016000508381548110156100025750825250602090200154919050565b61054a600435600160a060020a03811660009081526003602052604090205460ff165b919050565b61054a60043560036020526000908152604090205460ff1681565b61045b60045481565b6000545b60408051918252519081900360200190f35b61054a600435600160a060020a03811660009081526005602052604090205460ff1661042e565b610548600435600160a060020a03331660009081526003602052604090205460ff16156100c457600160a060020a03811660009081526003602052604090205460ff1615156100f65760406000818120600160a060020a0384169182905260036020908152815460ff1916600190811790925560028054909201909155825191825291517f0ad2eca75347acd5160276fe4b5dad46987e4ff4af9e574195e3e9bc15d7e0ff929181900390910190a16100f6565b005b604080519115158252519081900360200190f35b600160a060020a03811660009081526005602052604090205460ff16156100f65760406000819020805460ff19169055600480546000190190558051600160a060020a038316815290517f8cee3054364d6799f1c8962580ad61273d9d38ca1ff26516bd1ad23c099a60229181900360200190a16100f6565b509392505050565b505050505b60008054600019850190811015610002578382526002027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563016020819052604082205490925014156106b8578060010160005080548060010182818154818355818115116106a5578183600052602060002091820191016106a5919061068d565b50506002015b808211156106a157600181018054600080835591825260208220610665918101905b808211156106a1576000815560010161068d565b5090565b5050506000928352506020909120018290555b600082815260208281526040918290208054600101905581514381529081018490528151600160a060020a033316927f3d03ba7f4b5227cdb385f2610906e5bcee147171603ec40005b30915ad20e258928290030190a2505050565b600160a060020a03811660009081526003602052604090205460ff16156100f65760406000819020805460ff19169055600280546000190190558051600160a060020a038316815290517f183393fc5cffbfc7d03d623966b85f76b9430f42d3aada2ac3f3deabc78899e89181900360200190a16100f656", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "0x02", - - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x04", - "0x29ecdbdf95c7f6ceec92d6150c697aa14abeb0f8595dd58d808842ea237d8494": "0x01", - "0x6aa118c6537572d8b515a9f9154be55a3377a8de7991cd23bf6e5ceb368688e3": "0x01", - "0x50793743212c6f01d326957d7069005b912f8215f10c7536be6b10782c6c44cd": "0x01", - "0x38f6c908c5cc7ca668cec2f476abe61b4dbb1df20f0ad8e07ef5dbf6a2f1ffd4": "0x01", - - "0x0000000000000000000000000000000000000000000000000000000000000004": "0x02", - "0xaca3b76ed4968740c3180dd7fa37f4aa229a2c758a848f53920e9ccb4c4bb74e": "0x01", - "0xd188ba2dc293670542c1befaf7678b0859e5354a0727d1188b2afb6f47fe24d1": "0x01" - } - - }, - "0xed9d02e382b34818e88b88a309c7fe71e65f419d": { - "balance": "1000000000000000000000000000" - }, - "0xca843569e3427144cead5e4d5999a3d0ccf92b8e": { - "balance": "1000000000000000000000000000" - }, - "0x0fbdc686b912d7722dc86510934589e0aaf3b55a": { - "balance": "1000000000000000000000000000" - }, - "0x9186eb3d20cbd1f5f992a950d808c4495153abd5": { - "balance": "1000000000000000000000000000" - }, - "0x0638e1574728b6d862dd5d3a3e0942c3be47d996": { - "balance": "1000000000000000000000000000" - } - }, + "alloc": {}, "coinbase": "0x0000000000000000000000000000000000000000", "config": { - "homesteadBlock": 0 + "homesteadBlock": 0, + "chainId": 1, + "eip155Block": null, + "eip158Block": null, + "isQuorum": true }, "difficulty": "0x0", - "extraData": "0x", - "gasLimit": "0x2FEFD800", + "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0xE0000000", "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578", "nonce": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", diff --git a/examples/5nodesRTGS/init.sh b/examples/5nodesRTGS/init.sh deleted file mode 100644 index 1c138e2f..00000000 --- a/examples/5nodesRTGS/init.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -set -u -set -e - -echo "[*] Cleaning up temporary data directories" -rm -rf qdata -mkdir -p qdata/logs - -echo "[*] Configuring node 1: Bank 1" -mkdir -p qdata/dd1/keystore -cp keys/key1 qdata/dd1/keystore -geth --datadir qdata/dd1 init genesis.json - -echo "[*] Configuring node 2 as block maker and voter: Bank 2" -mkdir -p qdata/dd2/keystore -cp keys/key2 qdata/dd2/keystore -cp keys/key3 qdata/dd2/keystore -geth --datadir qdata/dd2 init genesis.json - -echo "[*] Configuring node 3 as voter: Bank 3" -mkdir -p qdata/dd3/keystore -cp keys/key4 qdata/dd3/keystore -geth --datadir qdata/dd3 init genesis.json - -echo "[*] Configuring node 4 as voter: Regulator" -mkdir -p qdata/dd4/keystore -cp keys/key5 qdata/dd4/keystore -geth --datadir qdata/dd4 init genesis.json - -echo "[*] Configuring node 5: Observer" -mkdir -p qdata/dd5/keystore -geth --datadir qdata/dd5 init genesis.json - diff --git a/examples/5nodesRTGS/runscript.sh b/examples/5nodesRTGS/runscript.sh deleted file mode 100644 index cf69fe89..00000000 --- a/examples/5nodesRTGS/runscript.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -PRIVATE_CONFIG=tm1.conf geth --exec "loadScript(\"$1\")" attach ipc:qdata/dd1/geth.ipc diff --git a/examples/5nodesRTGS/start.sh b/examples/5nodesRTGS/start.sh deleted file mode 100644 index 6c4323ed..00000000 --- a/examples/5nodesRTGS/start.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -set -u -set -e -NETID=87234 -BOOTNODE_KEYHEX=77bd02ffa26e3fb8f324bda24ae588066f1873d95680104de5bc2db9e7b2e510 -BOOTNODE_ENODE=enode://6433e8fb82c4638a8a6d499d40eb7d8158883219600bfd49acb968e3a37ccced04c964fa87b3a78a2da1b71dc1b90275f4d055720bb67fad4a118a56925125dc@[127.0.0.1]:33445 - -GLOBAL_ARGS="--bootnodes $BOOTNODE_ENODE --networkid $NETID --rpc --rpcaddr 0.0.0.0 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum" - -echo "[*] Starting Constellation nodes" -nohup constellation-node tm1.conf 2>> qdata/logs/constellation1.log & -sleep 10 -nohup constellation-node tm2.conf 2>> qdata/logs/constellation2.log & -nohup constellation-node tm3.conf 2>> qdata/logs/constellation3.log & -nohup constellation-node tm4.conf 2>> qdata/logs/constellation4.log & -nohup constellation-node tm5.conf 2>> qdata/logs/constellation5.log & - -echo "[*] Starting bootnode" -nohup bootnode --nodekeyhex "$BOOTNODE_KEYHEX" --addr="127.0.0.1:33445" 2>>qdata/logs/bootnode.log & -echo "wait for bootnode to start..." -sleep 6 - -echo "[*] Starting node 1: Bank 1" -PRIVATE_CONFIG=tm1.conf nohup geth --datadir qdata/dd1 $GLOBAL_ARGS --rpcport 22000 --port 21000 --unlock 0 --password passwords.txt 2>>qdata/logs/1.log & - -echo "[*] Starting node 2: Bank 2" -PRIVATE_CONFIG=tm2.conf nohup geth --datadir qdata/dd2 $GLOBAL_ARGS --rpcport 22001 --port 21001 --voteaccount "0x0fbdc686b912d7722dc86510934589e0aaf3b55a" --votepassword "" --blockmakeraccount "0xca843569e3427144cead5e4d5999a3d0ccf92b8e" --blockmakerpassword "" --singleblockmaker --minblocktime 2 --maxblocktime 5 2>>qdata/logs/2.log & - -echo "[*] Starting node 3: Bank 3" -PRIVATE_CONFIG=tm3.conf nohup geth --datadir qdata/dd3 $GLOBAL_ARGS --rpcport 22003 --port 21003 --voteaccount "0x9186eb3d20cbd1f5f992a950d808c4495153abd5" --votepassword "" 2>>qdata/logs/3.log & - -echo "[*] Starting node 4: Regulator" -PRIVATE_CONFIG=tm4.conf nohup geth --datadir qdata/dd4 $GLOBAL_ARGS --rpcport 22004 --port 21004 --voteaccount "0x0638e1574728b6d862dd5d3a3e0942c3be47d996" --votepassword "" 2>>qdata/logs/4.log & - -echo "[*] Starting node 5: Observer" -PRIVATE_CONFIG=tm5.conf nohup geth --datadir qdata/dd5 $GLOBAL_ARGS --rpcport 22005 --port 21005 2>>qdata/logs/5.log & - - -echo "All nodes configured. See 'qdata/logs' for logs, and run 'geth attach qdata/dd4/geth.ipc' to attach to the regulator Geth node" diff --git a/examples/5nodesRTGS/stop.sh b/examples/5nodesRTGS/stop.sh old mode 100644 new mode 100755 diff --git a/examples/5nodesRTGS/tm1.conf b/examples/5nodesRTGS/tm1.conf index fb1efb99..bc5ff828 100644 --- a/examples/5nodesRTGS/tm1.conf +++ b/examples/5nodesRTGS/tm1.conf @@ -1,9 +1,48 @@ +# Externally accessible URL for this node (this is what's advertised) url = "http://127.0.0.1:9000/" + +# Port to listen on for the public API port = 9000 -socketPath = "qdata/tm1.ipc" -otherNodeUrls = [] -publicKeyPath = "keys/tm1.pub" -privateKeyPath = "keys/tm1.key" -archivalPublicKeyPath = "keys/tm1a.pub" -archivalPrivateKeyPath = "keys/tm1a.key" -storagePath = "qdata/constellation1" + +# Socket file to use for the private API / IPC +socket = "qdata/tm1.ipc" + +# Initial (not necessarily complete) list of other nodes in the network. +# Constellation will automatically connect to other nodes not in this list +# that are advertised by the nodes below, thus these can be considered the +# "boot nodes." +othernodes = [] + +# The set of public keys this node will host +publickeys = ["keys/tm1.pub"] + +# The corresponding set of private keys +privatekeys = ["keys/tm1.key"] + +# Optional comma-separated list of paths to public keys to add as recipients +# for every transaction sent through this node, e.g. for backup purposes. +# These keys must be advertised by some Constellation node on the network, i.e. +# be in a node's publickeys/privatekeys lists. +# alwayssendto = [] + +# Optional file containing the passwords to unlock the given privatekeys +# (one password per line -- add an empty line if one key isn't locked.) +# passwords = "passwords" + +# Where to store payloads and related information +storage = "dir:qdata/constellation1" + +# Optional IP whitelist for the public API. If unspecified/empty, +# connections from all sources will be allowed (but the private API remains +# accessible only via the IPC socket above.) To allow connections from +# localhost when a whitelist is defined, e.g. when running multiple +# Constellation nodes on the same machine, add "127.0.0.1" and "::1" to +# this list. +# ipwhitelist = ["10.0.0.1", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"] + +# Verbosity level (each level includes all prior levels) +# - 0: Only fatal errors +# - 1: Warnings +# - 2: Informational messages +# - 3: Debug messages +verbosity = 2 diff --git a/examples/5nodesRTGS/tm2.conf b/examples/5nodesRTGS/tm2.conf index e4c15073..570cdd59 100644 --- a/examples/5nodesRTGS/tm2.conf +++ b/examples/5nodesRTGS/tm2.conf @@ -1,9 +1,48 @@ +# Externally accessible URL for this node (this is what's advertised) url = "http://127.0.0.1:9001/" + +# Port to listen on for the public API port = 9001 -socketPath = "qdata/tm2.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm2.pub" -privateKeyPath = "keys/tm2.key" -archivalPublicKeyPath = "keys/tm2a.pub" -archivalPrivateKeyPath = "keys/tm2a.key" -storagePath = "qdata/constellation2" + +# Socket file to use for the private API / IPC +socket = "qdata/tm2.ipc" + +# Initial (not necessarily complete) list of other nodes in the network. +# Constellation will automatically connect to other nodes not in this list +# that are advertised by the nodes below, thus these can be considered the +# "boot nodes." +othernodes = ["http://127.0.0.1:9000/"] + +# The set of public keys this node will host +publickeys = ["keys/tm2.pub"] + +# The corresponding set of private keys +privatekeys = ["keys/tm2.key"] + +# Optional comma-separated list of paths to public keys to add as recipients +# for every transaction sent through this node, e.g. for backup purposes. +# These keys must be advertised by some Constellation node on the network, i.e. +# be in a node's publickeys/privatekeys lists. +# alwayssendto = [] + +# Optional file containing the passwords to unlock the given privatekeys +# (one password per line -- add an empty line if one key isn't locked.) +# passwords = "passwords" + +# Where to store payloads and related information +storage = "dir:qdata/constellation2" + +# Optional IP whitelist for the public API. If unspecified/empty, +# connections from all sources will be allowed (but the private API remains +# accessible only via the IPC socket above.) To allow connections from +# localhost when a whitelist is defined, e.g. when running multiple +# Constellation nodes on the same machine, add "127.0.0.1" and "::1" to +# this list. +# ipwhitelist = ["10.0.0.1", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"] + +# Verbosity level (each level includes all prior levels) +# - 0: Only fatal errors +# - 1: Warnings +# - 2: Informational messages +# - 3: Debug messages +verbosity = 2 diff --git a/examples/5nodesRTGS/tm3.conf b/examples/5nodesRTGS/tm3.conf index 4dca8ba0..ce8bd8e3 100644 --- a/examples/5nodesRTGS/tm3.conf +++ b/examples/5nodesRTGS/tm3.conf @@ -1,9 +1,48 @@ +# Externally accessible URL for this node (this is what's advertised) url = "http://127.0.0.1:9002/" + +# Port to listen on for the public API port = 9002 -socketPath = "qdata/tm3.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm3.pub" -privateKeyPath = "keys/tm3.key" -archivalPublicKeyPath = "keys/tm3a.pub" -archivalPrivateKeyPath = "keys/tm3a.key" -storagePath = "qdata/constellation3" + +# Socket file to use for the private API / IPC +socket = "qdata/tm3.ipc" + +# Initial (not necessarily complete) list of other nodes in the network. +# Constellation will automatically connect to other nodes not in this list +# that are advertised by the nodes below, thus these can be considered the +# "boot nodes." +othernodes = ["http://127.0.0.1:9000/"] + +# The set of public keys this node will host +publickeys = ["keys/tm3.pub"] + +# The corresponding set of private keys +privatekeys = ["keys/tm3.key"] + +# Optional comma-separated list of paths to public keys to add as recipients +# for every transaction sent through this node, e.g. for backup purposes. +# These keys must be advertised by some Constellation node on the network, i.e. +# be in a node's publickeys/privatekeys lists. +# alwayssendto = [] + +# Optional file containing the passwords to unlock the given privatekeys +# (one password per line -- add an empty line if one key isn't locked.) +# passwords = "passwords" + +# Where to store payloads and related information +storage = "dir:qdata/constellation3" + +# Optional IP whitelist for the public API. If unspecified/empty, +# connections from all sources will be allowed (but the private API remains +# accessible only via the IPC socket above.) To allow connections from +# localhost when a whitelist is defined, e.g. when running multiple +# Constellation nodes on the same machine, add "127.0.0.1" and "::1" to +# this list. +# ipwhitelist = ["10.0.0.1", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"] + +# Verbosity level (each level includes all prior levels) +# - 0: Only fatal errors +# - 1: Warnings +# - 2: Informational messages +# - 3: Debug messages +verbosity = 2 diff --git a/examples/5nodesRTGS/tm4.conf b/examples/5nodesRTGS/tm4.conf index c5c39aca..dae9be3d 100644 --- a/examples/5nodesRTGS/tm4.conf +++ b/examples/5nodesRTGS/tm4.conf @@ -1,9 +1,48 @@ +# Externally accessible URL for this node (this is what's advertised) url = "http://127.0.0.1:9003/" + +# Port to listen on for the public API port = 9003 -socketPath = "qdata/tm4.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm4.pub" -privateKeyPath = "keys/tm4.key" -archivalPublicKeyPath = "keys/tm4a.pub" -archivalPrivateKeyPath = "keys/tm4a.key" -storagePath = "qdata/constellation4" + +# Socket file to use for the private API / IPC +socket = "qdata/tm4.ipc" + +# Initial (not necessarily complete) list of other nodes in the network. +# Constellation will automatically connect to other nodes not in this list +# that are advertised by the nodes below, thus these can be considered the +# "boot nodes." +othernodes = ["http://127.0.0.1:9000/"] + +# The set of public keys this node will host +publickeys = ["keys/tm4.pub"] + +# The corresponding set of private keys +privatekeys = ["keys/tm4.key"] + +# Optional comma-separated list of paths to public keys to add as recipients +# for every transaction sent through this node, e.g. for backup purposes. +# These keys must be advertised by some Constellation node on the network, i.e. +# be in a node's publickeys/privatekeys lists. +# alwayssendto = [] + +# Optional file containing the passwords to unlock the given privatekeys +# (one password per line -- add an empty line if one key isn't locked.) +# passwords = "passwords" + +# Where to store payloads and related information +storage = "dir:qdata/constellation4" + +# Optional IP whitelist for the public API. If unspecified/empty, +# connections from all sources will be allowed (but the private API remains +# accessible only via the IPC socket above.) To allow connections from +# localhost when a whitelist is defined, e.g. when running multiple +# Constellation nodes on the same machine, add "127.0.0.1" and "::1" to +# this list. +# ipwhitelist = ["10.0.0.1", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"] + +# Verbosity level (each level includes all prior levels) +# - 0: Only fatal errors +# - 1: Warnings +# - 2: Informational messages +# - 3: Debug messages +verbosity = 2 diff --git a/examples/5nodesRTGS/tm5.conf b/examples/5nodesRTGS/tm5.conf index 91420465..56c8a44a 100644 --- a/examples/5nodesRTGS/tm5.conf +++ b/examples/5nodesRTGS/tm5.conf @@ -1,9 +1,48 @@ +# Externally accessible URL for this node (this is what's advertised) url = "http://127.0.0.1:9004/" + +# Port to listen on for the public API port = 9004 -socketPath = "qdata/tm5.ipc" -otherNodeUrls = ["http://127.0.0.1:9000/"] -publicKeyPath = "keys/tm5.pub" -privateKeyPath = "keys/tm5.key" -archivalPublicKeyPath = "keys/tm5a.pub" -archivalPrivateKeyPath = "keys/tm5a.key" -storagePath = "qdata/constellation5" + +# Socket file to use for the private API / IPC +socket = "qdata/tm5.ipc" + +# Initial (not necessarily complete) list of other nodes in the network. +# Constellation will automatically connect to other nodes not in this list +# that are advertised by the nodes below, thus these can be considered the +# "boot nodes." +othernodes = ["http://127.0.0.1:9000/"] + +# The set of public keys this node will host +publickeys = ["keys/tm5.pub"] + +# The corresponding set of private keys +privatekeys = ["keys/tm5.key"] + +# Optional comma-separated list of paths to public keys to add as recipients +# for every transaction sent through this node, e.g. for backup purposes. +# These keys must be advertised by some Constellation node on the network, i.e. +# be in a node's publickeys/privatekeys lists. +# alwayssendto = [] + +# Optional file containing the passwords to unlock the given privatekeys +# (one password per line -- add an empty line if one key isn't locked.) +# passwords = "passwords" + +# Where to store payloads and related information +storage = "dir:qdata/constellation5" + +# Optional IP whitelist for the public API. If unspecified/empty, +# connections from all sources will be allowed (but the private API remains +# accessible only via the IPC socket above.) To allow connections from +# localhost when a whitelist is defined, e.g. when running multiple +# Constellation nodes on the same machine, add "127.0.0.1" and "::1" to +# this list. +# ipwhitelist = ["10.0.0.1", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"] + +# Verbosity level (each level includes all prior levels) +# - 0: Only fatal errors +# - 1: Warnings +# - 2: Informational messages +# - 3: Debug messages +verbosity = 2 From 9a67aee43262994670a8ccb67fc178e95776363e Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 23 Nov 2017 18:55:17 +0000 Subject: [PATCH 14/31] Quorum v2.0.0 compatibility and raft consensus --- examples/5nodesRTGS/bootstrap.sh | 34 ++++++++++++++++++ examples/5nodesRTGS/raft-init.sh | 42 ++++++++++++++++++++++ examples/5nodesRTGS/raft-start.sh | 35 ++++++++++++++++++ examples/5nodesRTGS/raft/nodekey1 | 1 + examples/5nodesRTGS/raft/nodekey2 | 1 + examples/5nodesRTGS/raft/nodekey3 | 1 + examples/5nodesRTGS/raft/nodekey4 | 1 + examples/5nodesRTGS/raft/nodekey5 | 1 + examples/5nodesRTGS/raft/nodekey6 | 1 + examples/5nodesRTGS/raft/nodekey7 | 1 + examples/5nodesRTGS/raft/static-nodes.json | 7 ++++ 11 files changed, 125 insertions(+) create mode 100755 examples/5nodesRTGS/bootstrap.sh create mode 100755 examples/5nodesRTGS/raft-init.sh create mode 100755 examples/5nodesRTGS/raft-start.sh create mode 100644 examples/5nodesRTGS/raft/nodekey1 create mode 100644 examples/5nodesRTGS/raft/nodekey2 create mode 100644 examples/5nodesRTGS/raft/nodekey3 create mode 100644 examples/5nodesRTGS/raft/nodekey4 create mode 100644 examples/5nodesRTGS/raft/nodekey5 create mode 100644 examples/5nodesRTGS/raft/nodekey6 create mode 100644 examples/5nodesRTGS/raft/nodekey7 create mode 100644 examples/5nodesRTGS/raft/static-nodes.json diff --git a/examples/5nodesRTGS/bootstrap.sh b/examples/5nodesRTGS/bootstrap.sh new file mode 100755 index 00000000..e4da6807 --- /dev/null +++ b/examples/5nodesRTGS/bootstrap.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -eu -o pipefail + +# install build deps +add-apt-repository ppa:ethereum/ethereum +apt-get update +apt-get install -y build-essential unzip libdb-dev libleveldb-dev libsodium-dev zlib1g-dev libtinfo-dev solc sysvbanner wrk + +# install constellation +CREL=constellation-0.2.0-ubuntu1604 +wget -q https://github.com/jpmorganchase/constellation/releases/download/v0.2.0/$CREL.tar.xz +tar xfJ $CREL.tar.xz +cp $CREL/constellation-node /usr/local/bin && chmod 0755 /usr/local/bin/constellation-node +rm -rf $CREL + +# install golang +add-apt-repository ppa:gophers/archive +apt update +apt-get install golang-1.9-go + +# make/install quorum +git clone https://github.com/jpmorganchase/quorum.git +pushd quorum >/dev/null +git checkout tags/v2.0.0 +make all +cp build/bin/geth /usr/local/bin +cp build/bin/bootnode /usr/local/bin +popd >/dev/null + + +# done! +banner "Quorum" +echo +echo 'Quorum has been installed.' diff --git a/examples/5nodesRTGS/raft-init.sh b/examples/5nodesRTGS/raft-init.sh new file mode 100755 index 00000000..35c04c50 --- /dev/null +++ b/examples/5nodesRTGS/raft-init.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -u +set -e + +echo "[*] Cleaning up temporary data directories" +rm -rf qdata +mkdir -p qdata/logs + +echo "[*] Configuring node 1" +mkdir -p qdata/dd1/{keystore,geth} +cp raft/static-nodes.json qdata/dd1 +cp keys/key1 qdata/dd1/keystore +cp raft/nodekey1 qdata/dd1/geth/nodekey +geth --datadir qdata/dd1 init genesis.json + +echo "[*] Configuring node 2" +mkdir -p qdata/dd2/{keystore,geth} +cp raft/static-nodes.json qdata/dd2 +cp keys/key2 qdata/dd2/keystore +cp raft/nodekey2 qdata/dd2/geth/nodekey +geth --datadir qdata/dd2 init genesis.json + +echo "[*] Configuring node 3" +mkdir -p qdata/dd3/{keystore,geth} +cp raft/static-nodes.json qdata/dd3 +cp keys/key3 qdata/dd3/keystore +cp raft/nodekey3 qdata/dd3/geth/nodekey +geth --datadir qdata/dd3 init genesis.json + +echo "[*] Configuring node 4" +mkdir -p qdata/dd4/{keystore,geth} +cp raft/static-nodes.json qdata/dd4 +cp keys/key4 qdata/dd4/keystore +cp raft/nodekey4 qdata/dd4/geth/nodekey +geth --datadir qdata/dd4 init genesis.json + +echo "[*] Configuring node 5" +mkdir -p qdata/dd5/{keystore,geth} +cp raft/static-nodes.json qdata/dd5 +cp keys/key5 qdata/dd5/keystore +cp raft/nodekey5 qdata/dd5/geth/nodekey +geth --datadir qdata/dd5 init genesis.json diff --git a/examples/5nodesRTGS/raft-start.sh b/examples/5nodesRTGS/raft-start.sh new file mode 100755 index 00000000..44713126 --- /dev/null +++ b/examples/5nodesRTGS/raft-start.sh @@ -0,0 +1,35 @@ +#!/bin/bash +set -u +set -e + +GLOBAL_ARGS="--unlock 0 --password passwords.txt --raft --rpc --rpcaddr 0.0.0.0 --rpcapi admin,db,eth,debug,miner,net,shh,txpool,personal,web3,quorum --emitcheckpoints" + +echo "[*] Starting Constellation nodes" +nohup constellation-node tm1.conf 2>> qdata/logs/constellation1.log & +sleep 1 +nohup constellation-node tm2.conf 2>> qdata/logs/constellation2.log & +nohup constellation-node tm3.conf 2>> qdata/logs/constellation3.log & +nohup constellation-node tm4.conf 2>> qdata/logs/constellation4.log & +nohup constellation-node tm5.conf 2>> qdata/logs/constellation5.log & + +sleep 1 + +echo "[*] Starting node 1 - Bank 1" +PRIVATE_CONFIG=tm1.conf nohup geth --datadir qdata/dd1 $GLOBAL_ARGS --raftport 50401 --rpcport 22000 --port 21000 2>>qdata/logs/1.log & + +echo "[*] Starting node 2 - Bank 2" +PRIVATE_CONFIG=tm2.conf nohup geth --datadir qdata/dd2 $GLOBAL_ARGS --raftport 50402 --rpcport 22001 --port 21001 2>>qdata/logs/2.log & + +echo "[*] Starting node 3 - Bank 3" +PRIVATE_CONFIG=tm3.conf nohup geth --datadir qdata/dd3 $GLOBAL_ARGS --raftport 50403 --rpcport 22002 --port 21002 2>>qdata/logs/3.log & + +echo "[*] Starting node 4 - Regulator" +PRIVATE_CONFIG=tm4.conf nohup geth --datadir qdata/dd4 $GLOBAL_ARGS --raftport 50404 --rpcport 22003 --port 21003 2>>qdata/logs/4.log & + +echo "[*] Starting node 5 - Observer" +PRIVATE_CONFIG=tm5.conf nohup geth --datadir qdata/dd5 $GLOBAL_ARGS --raftport 50405 --rpcport 22004 --port 21004 2>>qdata/logs/5.log & + +echo "[*] Waiting for nodes to start" +sleep 10 + +echo "All nodes configured. See 'qdata/logs' for logs, and run e.g. 'geth attach qdata/dd4/geth.ipc' to attach to the RTGS Regulator Geth node" diff --git a/examples/5nodesRTGS/raft/nodekey1 b/examples/5nodesRTGS/raft/nodekey1 new file mode 100644 index 00000000..8c8bd26d --- /dev/null +++ b/examples/5nodesRTGS/raft/nodekey1 @@ -0,0 +1 @@ +1be3b50b31734be48452c29d714941ba165ef0cbf3ccea8ca16c45e3d8d45fb0 diff --git a/examples/5nodesRTGS/raft/nodekey2 b/examples/5nodesRTGS/raft/nodekey2 new file mode 100644 index 00000000..73b1b72e --- /dev/null +++ b/examples/5nodesRTGS/raft/nodekey2 @@ -0,0 +1 @@ +9bdd6a2e7cc1ca4a4019029df3834d2633ea6e14034d6dcc3b944396fe13a08b diff --git a/examples/5nodesRTGS/raft/nodekey3 b/examples/5nodesRTGS/raft/nodekey3 new file mode 100644 index 00000000..5a53a14d --- /dev/null +++ b/examples/5nodesRTGS/raft/nodekey3 @@ -0,0 +1 @@ +722f11686b2277dcbd72713d8a3c81c666b585c337d47f503c3c1f3c17cf001d diff --git a/examples/5nodesRTGS/raft/nodekey4 b/examples/5nodesRTGS/raft/nodekey4 new file mode 100644 index 00000000..5372a1f7 --- /dev/null +++ b/examples/5nodesRTGS/raft/nodekey4 @@ -0,0 +1 @@ +6af685c4de99d44c620ccd9464d19bdeb62a750b9ae49b1740fb28d68a0e5c7d diff --git a/examples/5nodesRTGS/raft/nodekey5 b/examples/5nodesRTGS/raft/nodekey5 new file mode 100644 index 00000000..752d993d --- /dev/null +++ b/examples/5nodesRTGS/raft/nodekey5 @@ -0,0 +1 @@ +103bb5d20384b9af9f693d4287822fef6da7d79cb2317ed815f0081c7ea8d17d diff --git a/examples/5nodesRTGS/raft/nodekey6 b/examples/5nodesRTGS/raft/nodekey6 new file mode 100644 index 00000000..0a8d3211 --- /dev/null +++ b/examples/5nodesRTGS/raft/nodekey6 @@ -0,0 +1 @@ +79999aef8d5197446b6051df47f01fd4d6dd1997aec3f5282e77ea27b6727346 diff --git a/examples/5nodesRTGS/raft/nodekey7 b/examples/5nodesRTGS/raft/nodekey7 new file mode 100644 index 00000000..5ece6e2a --- /dev/null +++ b/examples/5nodesRTGS/raft/nodekey7 @@ -0,0 +1 @@ +e85dae073b504871ffd7946bf5f45e6fa8dc09eb1536a48c4b6822332008973d diff --git a/examples/5nodesRTGS/raft/static-nodes.json b/examples/5nodesRTGS/raft/static-nodes.json new file mode 100644 index 00000000..b3f9d520 --- /dev/null +++ b/examples/5nodesRTGS/raft/static-nodes.json @@ -0,0 +1,7 @@ +[ + "enode://ac6b1096ca56b9f6d004b779ae3728bf83f8e22453404cc3cef16a3d9b96608bc67c4b30db88e0a5a6c6390213f7acbe1153ff6d23ce57380104288ae19373ef@127.0.0.1:21000?discport=0&raftport=50401", + "enode://0ba6b9f606a43a95edc6247cdb1c1e105145817be7bcafd6b2c0ba15d58145f0dc1a194f70ba73cd6f4cdd6864edc7687f311254c7555cc32e4d45aeb1b80416@127.0.0.1:21001?discport=0&raftport=50402", + "enode://579f786d4e2830bbcc02815a27e8a9bacccc9605df4dc6f20bcc1a6eb391e7225fff7cb83e5b4ecd1f3a94d8b733803f2f66b7e871961e7b029e22c155c3a778@127.0.0.1:21002?discport=0&raftport=50403", + "enode://3d9ca5956b38557aba991e31cf510d4df641dce9cc26bfeb7de082f0c07abb6ede3a58410c8f249dabeecee4ad3979929ac4c7c496ad20b8cfdd061b7401b4f5@127.0.0.1:21003?discport=0&raftport=50404", + "enode://3701f007bfa4cb26512d7df18e6bbd202e8484a6e11d387af6e482b525fa25542d46ff9c99db87bd419b980c24a086117a397f6d8f88e74351b41693880ea0cb@127.0.0.1:21004?discport=0&raftport=50405" +] From 8f55c6e2a71d1b1728080aa541bbe18df8f41197 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 23 Nov 2017 18:58:06 +0000 Subject: [PATCH 15/31] README update --- examples/5nodesRTGS/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 1296fa5c..e1358cb2 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -57,7 +57,8 @@ terminal 5: ``$ geth attach ipc:qdata/dd5/geth.ipc`` Terminal 1-3 are banks 1-3, terminal 4 is the regulator and terminal 5 is the observer used to test privacy. ##Running 5nodesRTGS example -4- Run the following command three times in the javascript quorum console on terminal 4 (regulator): +4- Run the following command three times in the javascript quorum console on terminal 4 (regulator): + ``loadScript("deploy-bankContract-0-3-6.js");`` The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82 (https://github.com/jpmorganchase/quorum/issues/82). @@ -66,7 +67,9 @@ The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82 5- Take note of the 3 bank contract addresses. These are bank1, bank2 and bank3 private contracts instances addresses. -6- Run the following command one time in the javascript console on terminal 4 (regulator): ``loadScript("deploy-regulatorTransactionList-0-3-6.js");`` +6- Run the following command one time in the javascript console on terminal 4 (regulator): + +``loadScript("deploy-regulatorTransactionList-0-3-6.js");`` 7- Take note of the contract address. It is the public transaction log contract address. From b470b87de71fd0c005702b284fd8e5adfc4b9ede Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 23 Nov 2017 18:59:35 +0000 Subject: [PATCH 16/31] README update --- examples/5nodesRTGS/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index e1358cb2..01462f4a 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -56,7 +56,7 @@ terminal 5: ``$ geth attach ipc:qdata/dd5/geth.ipc`` Terminal 1-3 are banks 1-3, terminal 4 is the regulator and terminal 5 is the observer used to test privacy. -##Running 5nodesRTGS example +## Running 5nodesRTGS example 4- Run the following command three times in the javascript quorum console on terminal 4 (regulator): ``loadScript("deploy-bankContract-0-3-6.js");`` From 51ea0fc896ff6304f5f809a7205c34f19f89fe51 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 23 Nov 2017 19:05:54 +0000 Subject: [PATCH 17/31] Clean up --- README.md | 34 ++++------------------------------ Vagrantfile | 14 -------------- vagrant/bootstrap.sh | 43 ------------------------------------------- 3 files changed, 4 insertions(+), 87 deletions(-) delete mode 100644 Vagrantfile delete mode 100755 vagrant/bootstrap.sh diff --git a/README.md b/README.md index a2ac2dd3..be3d4708 100644 --- a/README.md +++ b/README.md @@ -5,44 +5,18 @@ This repository contains setup examples for Quorum. Current BACEN example is: * [5nodesRTGS](https://github.com/bacen/quorum-examples/tree/master/examples/5nodesRTGS): Starts up a set of 5 nodes that simulates a Real-time Gross Setlement environment with 3 banks, one regulator (typically a central bank) and an observer that cannot access the private data. -The easiest way to get started with running the examples is to use the vagrant environment (see below). +The easiest way to get started with running the examples is to use a clean Ubuntu 16.04 environment (see README at 5nodesRTGS directory). **Important note**: Any account/encryption keys contained in this repository are for demonstration and testing purposes only. Before running a real environment, you should generate new ones using Geth's `account` tool and `constellation-enclave-keygen`. -## Vagrant Usage - -This is a complete Vagrant environment containing Quorum, Constellation, and the -Quorum examples. - -### Requirements - - 1. Install [VirtualBox](https://www.virtualbox.org/wiki/Downloads) - 1. Install [Vagrant](https://www.vagrantup.com/downloads.html) - -(If you are behind a proxy server, please see https://github.com/jpmorganchase/quorum/issues/23) - -### Running - +## Usage ```sh git clone https://github.com/bacen/quorum-examples cd quorum-examples cd examples cd 5nodesRTGS -vagrant up -# (should take 5 or so minutes, requires internet connection) -vagrant ssh +./bootstrap.sh +# (should take some user confirmations, requires internet connection) ``` - -(*macOS note*: If you get an error saying that the ubuntu/xenial64 image doesn't -exist, please run `sudo rm -r /opt/vagrant/embedded/bin/curl`. This is usually due to -issues with the version of curl bundled with Vagrant.) - -Once in the VM environment, `cd quorum-examples/5nodesRTGS` then simply follow the -README instructions. - -To shut down the Vagrant instance, run `vagrant suspend`. To delete it, run -`vagrant destroy`. To start from scratch, run `vagrant up` after destroying the -instance. - diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index 89c7c4cd..00000000 --- a/Vagrantfile +++ /dev/null @@ -1,14 +0,0 @@ -Vagrant.configure(2) do |config| - config.vm.box = "ubuntu/xenial64" - config.vm.provision :shell, path: "vagrant/bootstrap.sh" - config.vm.network "forwarded_port", guest: 22000, host: 22000 - config.vm.network "forwarded_port", guest: 22001, host: 22001 - config.vm.network "forwarded_port", guest: 22002, host: 22002 - config.vm.network "forwarded_port", guest: 22003, host: 22003 - config.vm.network "forwarded_port", guest: 22004, host: 22004 - config.vm.network "forwarded_port", guest: 22005, host: 22005 - config.vm.network "forwarded_port", guest: 22006, host: 22006 - config.vm.provider "virtualbox" do |v| - v.memory = 4096 - end -end diff --git a/vagrant/bootstrap.sh b/vagrant/bootstrap.sh deleted file mode 100755 index b8487fa6..00000000 --- a/vagrant/bootstrap.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -set -eu -o pipefail - -# install build deps -add-apt-repository ppa:ethereum/ethereum -apt-get update -apt-get install -y build-essential unzip libdb-dev libsodium-dev zlib1g-dev libtinfo-dev solc sysvbanner wrk - -# install constellation -wget -q https://github.com/jpmorganchase/constellation/releases/download/v0.0.1-alpha/ubuntu1604.zip -unzip ubuntu1604.zip -cp ubuntu1604/constellation-node /usr/local/bin && chmod 0755 /usr/local/bin/constellation-node -cp ubuntu1604/constellation-enclave-keygen /usr/local/bin && chmod 0755 /usr/local/bin/constellation-enclave-keygen -rm -rf ubuntu1604.zip ubuntu1604 - -# install golang -GOREL=go1.7.3.linux-amd64.tar.gz -wget -q https://storage.googleapis.com/golang/$GOREL -tar xfz $GOREL -mv go /usr/local/go -rm -f $GOREL -PATH=$PATH:/usr/local/go/bin -echo 'PATH=$PATH:/usr/local/go/bin' >> /home/ubuntu/.bashrc - -# make/install quorum -git clone https://github.com/jpmorganchase/quorum.git -pushd quorum >/dev/null -git checkout tags/v1.1.0 -make all -cp build/bin/geth /usr/local/bin -cp build/bin/bootnode /usr/local/bin -popd >/dev/null - -# copy examples -cp -r /vagrant/examples /home/ubuntu/quorum-examples -chown -R ubuntu:ubuntu /home/ubuntu/quorum /home/ubuntu/quorum-examples - -# done! -banner "Quorum" -echo -echo 'The Quorum vagrant instance has been provisioned. Examples are available in ~/quorum-examples inside the instance.' -echo "Use 'vagrant ssh' to open a terminal, 'vagrant suspend' to stop the instance, and 'vagrant destroy' to remove it." From 150aa34a0769c9908860cd486572de723a3763e4 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 23 Nov 2017 19:08:06 +0000 Subject: [PATCH 18/31] cleanup --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index be3d4708..66f69210 100644 --- a/README.md +++ b/README.md @@ -18,5 +18,5 @@ cd quorum-examples cd examples cd 5nodesRTGS ./bootstrap.sh -# (should take some user confirmations, requires internet connection) +# (run as root, should take some user confirmations, requires internet connection) ``` From 4c6ffe165a372494078b2cac3682383273ebf543 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 23 Nov 2017 19:31:58 +0000 Subject: [PATCH 19/31] Bootstrap script and readme update --- examples/5nodesRTGS/README.md | 2 +- examples/5nodesRTGS/bootstrap.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 01462f4a..1706b5f5 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -65,7 +65,7 @@ The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82 4.1- If you receive an error like "Error: Non-200 status code: &{Status:500 Internal Server Error", wait for the constellation nodes to know their peers. In my low end lab it can take a while (some minutes). -5- Take note of the 3 bank contract addresses. These are bank1, bank2 and bank3 private contracts instances addresses. +5- Take note of the 3 bank contract addresses. It can take some seconds, but the geth console will eventually provide an output like "Contract mined! address: 0x...". These are bank1, bank2 and bank3 private contracts instances addresses. 6- Run the following command one time in the javascript console on terminal 4 (regulator): diff --git a/examples/5nodesRTGS/bootstrap.sh b/examples/5nodesRTGS/bootstrap.sh index e4da6807..7925917a 100755 --- a/examples/5nodesRTGS/bootstrap.sh +++ b/examples/5nodesRTGS/bootstrap.sh @@ -17,6 +17,7 @@ rm -rf $CREL add-apt-repository ppa:gophers/archive apt update apt-get install golang-1.9-go +PATH=$PATH:/usr/lib/go-1.9/bin # make/install quorum git clone https://github.com/jpmorganchase/quorum.git From d1086fef08650c47b8bc8183ce3ddd507cd03caa Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 30 Nov 2017 18:30:55 +0000 Subject: [PATCH 20/31] Restored contracts.sol file --- examples/5nodesRTGS/contracts.sol | 365 ++++++++++++++++++++++++++++++ 1 file changed, 365 insertions(+) create mode 100644 examples/5nodesRTGS/contracts.sol diff --git a/examples/5nodesRTGS/contracts.sol b/examples/5nodesRTGS/contracts.sol new file mode 100644 index 00000000..672bb426 --- /dev/null +++ b/examples/5nodesRTGS/contracts.sol @@ -0,0 +1,365 @@ +/* +bankContract: JPMorgan Quorum smart contract example implementing a private +payment system +Must be deployed as a PRIVATE contract +Initialization: +- Each bank must have an instance of the contract deployed. +- Bank balances must be set privately by the regulator node on each +bank contract instance. This information is only shared between the bank and +the regulator . +- Transactions are private. Each transaction sensitive information is only shared +between the sender, receiver and regulator. +- The list of participating banks must be set by the regulator + +Usage: +- Banks can send money calling sendValue function using only its authorized +account (authorizedSender). A random value must be provided to ensure an unique +transaction ID. If a constant value is passed on every transaction, a +transaction ID collision can occur if two transactions with the same sender, +destination and value are mined in the same block. + +- Transactions are created on an unconfirmed status and they are not +settled. The finality is only achieved after the transaction is confirmed. + +- Transaction IDs must be published on an public contract that stores the +transaction log. This ensures that the regulator has knowledge of all the +transactions. If the regulator sees a transaction in the log that was not +copied privately by the sender to him, he can block it immediately. + +- Only the regulator can confirm a transaction during the confirmation time +(60 seconds by default). During this period, the regulator can read the +transaction and compare it to the bank balance. If the bank has enough money, +the regulator confirms the transaction calling confirmTransactionRegulator +function. + +- If a published transaction would cause an overdraft if confirmed, the +regulator can block it so the bank cannot confirm the transaction after +the confirmation time. + +- If the regulator does not act (blocking or confirming) during the +confirmation time, the sender can confirm its own transaction. This proccess +ensures that the system can endure a regulator outage. + +- Transaction confirmation will reflect on both smart contracts balance +immediatelly (sender and receiver). + +Known problems: +- Fail to provide a random value to the sendValue like using the same value +on every transaction can lead to duplicated transaction IDs in case of fast +multiple identical transactions. + +*/ + +contract bankContract { +uint public balance=0; +address public thisBankContract; +bool public isRegulatorNode = false; +uint public confirmationTime = 60; + +address public TransactionListAddress; + +//totalTransactions: counts all the transactions that the bank is part of, +//confirmed or not. +uint public totalTransactions = 0; + +struct transaction { + uint value; + address senderContract; + address destinationContract; + bool confirmed; + uint senderBalanceAtTransfer; +} + +mapping (bytes32 => transaction) public transactions; +mapping (uint => bytes32) public transactionIDs; + + +modifier onlyRegulator() { + regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); + if (msg.sender != transactionListContractModifier.getRegulator()) throw;_ +} + +//This modifier ensures that the msg.sender is a valid bank contract address + +modifier validSenderContract() { + regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); + if (!transactionListContractModifier.getBankExistance(msg.sender)) throw;_ +} + +//This modifier ensures that the msg.sender is THE valid bank transaction +//address. It prevents bank impersonation attack +modifier authorizedSender() { + regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); + if (transactionListContractModifier.getBankSender(address(this))!= msg.sender) throw;_ +} + +function setTransactionListAddress (address _contractAddress) onlyRegulator { + TransactionListAddress = _contractAddress; +} + +/* sendValue: creates a private transaction between banks. The transaction +is stored in the private transaction log that is only shared between the sender, +the receiver and the regulator. The transaction is created NOT CONFIRMED. In +this state, no funds have changed hands. The funds are only moved and balances +updated if the transaction is CONFIRMED in a another function call, achieving +finality +*/ +function sendValue (address _destination , uint _value, string _random) authorizedSender { + +uint destinationTransactionID; +bytes32 transactionID; + +regulatorTransactionList transactionListContract = regulatorTransactionList(TransactionListAddress); + +transactionID=sha3(address(this),_destination,_value,block.timestamp,_random); + +transactionIDs[totalTransactions]=transactionID; + +if ((!transactionListContract.getBankExistance(_destination))|| +(!transactionListContract.getBankState(address(this)))) throw; + +bankContract destinationContract = bankContract(_destination); +destinationContract.receiveValue(_value,_random); + +transactions[transactionID].value=_value; +transactions[transactionID].senderContract=address(this); +transactions[transactionID].destinationContract=_destination; +transactions[transactionID].senderBalanceAtTransfer=balance; +transactions[transactionID].confirmed=false; + +totalTransactions++; + +} + +/* receiveValue: creates a copy of the transaction created by the sendValue +function in the recipient bank contract. +*/ +function receiveValue (uint _value, string _random) validSenderContract { + +bytes32 transactionID; + +transactionID=sha3(msg.sender,address(this),_value,block.timestamp,_random); + +transactionIDs[totalTransactions]=transactionID; + +transactions[transactionID].value=_value; +transactions[transactionID].senderContract=msg.sender; +transactions[transactionID].destinationContract=address(this); +transactions[transactionID].confirmed=false; + +totalTransactions++; + +} + +function setRegulatorNode () onlyRegulator { + isRegulatorNode=true; +} + +function setBalance(uint _balance) onlyRegulator { + balance=_balance; +} + + +function setConfirmationTime(uint _seconds) onlyRegulator { + confirmationTime=_seconds; +} + +function setThisBankContract(address _thisBankContract) onlyRegulator { + thisBankContract = _thisBankContract; +} + +/*confirmTransactionRegulator: regulator exclusive function to confirm a +transaction. The transaction MUST be in the public transaction log to be +confirmed, even by the regulator. This ensures that every part is aware of the +transaction or must report inconsistence to the regulator. Overdraft protection +was not possible because there is no consensus on private contracts. +Balances are updated on both contracts if all checks are successful. +*/ +function confirmTransactionRegulator(bytes32 _transactionID) onlyRegulator { + + regulatorTransactionList transactionListContract = regulatorTransactionList(TransactionListAddress); + + if ((!transactions[_transactionID].confirmed)&& + (!transactionListContract.getTransactionState(_transactionID))&& + (transactionListContract.getTransactionExistance(_transactionID))) { + transactions[_transactionID].confirmed=true; + + if (transactions[_transactionID].destinationContract == address(this)) { + if ((transactions[_transactionID].destinationContract == thisBankContract) || + (isRegulatorNode)) { + balance+=transactions[_transactionID].value; + } + bankContract senderContract = bankContract(transactions[_transactionID].senderContract); + + senderContract.confirmTransactionPair(_transactionID); + } + + if (transactions[_transactionID].senderContract == address(this)) { + if ((transactions[_transactionID].senderContract == thisBankContract) || + (isRegulatorNode)) { + balance-=transactions[_transactionID].value; + } + bankContract destinationContract = bankContract(transactions[_transactionID].destinationContract); + + destinationContract.confirmTransactionPair(_transactionID); + } + } +} + +/*confirmTransactionBank: bank exclusive function to confirm a +transaction. A bank can only confirm a transaction after the confirmationTime +seconds has passed. The transaction MUST be in the public transaction log to be +confirmed. This ensures that every part is aware of the +transaction or must report inconsistence to the regulator. Overdraft protection +was not possible because there is no consensus on private contracts. +Balances are updated on both contracts if all checks are successful. +*/ +function confirmTransactionBank(bytes32 _transactionID) authorizedSender { + + regulatorTransactionList transactionListContract = regulatorTransactionList(TransactionListAddress); + + if ((block.timestamp-transactionListContract.getTransactionTimestamp(_transactionID) > confirmationTime) && + (!transactions[_transactionID].confirmed)&& + (!transactionListContract.getTransactionState(_transactionID))&& + (transactionListContract.getTransactionExistance(_transactionID))){ + + if (transactions[_transactionID].senderContract == address(this)) { + transactions[_transactionID].confirmed=true; + if ((transactions[_transactionID].senderContract == thisBankContract) || + (isRegulatorNode)) + balance-=transactions[_transactionID].value; + + bankContract destinationContract = bankContract(transactions[_transactionID].destinationContract); + + destinationContract.confirmTransactionPair(_transactionID); + } + + } +} + +/*confirmTransactionPair: updates the balance of the other leg of the +transaction. Can only be called by a bank contract address +*/ +function confirmTransactionPair(bytes32 _transactionID) validSenderContract { + + if (!transactions[_transactionID].confirmed) { + transactions[_transactionID].confirmed=true; + + if (transactions[_transactionID].destinationContract == address(this)) + if ((transactions[_transactionID].destinationContract == thisBankContract)||(isRegulatorNode)) + balance+=transactions[_transactionID].value; + + if (transactions[_transactionID].senderContract == address(this)) + if ((transactions[_transactionID].senderContract == thisBankContract)||(isRegulatorNode)) + balance-=transactions[_transactionID].value; + } + + +} + +} + +/*Contract regulatorTransactionList +Must be deployed as a PUBLIC contract +Maintains a public transaction log without sensitive information like banks +involved and values. Additionally it maintains a public bank list, including +transaction and contract addresses. +*/ + +contract regulatorTransactionList { + + struct transaction { + bool exists; + uint timestamp; + bool blocked; +} + +struct Bank { + string name; + bool authorized; + bool exists; + address authorizedSender; +} + + address public regulator; + + mapping (bytes32 => transaction) public transactions; + + mapping (address => Bank) public banks; + + modifier onlyRegulator() { if (msg.sender != regulator) throw;_ + } + + function regulatorTransactionList() { + regulator=msg.sender; + } + + function addTransaction (bytes32 _transactionID) { + transactions[_transactionID].exists=true; + transactions[_transactionID].timestamp=block.timestamp; + transactions[_transactionID].blocked=false; + } + + function getTransactionExistance (bytes32 _transactionID) public constant + returns (bool) { + return (transactions[_transactionID].exists); +} + + function getTransactionState (bytes32 _transactionID) public constant + returns (bool) { + return (transactions[_transactionID].blocked); +} + + function getTransactionTimestamp (bytes32 _transactionID) public constant + returns (uint) { + return (transactions[_transactionID].timestamp); +} + + function getBankExistance (address _contract) public constant + returns (bool) { + return (banks[_contract].exists); +} + + function getBankState (address _contract) public constant + returns (bool) { + return (banks[_contract].authorized); +} + +function getBankSender (address _contract) public constant + returns (address) { + return (banks[_contract].authorizedSender); +} + +function getRegulator () public constant + returns (address) { + return (regulator); +} + +function blockTransaction(bytes32 _transactionID) onlyRegulator { + if (transactions[_transactionID].exists) { + transactions[_transactionID].blocked=true; + } +} + +function unblockTransaction(bytes32 _transactionID) onlyRegulator { + if (transactions[_transactionID].exists) { + transactions[_transactionID].blocked=false; + } +} + +function addBank (string _name, address _contract, address _sender) onlyRegulator { + banks[_contract].name=_name; + banks[_contract].exists=true; + banks[_contract].authorized=true; + banks[_contract].authorizedSender=_sender; +} + +function blockBank (address _contract) onlyRegulator { + banks[_contract].authorized=false; +} + +function authorizeBank (address _contract) onlyRegulator { + banks[_contract].authorized=true; +} + +} From 2b1f638b99014420be2a93060ad435bee596780a Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 30 Nov 2017 18:37:31 +0000 Subject: [PATCH 21/31] Readme update --- examples/5nodesRTGS/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 1706b5f5..f5e9253b 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -38,7 +38,7 @@ This two phase commit is needed because there is no overdraft protecting in the 2- Run "bootstrap.sh" script to install Constellation, GO and Quorum ## Quorum set up and start -1- call init.sh to initialize accounts and keystores +1- call raft-init.sh to initialize accounts and keystores 2- Bring the 5 nodes up calling start.sh From 9da716e44ced4ea8551c6be9ef435094229a5779 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Mon, 4 Dec 2017 21:36:04 +0000 Subject: [PATCH 22/31] Added minimal web3 functionality --- .../1-interacting-with-the-blockchain/app.js | 56 + .../index.html | 59 + .../package-lock.json | 2258 +++++++++++++++++ .../package.json | 31 + .../readme.md | 6 + examples/5nodesRTGS/raft-start.sh | 2 +- 6 files changed, 2411 insertions(+), 1 deletion(-) create mode 100644 examples/5nodesRTGS/1-interacting-with-the-blockchain/app.js create mode 100644 examples/5nodesRTGS/1-interacting-with-the-blockchain/index.html create mode 100644 examples/5nodesRTGS/1-interacting-with-the-blockchain/package-lock.json create mode 100644 examples/5nodesRTGS/1-interacting-with-the-blockchain/package.json create mode 100644 examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md diff --git a/examples/5nodesRTGS/1-interacting-with-the-blockchain/app.js b/examples/5nodesRTGS/1-interacting-with-the-blockchain/app.js new file mode 100644 index 00000000..98446cc4 --- /dev/null +++ b/examples/5nodesRTGS/1-interacting-with-the-blockchain/app.js @@ -0,0 +1,56 @@ +'use strict'; +import $ from 'jquery'; +import Web3 from 'web3quorum'; + +// Instance Web3 using localhost testrpc +var web3 = new Web3(new Web3.providers.HttpProvider("http://IP:PORT")); + +//var transactionAccount; +var abi = [{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] + + +// We will use this functions to show the status of the accounts generated by testRPC +const synchAccounts = () => { + $('#accounts').html(""); + //transactionAccount=we3.accounts[0]; + web3.eth.accounts.forEach(account => { + let balance = web3.eth.getBalance(account); + $('#accounts').append(`

from to ${account} | ETH ${balance}

`); + }); +}; + +// This callback just avoids us to copy & past every time you want to use an address +const updateAddressFromLink = (event, inputSelector) => { + event.preventDefault(); + $(inputSelector).val($(event.target).siblings(".address").text()); +}; + +// Show initial accounts state and initialize callback triggers +synchAccounts(); +$(document).on('click', '.from', e => updateAddressFromLink(e, '#sender-address')); +$(document).on('click', '.to', e => updateAddressFromLink(e, '#recipient-address')); + + +$('#get-bank-balance').click(() => { + let bankAddress = $('#bank-address').val(); + + console.log(`Address: ${bankAddress}`); + + let bankContract = web3.eth.contract(abi).at(bankAddress); + + let balance = bankContract.balance(); + + console.log(`Retrieved Balance: ${balance}, ${bankAddress}`); + + $("#bank-balance").text(`Bank Balance: ${balance}`); + + +}); + +$('#change-node').click(() => { + let node = $('#choose-node').val(); + + console.log(`Node: ${node}`); + + +}); diff --git a/examples/5nodesRTGS/1-interacting-with-the-blockchain/index.html b/examples/5nodesRTGS/1-interacting-with-the-blockchain/index.html new file mode 100644 index 00000000..b408580b --- /dev/null +++ b/examples/5nodesRTGS/1-interacting-with-the-blockchain/index.html @@ -0,0 +1,59 @@ + +
+ + + + +
+ +
+
+
+
+

Accounts

+

+      
+
+

Transaction Information

+
+          

Hash:

+

Nonce:

+

Gas usage:

+

Block Number:

+

Block Hash:

+

Tx Index:

+

From:

+

To:

+

Value:

+
+
+
+ +
+
+

Get a Bank Balance

+ +
+ +
+
+

Bank Balance:

+ +
+
+ + + +
+ + + diff --git a/examples/5nodesRTGS/1-interacting-with-the-blockchain/package-lock.json b/examples/5nodesRTGS/1-interacting-with-the-blockchain/package-lock.json new file mode 100644 index 00000000..ec96f412 --- /dev/null +++ b/examples/5nodesRTGS/1-interacting-with-the-blockchain/package-lock.json @@ -0,0 +1,2258 @@ +{ + "name": "interacting-with-the-blockchain", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "astw": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", + "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", + "requires": { + "acorn": "4.0.13" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babelify": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", + "requires": { + "babel-core": "6.26.0", + "object-assign": "4.1.1" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "bignumber.js": { + "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-pack": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", + "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "defined": "1.0.0", + "through2": "2.0.3", + "umd": "3.0.1" + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browserify": { + "version": "14.5.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.5.0.tgz", + "integrity": "sha512-gKfOsNQv/toWz+60nSPfYzuwSEdzvV2WdxrVPUbPD/qui44rAkB3t3muNtmmGYHqrG56FGwX9SUEQmzNLAeS7g==", + "requires": { + "JSONStream": "1.3.1", + "assert": "1.4.1", + "browser-pack": "6.0.2", + "browser-resolve": "1.11.2", + "browserify-zlib": "0.2.0", + "buffer": "5.0.8", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "defined": "1.0.0", + "deps-sort": "2.0.0", + "domain-browser": "1.1.7", + "duplexer2": "0.1.4", + "events": "1.1.1", + "glob": "7.1.2", + "has": "1.0.1", + "htmlescape": "1.1.1", + "https-browserify": "1.0.0", + "inherits": "2.0.3", + "insert-module-globals": "7.0.1", + "labeled-stream-splicer": "2.0.0", + "module-deps": "4.1.1", + "os-browserify": "0.3.0", + "parents": "1.0.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "read-only-stream": "2.0.0", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "shasum": "1.0.2", + "shell-quote": "1.6.1", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "1.0.3", + "subarg": "1.0.0", + "syntax-error": "1.3.0", + "through2": "2.0.3", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4", + "xtend": "4.0.1" + } + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "1.0.6" + } + }, + "buffer": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", + "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cached-path-relative": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", + "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "combine-source-map": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", + "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", + "requires": { + "convert-source-map": "1.1.3", + "inline-source-map": "0.6.2", + "lodash.memoize": "3.0.4", + "source-map": "0.5.7" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.0.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5", + "randomfill": "1.0.3" + } + }, + "crypto-js": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "requires": { + "JSONStream": "1.3.1", + "shasum": "1.0.2", + "subarg": "1.0.0", + "through2": "2.0.3" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "2.0.1" + } + }, + "detective": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.0.tgz", + "integrity": "sha512-4mBqSEdMfBpRAo/DQZnTcAXenpiSIJmVKbCMSotS+SFWWcrP/CKM6iBRPdTiEO+wZhlfEsoZlGqpG6ycl5vTqw==", + "requires": { + "acorn": "5.2.1", + "defined": "1.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" + } + } + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "0.5.7" + } + }, + "insert-module-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", + "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "concat-stream": "1.5.2", + "is-buffer": "1.1.6", + "lexical-scope": "1.2.0", + "process": "0.11.10", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "requires": { + "jsonify": "0.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "labeled-stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", + "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", + "requires": { + "inherits": "2.0.3", + "isarray": "0.0.1", + "stream-splicer": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "lexical-scope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", + "requires": { + "astw": "2.2.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "module-deps": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", + "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", + "requires": { + "JSONStream": "1.3.1", + "browser-resolve": "1.11.2", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "defined": "1.0.0", + "detective": "4.7.0", + "duplexer2": "0.1.4", + "inherits": "2.0.3", + "parents": "1.0.1", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "stream-combiner2": "1.1.1", + "subarg": "1.0.0", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", + "requires": { + "shell-quote": "1.6.1" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "requires": { + "path-platform": "0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "requires": { + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "requires": { + "randombytes": "2.0.5", + "safe-buffer": "5.1.1" + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "0.5.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "requires": { + "json-stable-stringify": "0.0.1", + "sha.js": "2.4.9" + } + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "0.5.7" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "requires": { + "duplexer2": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "requires": { + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "syntax-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", + "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", + "requires": { + "acorn": "4.0.13" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "requires": { + "process": "0.11.10" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "umd": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", + "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "watchify": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.9.0.tgz", + "integrity": "sha1-8HX9LoqGrN6Eztum5cKgvt1SPZ4=", + "requires": { + "anymatch": "1.3.2", + "browserify": "14.5.0", + "chokidar": "1.7.0", + "defined": "1.0.0", + "outpipe": "1.1.1", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "web3quorum": { + "version": "0.20.4", + "resolved": "https://registry.npmjs.org/web3quorum/-/web3quorum-0.20.4.tgz", + "integrity": "sha512-A5qbzqwZtx6XUJLb7BZGsgZAdz5jgvyXs4hMhbxKVbKnuXRbHXpYp18PYx8O3skLuYELQz7uvvzduIfKrktfvQ==", + "requires": { + "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "crypto-js": "3.1.8", + "utf8": "2.1.2", + "xhr2": "0.1.4", + "xmlhttprequest": "1.8.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/examples/5nodesRTGS/1-interacting-with-the-blockchain/package.json b/examples/5nodesRTGS/1-interacting-with-the-blockchain/package.json new file mode 100644 index 00000000..ad21cbbc --- /dev/null +++ b/examples/5nodesRTGS/1-interacting-with-the-blockchain/package.json @@ -0,0 +1,31 @@ +{ + "name": "interacting-with-the-blockchain", + "version": "1.0.0", + "description": "Blockchaing interaction JS app", + "main": "app.js", + "dependencies": { + "babel-preset-es2015": "^6.24.1", + "babelify": "^7.3.0", + "browserify": "^14.3.0", + "jquery": "^3.2.1", + "watchify": "^3.9.0", + "web3quorum": "~0.20.4" + }, + "browserify": { + "transform": [ + [ + "babelify", + { + "presets": [ + "es2015" + ] + } + ] + ] + }, + "scripts": { + "start": "watchify app.js -o bundle.js -v" + }, + "author": "facuspagnuolo", + "license": "ISC" +} diff --git a/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md b/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md new file mode 100644 index 00000000..5a8cc830 --- /dev/null +++ b/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md @@ -0,0 +1,6 @@ +# Running instructions +1. Run `quorum`, deploy and provision 5nodesRTGS contracts +2. Edit app.js and set your ip and port of quorum RPC on line 6 +3. Run `npm start` +4. Open `index.html` +5. Enter a Bank Contract address and press the button. The bank balance will be shown. diff --git a/examples/5nodesRTGS/raft-start.sh b/examples/5nodesRTGS/raft-start.sh index 44713126..fb79157a 100755 --- a/examples/5nodesRTGS/raft-start.sh +++ b/examples/5nodesRTGS/raft-start.sh @@ -24,7 +24,7 @@ echo "[*] Starting node 3 - Bank 3" PRIVATE_CONFIG=tm3.conf nohup geth --datadir qdata/dd3 $GLOBAL_ARGS --raftport 50403 --rpcport 22002 --port 21002 2>>qdata/logs/3.log & echo "[*] Starting node 4 - Regulator" -PRIVATE_CONFIG=tm4.conf nohup geth --datadir qdata/dd4 $GLOBAL_ARGS --raftport 50404 --rpcport 22003 --port 21003 2>>qdata/logs/4.log & +PRIVATE_CONFIG=tm4.conf nohup geth --rpccorsdomain "*" --datadir qdata/dd4 $GLOBAL_ARGS --raftport 50404 --rpcport 22003 --port 21003 2>>qdata/logs/4.log & echo "[*] Starting node 5 - Observer" PRIVATE_CONFIG=tm5.conf nohup geth --datadir qdata/dd5 $GLOBAL_ARGS --raftport 50405 --rpcport 22004 --port 21004 2>>qdata/logs/5.log & From d0f16f182e55d1e7a31c2e7fd3dde8aafc8a2f33 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Mon, 4 Dec 2017 21:42:18 +0000 Subject: [PATCH 23/31] Readme update --- examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md b/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md index 5a8cc830..50287f77 100644 --- a/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md +++ b/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md @@ -4,3 +4,5 @@ 3. Run `npm start` 4. Open `index.html` 5. Enter a Bank Contract address and press the button. The bank balance will be shown. + +Thanks to https://github.com/facuspagnuolo/ethereum-spiking from where I copied almost all the code. From a121ef931c84aaff6e31bb65db0a32c0fe3366df Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Mon, 4 Dec 2017 21:44:30 +0000 Subject: [PATCH 24/31] Updated readme --- .../5nodesRTGS/1-interacting-with-the-blockchain/readme.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md b/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md index 50287f77..93187272 100644 --- a/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md +++ b/examples/5nodesRTGS/1-interacting-with-the-blockchain/readme.md @@ -1,8 +1,9 @@ # Running instructions 1. Run `quorum`, deploy and provision 5nodesRTGS contracts 2. Edit app.js and set your ip and port of quorum RPC on line 6 -3. Run `npm start` -4. Open `index.html` -5. Enter a Bank Contract address and press the button. The bank balance will be shown. +3. Run `npm install` +4. Run `npm start` +5. Open `index.html` +6. Enter a Bank Contract address and press the button. The bank balance will be shown. Thanks to https://github.com/facuspagnuolo/ethereum-spiking from where I copied almost all the code. From 3fc52e2a6ed3fb674c8b984be17d717c8e2d3233 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 5 Dec 2017 15:23:18 +0000 Subject: [PATCH 25/31] Restored correct contracts.sol version --- examples/5nodesRTGS/contracts.sol | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/5nodesRTGS/contracts.sol b/examples/5nodesRTGS/contracts.sol index 672bb426..b2fbd2f1 100644 --- a/examples/5nodesRTGS/contracts.sol +++ b/examples/5nodesRTGS/contracts.sol @@ -57,6 +57,7 @@ bool public isRegulatorNode = false; uint public confirmationTime = 60; address public TransactionListAddress; +address public regulator; //totalTransactions: counts all the transactions that the bank is part of, //confirmed or not. @@ -75,8 +76,7 @@ mapping (uint => bytes32) public transactionIDs; modifier onlyRegulator() { - regulatorTransactionList transactionListContractModifier = regulatorTransactionList(TransactionListAddress); - if (msg.sender != transactionListContractModifier.getRegulator()) throw;_ + if (msg.sender != regulator) throw;_ } //This modifier ensures that the msg.sender is a valid bank contract address @@ -93,6 +93,10 @@ modifier authorizedSender() { if (transactionListContractModifier.getBankSender(address(this))!= msg.sender) throw;_ } +function bankContract() { + regulator = msg.sender; +} + function setTransactionListAddress (address _contractAddress) onlyRegulator { TransactionListAddress = _contractAddress; } From 5c0b0ad13924a73c292a495752547b4e19be9172 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Wed, 6 Dec 2017 20:04:39 +0000 Subject: [PATCH 26/31] Updated bank3 address on Readme --- examples/5nodesRTGS/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index f5e9253b..58596e6a 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -95,7 +95,7 @@ var contract3=eth.contract(abi).at(address3) var bank1="0xed9d02e382b34818e88b88a309c7fe71e65f419d" var bank2="0xca843569e3427144cead5e4d5999a3d0ccf92b8e" -var bank3="0x9186eb3d20cbd1f5f992a950d808c4495153abd5" +var bank3="0x0fbdc686b912d7722dc86510934589e0aaf3b55a" var regulator="0x0638e1574728b6d862dd5d3a3e0942c3be47d996" contract1.balance() From ee9b4bb7486b93ea0ff80ce9102c86d7350dfe1f Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 8 Dec 2017 22:46:13 +0000 Subject: [PATCH 27/31] Created new javascript example to interact with the blockchain --- .../2-interacting-with-a-contract/MyBank.json | 1 + .../MyToken.json | 167 ++ .../2-interacting-with-a-contract/MyToken.sol | 33 + .../MyTrLog.json | 1 + .../2-interacting-with-a-contract/app.js | 395 +++ .../2-interacting-with-a-contract/index.html | 149 + .../package-lock.json | 2654 +++++++++++++++++ .../package.json | 33 + .../2-interacting-with-a-contract/readme.md | 12 + 9 files changed, 3445 insertions(+) create mode 100644 examples/5nodesRTGS/2-interacting-with-a-contract/MyBank.json create mode 100644 examples/5nodesRTGS/2-interacting-with-a-contract/MyToken.json create mode 100644 examples/5nodesRTGS/2-interacting-with-a-contract/MyToken.sol create mode 100644 examples/5nodesRTGS/2-interacting-with-a-contract/MyTrLog.json create mode 100644 examples/5nodesRTGS/2-interacting-with-a-contract/app.js create mode 100644 examples/5nodesRTGS/2-interacting-with-a-contract/index.html create mode 100644 examples/5nodesRTGS/2-interacting-with-a-contract/package-lock.json create mode 100644 examples/5nodesRTGS/2-interacting-with-a-contract/package.json create mode 100644 examples/5nodesRTGS/2-interacting-with-a-contract/readme.md diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/MyBank.json b/examples/5nodesRTGS/2-interacting-with-a-contract/MyBank.json new file mode 100644 index 00000000..ab738b43 --- /dev/null +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/MyBank.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/MyToken.json b/examples/5nodesRTGS/2-interacting-with-a-contract/MyToken.json new file mode 100644 index 00000000..b6e4e90b --- /dev/null +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/MyToken.json @@ -0,0 +1,167 @@ +[ + { + "constant": true, + "inputs": [ + + ], + "name": "creator", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "receiver", + "type": "address" + }, + { + "name": "amount", + "type": "uint256" + } + ], + "name": "sendTokens", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + + ], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + + ], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + + ], + "name": "INITIAL_SUPPLY", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + + ], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + + ], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + } +] diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/MyToken.sol b/examples/5nodesRTGS/2-interacting-with-a-contract/MyToken.sol new file mode 100644 index 00000000..468598d5 --- /dev/null +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/MyToken.sol @@ -0,0 +1,33 @@ +pragma solidity ^0.4.4; + +contract MyToken { + string public constant name = "MyToken"; + string public constant symbol = "MTK"; + uint256 public constant decimals = 18; + uint256 public constant INITIAL_SUPPLY = 10000; + + address public creator; + uint256 public totalSupply; + mapping (address => uint256) public balances; + + function MyToken() public { + creator = msg.sender; + totalSupply = INITIAL_SUPPLY; + balances[creator] = INITIAL_SUPPLY; + } + + function sendTokens(address receiver, uint256 amount) public returns (bool) { + address owner = msg.sender; + + require(amount > 0); + require(balances[owner] >= amount); + + balances[owner] -= amount; + balances[receiver] += amount; + return true; + } + + function balanceOf(address owner) public constant returns (uint256) { + return balances[owner]; + } +} diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/MyTrLog.json b/examples/5nodesRTGS/2-interacting-with-a-contract/MyTrLog.json new file mode 100644 index 00000000..e1d94595 --- /dev/null +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/MyTrLog.json @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionExistance","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_contract","type":"address"},{"name":"_sender","type":"address"}],"name":"addBank","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"blockBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankExistance","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionTimestamp","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankSender","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"exists","type":"bool"},{"name":"timestamp","type":"uint256"},{"name":"blocked","type":"bool"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"authorizeBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"banks","outputs":[{"name":"name","type":"string"},{"name":"authorized","type":"bool"},{"name":"exists","type":"bool"},{"name":"authorizedSender","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankState","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"addTransaction","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"unblockTransaction","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionState","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"blockTransaction","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/app.js b/examples/5nodesRTGS/2-interacting-with-a-contract/app.js new file mode 100644 index 00000000..6bf2260a --- /dev/null +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/app.js @@ -0,0 +1,395 @@ +import $ from 'jquery'; +import Web3 from 'web3quorum'; + +// Instance Web3 using localhost testrpc +const web3regulator = new Web3(new Web3.providers.HttpProvider("http://IP:22003")); +const web3bank1 = new Web3(new Web3.providers.HttpProvider("http://IP:22000")); +const web3bank2 = new Web3(new Web3.providers.HttpProvider("http://IP:22001")); +const web3bank3 = new Web3(new Web3.providers.HttpProvider("http://IP:22002")); + +// This is an interface of the MyToken contract, called ABI, that we will interact with it +const BankContractABI = require('./MyBank.json'); +const TrLogContractABI = require('./MyTrLog.json'); + +const bank1Contract = web3bank1.eth.contract(BankContractABI); +const bank2Contract = web3bank2.eth.contract(BankContractABI); +const bank3Contract = web3bank3.eth.contract(BankContractABI); + +const regBank1Contract = web3regulator.eth.contract(BankContractABI); +const regBank2Contract = web3regulator.eth.contract(BankContractABI); +const regBank3Contract = web3regulator.eth.contract(BankContractABI); + + +const TrLogContract = web3regulator.eth.contract(TrLogContractABI); + +var mainRegulatorAccount; +var mainBank1Account; +var mainBank2Account; +var mainBank3Account; + +var bank1ContractAddress; +var bank2ContractAddress; +var bank3ContractAddress; +var trContractAddress; + +//Update and uncomment these lines to hardcode the contract addresses. It saves a lot of time copy and pasting +/* +bank1ContractAddress = "0x180893a0ec847fa8c92786791348d7d65916acbb"; +bank2ContractAddress = "0xf9a2cb34b6b5fd7a2ac0c2e9b2b9406d6daffbd4"; +bank3ContractAddress = "0xc8f717ba9593dc9d45c4518cf444d2cbd08af24d"; +trContractAddress = "0x4df0f115551f6f36d753dc0ecf6832715bdd7001"; +*/ +var bank1NodePublicKey = "BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo="; +var bank2NodePublicKey = "QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc="; +var bank3NodePublicKey = "oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="; +var regNodePublicKey = "R56gy4dn24YOjwyesTczYa8m5xhP6hF2uTMCju/1xkY="; + + +var trContractInstance; +var bank1ContractInstance; +var bank2ContractInstance; +var bank3ContractInstance; + +var senderContractInstance; +var destinationContractInstance; + +var regBank1ContractInstance; +var regBank2ContractInstance; +var regBank3ContractInstance; + +trContractInstance = TrLogContract.at(trContractAddress); +bank1ContractInstance = bank1Contract.at(bank1ContractAddress); +bank2ContractInstance = bank2Contract.at(bank2ContractAddress); +bank3ContractInstance = bank3Contract.at(bank3ContractAddress); + +regBank1ContractInstance = regBank1Contract.at(bank1ContractAddress); +regBank2ContractInstance = regBank2Contract.at(bank2ContractAddress); +regBank3ContractInstance = regBank3Contract.at(bank3ContractAddress); + + +var regSenderContractInstance; + +var trTxHash; +var confTxHash; + + + +// We will use this function to show the status of the deployed token sale contract +const synchSmartContract = () => { + + let balance1; + let balance2; + let balance3; + + let trHash1; + let trDetails1; + + let trHash2; + let trDetails2; + + + let trHash3; + let trDetails3; + + let transactionLog; + + + let trId1 = $('#bank1-transaction-id').val(); + let trId2 = $('#bank2-transaction-id').val(); + let trId3 = $('#bank3-transaction-id').val(); + + let trSearch = $('#tr-search-hash').val(); + + + + + + bank1ContractAddress = $('#bank1-contract-address').val(); + bank2ContractAddress = $('#bank2-contract-address').val(); + bank3ContractAddress = $('#bank3-contract-address').val(); + trContractAddress = $('#tr-contract-address').val(); + + + trContractInstance = TrLogContract.at(trContractAddress); + bank1ContractInstance = bank1Contract.at(bank1ContractAddress); + bank2ContractInstance = bank2Contract.at(bank2ContractAddress); + bank3ContractInstance = bank3Contract.at(bank3ContractAddress); + + regBank1ContractInstance = regBank1Contract.at(bank1ContractAddress); + regBank2ContractInstance = regBank2Contract.at(bank2ContractAddress); + regBank3ContractInstance = regBank3Contract.at(bank3ContractAddress); + + balance1 = bank1ContractInstance.balance(); + balance2 = bank2ContractInstance.balance(); + balance3 = bank3ContractInstance.balance(); + + trHash1 = bank1ContractInstance.transactionIDs(trId1); + trDetails1 = bank1ContractInstance.transactions(trHash1); + + trHash2 = bank2ContractInstance.transactionIDs(trId2); + trDetails2 = bank2ContractInstance.transactions(trHash2); + + + trHash3 = bank3ContractInstance.transactionIDs(trId3); + trDetails3 = bank3ContractInstance.transactions(trHash3); + + transactionLog = trContractInstance.transactions(trSearch); + + + $('#bank1-balance').html(`

Contract Address:${bank1ContractAddress}

Balance: ${balance1}

`); + $('#bank2-balance').html(`

Contract Address:${bank2ContractAddress}

Balance: ${balance2}

`); + $('#bank3-balance').html(`

Contract Address:${bank3ContractAddress}

Balance: ${balance3}

`); + + $('#bank1-tr-hash').html(`

Transaction Hash:${trHash1}

+

Value:${trDetails1[0]}

+

Sender Address:${trDetails1[1]}

+

Destination Address:${trDetails1[2]}

+

Confirmed:${trDetails1[3]}

`); + + $('#bank2-tr-hash').html(`

Transaction Hash:${trHash2}

+

Value:${trDetails2[0]}

+

Sender Address:${trDetails2[1]}

+

Destination Address:${trDetails2[2]}

+

Confirmed:${trDetails2[3]}

`); + + $('#bank3-tr-hash').html(`

Transaction Hash:${trHash3}

+

Value:${trDetails3[0]}

+

Sender Address:${trDetails3[1]}

+

Destination Address:${trDetails3[2]}

+

Confirmed:${trDetails3[3]}

`); + + $('#tr-contract-addr').html(`

Address:${trContractAddress}

`); + + + console.log (transactionLog[1]); + + let d = new Date(transactionLog[1]/1000); + + $('#transaction-log').html(`

ID:${trSearch}\n + Exists:${transactionLog[0]}\n + Timestamp: ${d.toString()}\n + Blocked: ${transactionLog[2]}

`); + +}; + +// We will use this function to show the status of the accounts generated by testRPC +const synchAccounts = () => { + //$('#gas-price').html(`Gas: ETH ${web3regulator.eth.gasPrice}`); + + + $('#regulator-account').html(""); + web3regulator.eth.accounts.forEach(account => { + let balance = web3regulator.eth.getBalance(account); + mainRegulatorAccount = account; + $('#regulator-account').append(`

${account} | ETH ${balance}

`); + }); + + $('#bank1-account').html(""); + web3bank1.eth.accounts.forEach(account => { + let balance = web3bank1.eth.getBalance(account); + mainBank1Account = account; + $('#bank1-account').append(`

${account} | ETH ${balance}

`); + }); + + $('#bank2-account').html(""); + web3bank2.eth.accounts.forEach(account => { + let balance = web3bank1.eth.getBalance(account); + mainBank2Account = account; + $('#bank2-account').append(`

${account} | ETH ${balance}

`); + }); + + $('#bank3-account').html(""); + web3bank3.eth.accounts.forEach(account => { + let balance = web3bank1.eth.getBalance(account); + mainBank3Account = account; + $('#bank3-account').append(`

${account} | ETH ${balance}

`); + }); + + +}; + +// This callback just avoids us to copy & past every time you want to use an address +const updateAddressFromLink = (event, inputSelector) => { + event.preventDefault(); + $(inputSelector).val($(event.target).siblings(".address").text()); +}; + + +// Show initial accounts state and initialize callback triggers +synchSmartContract(); +synchAccounts(); +$(document).on('change', '#bank1-contract-address', e => synchSmartContract()); +$(document).on('change', '#bank2-contract-address', e => synchSmartContract()); +$(document).on('change', '#bank3-contract-address', e => synchSmartContract()); +$(document).on('change', '#tr-contract-address', e => synchSmartContract()); + +$(document).on('change', '#bank1-transaction-id', e => synchSmartContract()); +$(document).on('change', '#bank2-transaction-id', e => synchSmartContract()); +$(document).on('change', '#bank3-transaction-id', e => synchSmartContract()); + +$(document).on('change', '#tr-search-hash', e => synchSmartContract()); + +$(document).on('change', '#tr-contract-address', e => synchSmartContract()); + + +$(document).on('click', '.from', e => updateAddressFromLink(e, '#seller-address')); +$(document).on('click', '.to', e => updateAddressFromLink(e, '#buyer-address')); +$(document).on('click', '.transaction', e => updateTransactionInfoFromLink(e)); + +// Every time we click the buy button, we will +$('#send').click(() => { + let sentValue = $('#sent-value').val(); + let senderAddress = $('#sender-address').val(); + let destinationAddress = $('#destination-address').val(); + let bankContractAddress = $('#contract-address').val(); + let correctSender = false; + let correctDestination = false; + + + let destinationNodePublicKey; + let senderAccount; + /* let trContractAddress = "0x180893a0ec847fa8c92786791348d7d65916acbb" + let bank1ContractAddress = "0xf9a2cb34b6b5fd7a2ac0c2e9b2b9406d6daffbd4"; + destinationAddress = "0xc8f717ba9593dc9d45c4518cf444d2cbd08af24d"; + */ + + $('#transaction-hash').html(`

Private Money Transfer

`); + + + if (senderAddress == bank1ContractAddress) { + senderContractInstance = bank1ContractInstance; + senderAccount = mainBank1Account; + correctSender = true; + } + if (senderAddress == bank2ContractAddress) { + senderContractInstance = bank2ContractInstance; + senderAccount = mainBank2Account; + correctSender = true; + } + if (senderAddress == bank3ContractAddress) { + senderContractInstance = bank3ContractInstance; + senderAccount = mainBank3Account; + correctSender = true; + } + + if (destinationAddress == bank1ContractAddress) { + destinationNodePublicKey = bank1NodePublicKey; + destinationContractInstance = bank1ContractInstance; + correctDestination = true; + } + if (destinationAddress == bank2ContractAddress) { + destinationNodePublicKey = bank2NodePublicKey; + destinationContractInstance = bank2ContractInstance; + correctDestination = true; + } + if (destinationAddress == bank3ContractAddress) { + destinationNodePublicKey = bank3NodePublicKey; + destinationContractInstance = bank3ContractInstance; + correctDestination = true; + } + + console.log(senderAddress); + console.log(destinationAddress); + console.log(bank3ContractAddress); + + + if (correctSender && correctDestination) { + senderContractInstance.sendValue(destinationAddress,sentValue,"random1", + {from:senderAccount,gas:500000, + privateFor:[regNodePublicKey,destinationNodePublicKey]}, + function (e, receipt){ + //This function will execute when the transaction is mined + console.log(e); + let senderTransactionNumber = senderContractInstance.totalTransactions()-1; + let destinationTransactionNumber = destinationContractInstance.totalTransactions()-1; + + let newTrHash = senderContractInstance.transactionIDs(senderTransactionNumber); + + $('#transaction-hash').html(`

Private Money Transfer Details:

`); + $('#transaction-hash').append(`

Sender Transaction ID:${senderTransactionNumber}

`); + $('#transaction-hash').append(`

Destination Transaction ID:${destinationTransactionNumber}

`); + $('#transaction-hash').append(`

Private Money Transfer TX Hash:${newTrHash}

`); + $('#transaction-hash').append(`

Warning:TX Hash must be in the public transaction log to be confirmed

`); + $('#transactions-list').append(`

${receipt}

`); + + }); + } + else { + $('#transaction-hash').html(`

Something went wrong! Please check addresses.

`); + } + + synchSmartContract(); + synchAccounts(); +}); + +$('#tr-add-button').click(() => { + trTxHash = $('#tr-add-hash').val(); + + trContractInstance.addTransaction(trTxHash,{from:mainRegulatorAccount,gas:500000}, + function (e, receipt){ + //This function will execute when the transaction is mined + let transaction = trContractInstance.transactions(trTxHash); + + //The transaction was successfully logged in the Public Transaction Log? This check does not work, and I do not know why, of course!!!! + if (transaction[0]) { + $('#tr-add-result').html(`

Transaction ${trTxHash} successfully included in the transaction log

`); + } + else { + $('#tr-add-result').html(`

Hopefully it was successfull, but you need to check manually using the "Search Public Transaction Log" just above. My code for checking if the TxHash was included is not working, I think the world state is not being updated fast enough, even after the receipt, where this check executes. Any help is appreciated. :)

`); + } + $('#transactions-list').append(`

${receipt}

`); + }); + +}); + +$('#tr-conf-button').click(() => { + confTxHash = $('#tr-conf-hash').val(); + let trSender = $('#tr-sender').val(); + + let senderNodePublicKey; + let destinationNodePublicKey; + + if (trSender == bank1ContractAddress) { + regSenderContractInstance = regBank1ContractInstance; + senderNodePublicKey = bank1NodePublicKey; + } + if (trSender == bank2ContractAddress) { + regSenderContractInstance = regBank2ContractInstance; + senderNodePublicKey = bank2NodePublicKey; + } + if (trSender == bank3ContractAddress) { + regSenderContractInstance = regBank3ContractInstance; + senderNodePublicKey = bank3NodePublicKey; + } + + let transaction = regSenderContractInstance.transactions(confTxHash); + //need to discover the recipient of the transaction to set privateFor public key correctly + if (transaction[2] == bank1ContractAddress) { + destinationNodePublicKey = bank1NodePublicKey; + } + if (transaction[2] == bank2ContractAddress) { + destinationNodePublicKey = bank2NodePublicKey; + } + if (transaction[2] == bank3ContractAddress) { + destinationNodePublicKey = bank3NodePublicKey; + } + + regSenderContractInstance.confirmTransactionRegulator(confTxHash,{from:mainRegulatorAccount,gas:500000, + privateFor:[senderNodePublicKey,destinationNodePublicKey]}, + function (e, receipt){ + //This function will execute when the transaction is mined + let transaction = regSenderContractInstance.transactions(confTxHash); + + //The transaction was successfully logged in the Public Transaction Log? This check does not work, and I do not know why, of course!!!! + if (transaction[3]) { + $('#tr-conf-result').html(`

Transaction ${trTxHash} successfully confirmed

`); + } + else { + $('#tr-conf-result').html(`

Hopefully it was successfull, but you need to check balances manually refreshing the page and see if the balance has changed. My code for checking if the TxHash was included is not working, I think the world state is not being updated fast enough, even after the receipt, where this check executes. Any help is appreciated. :)

`); + } + $('#transactions-list').append(`

${receipt}

`); + }); + + + +}); diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/index.html b/examples/5nodesRTGS/2-interacting-with-a-contract/index.html new file mode 100644 index 00000000..41285beb --- /dev/null +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/index.html @@ -0,0 +1,149 @@ + +
+ + + + + +
+ +
+
+
+
+

Regulator Account

+

+

Bank1 Account

+

+

Bank2 Account

+

+

Bank3 Account

+

+
+ + + +
+
+
+

Bank1

+
+ +
+
+

Balance: +

+

Bank2

+
+ +
+
+

Balance: +

Bank3

+
+ +
+
+

Balance: +

Public Transaction Log

+
+ +
+

Address: +

+
+
+ +
+

Get Bank1 Transaction Hash

+
+ +
+
+

Transaction Hash: +

+

Get Bank2 Transaction Hash

+
+ +
+
+

Transaction Hash: +

Get Bank3 Transaction Hash

+
+ +
+
+

Transaction Hash: +

+
+ +
+ +

Search Public Transaction Log

+
+ +
+
+
+        
+

Add Private Money Transfer TX Hash to the Public Transaction Log

+
+ +
+
+ +

Result:

+

Confirm Transaction (Regulator)

+
+ +
+ +
+
+ +

Result:

+ +
+
+

Create a Private Money Transfer

+
+ +
+
+
+ +
+
+
+ +
+
+ + +

Private Money Transfer

+
+ + + + +
+
+
+

Quorum Transactions List

+
+        
+
+
+
+ + + diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/package-lock.json b/examples/5nodesRTGS/2-interacting-with-a-contract/package-lock.json new file mode 100644 index 00000000..863c2b30 --- /dev/null +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/package-lock.json @@ -0,0 +1,2654 @@ +{ + "name": "interacting-with-a-contract", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "astw": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", + "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", + "requires": { + "acorn": "4.0.13" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babelify": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", + "requires": { + "babel-core": "6.26.0", + "object-assign": "4.1.1" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "bignumber.js": { + "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-pack": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", + "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "defined": "1.0.0", + "through2": "2.0.3", + "umd": "3.0.1" + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browserify": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.3.0.tgz", + "integrity": "sha1-/QA6I4asGuwSfwl4haPMY3O3RcQ=", + "requires": { + "JSONStream": "1.3.1", + "assert": "1.4.1", + "browser-pack": "6.0.2", + "browser-resolve": "1.11.2", + "browserify-zlib": "0.1.4", + "buffer": "5.0.8", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "defined": "1.0.0", + "deps-sort": "2.0.0", + "domain-browser": "1.1.7", + "duplexer2": "0.1.4", + "events": "1.1.1", + "glob": "7.1.2", + "has": "1.0.1", + "htmlescape": "1.1.1", + "https-browserify": "1.0.0", + "inherits": "2.0.3", + "insert-module-globals": "7.0.1", + "labeled-stream-splicer": "2.0.0", + "module-deps": "4.1.1", + "os-browserify": "0.1.2", + "parents": "1.0.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "read-only-stream": "2.0.0", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "shasum": "1.0.2", + "shell-quote": "1.6.1", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "0.10.31", + "subarg": "1.0.0", + "syntax-error": "1.3.0", + "through2": "2.0.3", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4", + "xtend": "4.0.1" + } + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "requires": { + "pako": "0.2.9" + } + }, + "buffer": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", + "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cached-path-relative": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", + "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "combine-source-map": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", + "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", + "requires": { + "convert-source-map": "1.1.3", + "inline-source-map": "0.6.2", + "lodash.memoize": "3.0.4", + "source-map": "0.5.7" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.0.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5", + "randomfill": "1.0.3" + } + }, + "crypto-js": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "requires": { + "JSONStream": "1.3.1", + "shasum": "1.0.2", + "subarg": "1.0.0", + "through2": "2.0.3" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "2.0.1" + } + }, + "detective": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.0.tgz", + "integrity": "sha512-4mBqSEdMfBpRAo/DQZnTcAXenpiSIJmVKbCMSotS+SFWWcrP/CKM6iBRPdTiEO+wZhlfEsoZlGqpG6ycl5vTqw==", + "requires": { + "acorn": "5.2.1", + "defined": "1.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" + } + } + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "file-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/file-match/-/file-match-1.0.2.tgz", + "integrity": "sha1-ycrSZdLIrfOoFHWw30dYWQafrvc=", + "requires": { + "utils-extend": "1.0.8" + } + }, + "file-system": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/file-system/-/file-system-2.2.2.tgz", + "integrity": "sha1-fWWDPjojR9zZVqgTxncVPtPt2Yc=", + "requires": { + "file-match": "1.0.2", + "utils-extend": "1.0.8" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "0.5.7" + } + }, + "insert-module-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", + "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "concat-stream": "1.5.2", + "is-buffer": "1.1.6", + "lexical-scope": "1.2.0", + "process": "0.11.10", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "requires": { + "jsonify": "0.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "labeled-stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", + "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", + "requires": { + "inherits": "2.0.3", + "isarray": "0.0.1", + "stream-splicer": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "lexical-scope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", + "requires": { + "astw": "2.2.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "module-deps": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", + "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", + "requires": { + "JSONStream": "1.3.1", + "browser-resolve": "1.11.2", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "defined": "1.0.0", + "detective": "4.7.0", + "duplexer2": "0.1.4", + "inherits": "2.0.3", + "parents": "1.0.1", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "stream-combiner2": "1.1.1", + "subarg": "1.0.0", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-browserify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", + "requires": { + "shell-quote": "1.6.1" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "requires": { + "path-platform": "0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "requires": { + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "1.3.1" + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "requires": { + "randombytes": "2.0.5", + "safe-buffer": "5.1.1" + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "0.5.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "requires": { + "json-stable-stringify": "0.0.1", + "sha.js": "2.4.9" + } + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "solc": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.19.tgz", + "integrity": "sha512-hvi/vi9rQcB73poRLoLRfQIYKwmdhrNbZlOOFCGd5v58gEsYEUr3+oHPSXhyk4CFNchWC2ojpMYrHDJNm0h4jQ==", + "requires": { + "fs-extra": "0.30.0", + "memorystream": "0.3.1", + "require-from-string": "1.2.1", + "semver": "5.4.1", + "yargs": "4.8.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "0.5.7" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "requires": { + "duplexer2": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "0.2.1" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "requires": { + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "syntax-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", + "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", + "requires": { + "acorn": "4.0.13" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "requires": { + "process": "0.11.10" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "umd": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", + "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-extend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/utils-extend/-/utils-extend-1.0.8.tgz", + "integrity": "sha1-zP17ZFQPjpDuIe7Fd2nQZRyril8=" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "watchify": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.9.0.tgz", + "integrity": "sha1-8HX9LoqGrN6Eztum5cKgvt1SPZ4=", + "requires": { + "anymatch": "1.3.2", + "browserify": "14.3.0", + "chokidar": "1.7.0", + "defined": "1.0.0", + "outpipe": "1.1.1", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "web3quorum": { + "version": "0.20.4", + "resolved": "https://registry.npmjs.org/web3quorum/-/web3quorum-0.20.4.tgz", + "integrity": "sha512-A5qbzqwZtx6XUJLb7BZGsgZAdz5jgvyXs4hMhbxKVbKnuXRbHXpYp18PYx8O3skLuYELQz7uvvzduIfKrktfvQ==", + "requires": { + "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "crypto-js": "3.1.8", + "utf8": "2.1.2", + "xhr2": "0.1.4", + "xmlhttprequest": "1.8.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "requires": { + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "lodash.assign": "4.2.0", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "requires": { + "camelcase": "3.0.0", + "lodash.assign": "4.2.0" + } + } + } +} diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/package.json b/examples/5nodesRTGS/2-interacting-with-a-contract/package.json new file mode 100644 index 00000000..ee6505ae --- /dev/null +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/package.json @@ -0,0 +1,33 @@ +{ + "name": "interacting-with-a-contract", + "version": "1.0.0", + "description": "SC interaction JS app", + "main": "app.js", + "dependencies": { + "babel-preset-es2015": "~6.24.1", + "babelify": "~7.3.0", + "browserify": "~14.3.0", + "file-system": "~2.2.2", + "jquery": "~3.2.1", + "solc": "~0.4.15", + "watchify": "~3.9.0", + "web3quorum": "~0.20.4" + }, + "browserify": { + "transform": [ + [ + "babelify", + { + "presets": [ + "es2015" + ] + } + ] + ] + }, + "scripts": { + "start": "watchify app.js -o bundle.js -v" + }, + "author": "facuspagnuolo", + "license": "ISC" +} diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md b/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md new file mode 100644 index 00000000..d1dc9859 --- /dev/null +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md @@ -0,0 +1,12 @@ + +# Running instructions +1. Run `npm install` +2. Run `raft-init.sh` `raft-start.sh` in the geth node +3. Deploy and provision the contracts following the 5nodesRTGS README, steps 4-10. The HTML file has the same contract addresses of a freshly initiated 5NodesRTGS example, change if necessary +4. Replace the IP address from lines `5-8` in `app.js` file. +5. Run `npm start` +6. Open `index.html` and start playing + + + +Thanks to https://github.com/facuspagnuolo/ethereum-spiking from where I copied almost all the code. From 7e5355414376684e803ac22bc54747b46e57cf96 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 8 Dec 2017 22:50:16 +0000 Subject: [PATCH 28/31] Readme update --- examples/5nodesRTGS/2-interacting-with-a-contract/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md b/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md index d1dc9859..9fb812c9 100644 --- a/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md @@ -7,6 +7,6 @@ 5. Run `npm start` 6. Open `index.html` and start playing - +It still has a lot of bugs and it is FAR from well written, however it is a good example of a javascript page interactiong with Quorum using private transactions. Thanks to https://github.com/facuspagnuolo/ethereum-spiking from where I copied almost all the code. From e63f3c020a9b6ad6f246c303c2940a3e07e3ac65 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 8 Dec 2017 22:51:28 +0000 Subject: [PATCH 29/31] Readme update --- examples/5nodesRTGS/2-interacting-with-a-contract/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md b/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md index 9fb812c9..2316ead2 100644 --- a/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md +++ b/examples/5nodesRTGS/2-interacting-with-a-contract/readme.md @@ -7,6 +7,6 @@ 5. Run `npm start` 6. Open `index.html` and start playing -It still has a lot of bugs and it is FAR from well written, however it is a good example of a javascript page interactiong with Quorum using private transactions. +It still has a lot of bugs and it is FAR from well written, however it is a good example of a javascript page interacting with Quorum using private transactions. Thanks to https://github.com/facuspagnuolo/ethereum-spiking from where I copied almost all the code. From 3c2b291181ed2858aa8a166fe0ee860de9ced69f Mon Sep 17 00:00:00 2001 From: Zhongjie He Date: Thu, 1 Mar 2018 18:36:23 -0500 Subject: [PATCH 30/31] Update README.md --- examples/5nodesRTGS/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/5nodesRTGS/README.md b/examples/5nodesRTGS/README.md index 58596e6a..10d74d0b 100644 --- a/examples/5nodesRTGS/README.md +++ b/examples/5nodesRTGS/README.md @@ -78,7 +78,7 @@ The script uses a solidity 0.3.6 precompiled bytecode because of quorum issue 82 ``` var addresstr = var address1 = -var address2 = +var address2 = var address3 = var abi = [{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"type":"function","payable":true},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"type":"function","payable":true},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"type":"function","payable":true},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"type":"function","payable":true},{"inputs":[],"type":"constructor","payable":true},{"type":"fallback","payable":true}] From c88ef379c5e31f928cb3f1b70f5b81f3b6f5eec8 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 12 Apr 2018 17:41:54 +0000 Subject: [PATCH 31/31] Created deploy examples using compiled contracts in solidoty 0.4.10 and 0.4.21. These deploy scripts still *DOES NOT WORK*, they serve only as examples of Quorum issue 82 (https://github.com/jpmorganchase/quorum/issues/82) --- examples/5nodesRTGS/deploy-bankContract-0-4-10.js | 13 +++++++++++++ examples/5nodesRTGS/deploy-bankContract-0-4-21.js | 13 +++++++++++++ .../deploy-regulatorTransactionList-0-4-10.js | 12 ++++++++++++ .../deploy-regulatorTransactionList-0-4-21.js | 12 ++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 examples/5nodesRTGS/deploy-bankContract-0-4-10.js create mode 100644 examples/5nodesRTGS/deploy-bankContract-0-4-21.js create mode 100644 examples/5nodesRTGS/deploy-regulatorTransactionList-0-4-10.js create mode 100644 examples/5nodesRTGS/deploy-regulatorTransactionList-0-4-21.js diff --git a/examples/5nodesRTGS/deploy-bankContract-0-4-10.js b/examples/5nodesRTGS/deploy-bankContract-0-4-10.js new file mode 100644 index 00000000..aa3701cf --- /dev/null +++ b/examples/5nodesRTGS/deploy-bankContract-0-4-10.js @@ -0,0 +1,13 @@ +var bankcontractContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"inputs":[],"payable":false,"type":"constructor","stateMutability":"nonpayable"}]); +var bankcontract = bankcontractContract.new( + { + from: web3.eth.accounts[0], + data: '0x606060405260006000556000600160146101000a81548160ff021916908315150217905550603c6002556000600555341561003657fe5b5b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b6122c8806100896000396000f30060606040523615610105576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c97239714610107578063422753681461012b57806343e928621461014b5780635ac2d894146101ae578063642f2eaf146101d2578063679e9f3a1461028257806369184f15146102a8578063692a4e51146102de578063694fc108146103085780637a2dc88a1461035a5780638092f405146103ac57806385937670146103e2578063885cbbab14610464578063a153ed6d14610476578063b69ef8a81461049a578063b9a60038146104c0578063c3cb5b89146104e6578063dd8fee1414610522578063fb1669ca14610574575bfe5b341561010f57fe5b610129600480803560001916906020019091905050610594565b005b341561013357fe5b6101496004808035906020019091905050610be7565b005b341561015357fe5b6101ac600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c50565b005b34156101b657fe5b6101d0600480803560001916906020019091905050610f81565b005b34156101da57fe5b6101f460048080356000191690602001909190505061151d565b604051808681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001831515151581526020018281526020019550505050505060405180910390f35b341561028a57fe5b6102926115a0565b6040518082815260200191505060405180910390f35b34156102b057fe5b6102dc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115a6565b005b34156102e657fe5b6102ee611649565b604051808215151515815260200191505060405180910390f35b341561031057fe5b61031861165c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561036257fe5b61036a611682565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103b457fe5b6103e0600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116a8565b005b34156103ea57fe5b610462600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061174b565b005b341561046c57fe5b610474611d79565b005b341561047e57fe5b610498600480803560001916906020019091905050611df5565b005b34156104a257fe5b6104aa6121e9565b6040518082815260200191505060405180910390f35b34156104c857fe5b6104d06121ef565b6040518082815260200191505060405180910390f35b34156104ee57fe5b61050460048080359060200190919050506121f5565b60405180826000191660001916815260200191505060405180910390f35b341561052a57fe5b61053261220d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561057c57fe5b6105926004808035906020019091905050612233565b005b600060006000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105f75760006000fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925060066000856000191660001916815260200190815260200160002060020160149054906101000a900460ff161580156106e557508273ffffffffffffffffffffffffffffffffffffffff1663c71cca16856000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156106cc57fe5b60325a03f115156106d957fe5b50505060405180519050155b801561078057508273ffffffffffffffffffffffffffffffffffffffff1663054380f9856000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561076857fe5b60325a03f1151561077557fe5b505050604051805190505b15610bdf57600160066000866000191660001916815260200190815260200160002060020160146101000a81548160ff0219169083151502179055503073ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156109cd57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806108d45750600160149054906101000a900460ff165b1561090857600660008560001916600019168152602001908152602001600020600001546000600082825401925050819055505b60066000856000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050600060405180830381600087803b15156109bc57fe5b60325a03f115156109c957fe5b5050505b3073ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610bde57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610ae55750600160149054906101000a900460ff165b15610b1957600660008560001916600019168152602001908152602001600020600001546000600082825403925050819055505b60066000856000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a153ed6d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050600060405180830381600087803b1515610bcd57fe5b60325a03f11515610bda57fe5b5050505b5b5b5b50505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c445760006000fd5b806002819055505b5b50565b60006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610d1957fe5b60325a03f11515610d2657fe5b505050604051805190501515610d3c5760006000fd5b3330854286604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183815260200182805190602001908083835b60208310610e025780518252602082019150602081019050602083039250610ddf565b6001836020036101000a038019825116818451168082178552505050505050905001955050505050506040518091039020915081600760006005548152602001908152602001600020816000191690555083600660008460001916600019168152602001908152602001600020600001819055503360066000846000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503060066000846000191660001916815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060066000846000191660001916815260200190815260200160002060020160146101000a81548160ff0219169083151502179055506005600081548092919060010191905055505b5b50505050565b600060006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166350654260306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561106357fe5b60325a03f1151561107057fe5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614151561109d5760006000fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506002548373ffffffffffffffffffffffffffffffffffffffff16632fbff520866000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561114157fe5b60325a03f1151561114e57fe5b505050604051805190504203118015611190575060066000856000191660001916815260200190815260200160002060020160149054906101000a900460ff16155b801561122c57508273ffffffffffffffffffffffffffffffffffffffff1663c71cca16856000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561121357fe5b60325a03f1151561122057fe5b50505060405180519050155b80156112c757508273ffffffffffffffffffffffffffffffffffffffff1663054380f9856000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156112af57fe5b60325a03f115156112bc57fe5b505050604051805190505b15611515573073ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561151457600160066000866000191660001916815260200190815260200160002060020160146101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061141b5750600160149054906101000a900460ff165b1561144f57600660008560001916600019168152602001908152602001600020600001546000600082825403925050819055505b60066000856000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050600060405180830381600087803b151561150357fe5b60325a03f1151561151057fe5b5050505b5b5b5b50505050565b60066020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160149054906101000a900460ff16908060030154905085565b60025481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156116035760006000fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b50565b600160149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117055760006000fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b50565b60006000600060006000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166350654260306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561183157fe5b60325a03f1151561183e57fe5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614151561186b5760006000fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692503088884289604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183815260200182805190602001908083835b602083106119565780518252602082019150602081019050602083039250611933565b6001836020036101000a03801982511681845116808217855250505050505090500195505050505050604051809103902093508360076000600554815260200190815260200160002081600019169055508273ffffffffffffffffffffffffffffffffffffffff1663288bdecf896000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515611a4757fe5b60325a03f11515611a5457fe5b505050604051805190501580611b1e57508273ffffffffffffffffffffffffffffffffffffffff16638c41eae6306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515611b0557fe5b60325a03f11515611b1257fe5b50505060405180519050155b15611b295760006000fd5b8791508173ffffffffffffffffffffffffffffffffffffffff166343e9286288886040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200180602001828103825283818151815260200191508051906020019080838360008314611bca575b805182526020831115611bca57602082019150602081019050602083039250611ba6565b505050905090810190601f168015611bf65780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1515611c1257fe5b60325a03f11515611c1f57fe5b50505086600660008660001916600019168152602001908152602001600020600001819055503060066000866000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760066000866000191660001916815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005460066000866000191660001916815260200190815260200160002060030181905550600060066000866000191660001916815260200190815260200160002060020160146101000a81548160ff0219169083151502179055506005600081548092919060010191905055505b5b5050505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd65760006000fd5b6001600160146101000a81548160ff0219169083151502179055505b5b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515611ebc57fe5b60325a03f11515611ec957fe5b505050604051805190501515611edf5760006000fd5b60066000836000191660001916815260200190815260200160002060020160149054906101000a900460ff1615156121e357600160066000846000191660001916815260200190815260200160002060020160146101000a81548160ff0219169083151502179055503073ffffffffffffffffffffffffffffffffffffffff1660066000846000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561209557600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000846000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806120605750600160149054906101000a900460ff165b1561209457600660008360001916600019168152602001908152602001600020600001546000600082825401925050819055505b5b3073ffffffffffffffffffffffffffffffffffffffff1660066000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121e257600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806121ad5750600160149054906101000a900460ff165b156121e157600660008360001916600019168152602001908152602001600020600001546000600082825403925050819055505b5b5b5b5b5050565b60005481565b60055481565b60076020528060005260406000206000915090505481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122905760006000fd5b806000819055505b5b505600a165627a7a72305820cfb730d8d3ec4317d6932c771a7486f24398a49273734386e66eb40b12639ecf0029', + gas: '4700000', + privateFor: ["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="] + }, function (e, contract){ + console.log(e, contract); + if (typeof contract.address !== 'undefined') { + console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); + } + }) diff --git a/examples/5nodesRTGS/deploy-bankContract-0-4-21.js b/examples/5nodesRTGS/deploy-bankContract-0-4-21.js new file mode 100644 index 00000000..4621f9ab --- /dev/null +++ b/examples/5nodesRTGS/deploy-bankContract-0-4-21.js @@ -0,0 +1,13 @@ +var bankcontractContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionRegulator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_seconds","type":"uint256"}],"name":"setConfirmationTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"receiveValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionBank","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"value","type":"uint256"},{"name":"senderContract","type":"address"},{"name":"destinationContract","type":"address"},{"name":"confirmed","type":"bool"},{"name":"senderBalanceAtTransfer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"confirmationTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"setTransactionListAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isRegulatorNode","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TransactionListAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"thisBankContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_thisBankContract","type":"address"}],"name":"setThisBankContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_destination","type":"address"},{"name":"_value","type":"uint256"},{"name":"_random","type":"string"}],"name":"sendValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setRegulatorNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"confirmTransactionPair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"balance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTransactions","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"transactionIDs","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_balance","type":"uint256"}],"name":"setBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]); +var bankcontract = bankcontractContract.new( + { + from: web3.eth.accounts[0], + data: '0x6060604052600080556000600160146101000a81548160ff021916908315150217905550603c6002556000600555341561003857600080fd5b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061229c806100886000396000f300606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c9723971461010c578063422753681461013357806343e92862146101565780635ac2d894146101bc578063642f2eaf146101e3578063679e9f3a1461029657806369184f15146102bf578063692a4e51146102f8578063694fc108146103255780637a2dc88a1461037a5780638092f405146103cf5780638593767014610408578063885cbbab1461048d578063a153ed6d146104a2578063b69ef8a8146104c9578063b9a60038146104f2578063c3cb5b891461051b578063dd8fee141461055a578063fb1669ca146105af575b600080fd5b341561011757600080fd5b6101316004808035600019169060200190919050506105d2565b005b341561013e57600080fd5b6101546004808035906020019091905050610c19565b005b341561016157600080fd5b6101ba600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c7f565b005b34156101c757600080fd5b6101e1600480803560001916906020019091905050610fa8565b005b34156101ee57600080fd5b61020860048080356000191690602001909190505061152a565b604051808681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001831515151581526020018281526020019550505050505060405180910390f35b34156102a157600080fd5b6102a96115ad565b6040518082815260200191505060405180910390f35b34156102ca57600080fd5b6102f6600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115b3565b005b341561030357600080fd5b61030b611653565b604051808215151515815260200191505060405180910390f35b341561033057600080fd5b610338611666565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561038557600080fd5b61038d61168c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103da57600080fd5b610406600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116b2565b005b341561041357600080fd5b61048b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611752565b005b341561049857600080fd5b6104a0611d5f565b005b34156104ad57600080fd5b6104c7600480803560001916906020019091905050611dd7565b005b34156104d457600080fd5b6104dc6121c0565b6040518082815260200191505060405180910390f35b34156104fd57600080fd5b6105056121c6565b6040518082815260200191505060405180910390f35b341561052657600080fd5b61053c60048080359060200190919050506121cc565b60405180826000191660001916815260200191505060405180910390f35b341561056557600080fd5b61056d6121e4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ba57600080fd5b6105d0600480803590602001909190505061220a565b005b6000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925060066000856000191660001916815260200190815260200160002060020160149054906101000a900460ff1615801561071b57508273ffffffffffffffffffffffffffffffffffffffff1663c71cca16856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561070257600080fd5b5af1151561070f57600080fd5b50505060405180519050155b80156107b057508273ffffffffffffffffffffffffffffffffffffffff1663054380f9856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561079857600080fd5b5af115156107a557600080fd5b505050604051805190505b15610c1357600160066000866000191660001916815260200190815260200160002060020160146101000a81548160ff0219169083151502179055503073ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156109ff57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806109045750600160149054906101000a900460ff165b15610937576006600085600019166000191681526020019081526020016000206000015460008082825401925050819055505b60066000856000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050600060405180830381600087803b15156109ee57600080fd5b5af115156109fb57600080fd5b5050505b3073ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c1257600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610b175750600160149054906101000a900460ff165b15610b4a576006600085600019166000191681526020019081526020016000206000015460008082825403925050819055505b60066000856000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a153ed6d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050600060405180830381600087803b1515610c0157600080fd5b5af11515610c0e57600080fd5b5050505b5b50505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c7557600080fd5b8060028190555050565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610d4157600080fd5b5af11515610d4e57600080fd5b505050604051805190501515610d6357600080fd5b3330854286604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183815260200182805190602001908083835b602083101515610e2b5780518252602082019150602081019050602083039250610e06565b6001836020036101000a038019825116818451168082178552505050505050905001955050505050506040518091039020915081600760006005548152602001908152602001600020816000191690555083600660008460001916600019168152602001908152602001600020600001819055503360066000846000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503060066000846000191660001916815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060066000846000191660001916815260200190815260200160002060020160146101000a81548160ff02191690831515021790555060056000815480929190600101919050555050505050565b6000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166350654260306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561108357600080fd5b5af1151561109057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156110bc57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506002548373ffffffffffffffffffffffffffffffffffffffff16632fbff520866040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561115a57600080fd5b5af1151561116757600080fd5b5050506040518051905042031180156111a9575060066000856000191660001916815260200190815260200160002060020160149054906101000a900460ff16155b801561123f57508273ffffffffffffffffffffffffffffffffffffffff1663c71cca16856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561122657600080fd5b5af1151561123357600080fd5b50505060405180519050155b80156112d457508273ffffffffffffffffffffffffffffffffffffffff1663054380f9856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156112bc57600080fd5b5af115156112c957600080fd5b505050604051805190505b15611524573073ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561152357600160066000866000191660001916815260200190815260200160002060020160146101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806114285750600160149054906101000a900460ff165b1561145b576006600085600019166000191681526020019081526020016000206000015460008082825403925050819055505b60066000856000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508173ffffffffffffffffffffffffffffffffffffffff1663a153ed6d856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050600060405180830381600087803b151561151257600080fd5b5af1151561151f57600080fd5b5050505b5b50505050565b60066020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160149054906101000a900460ff16908060030154905085565b60025481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561160f57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170e57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166350654260306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561183057600080fd5b5af1151561183d57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614151561186957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692503088884289604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184815260200183815260200182805190602001908083835b6020831015156119565780518252602082019150602081019050602083039250611931565b6001836020036101000a03801982511681845116808217855250505050505090500195505050505050604051809103902093508360076000600554815260200190815260200160002081600019169055508273ffffffffffffffffffffffffffffffffffffffff1663288bdecf896040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515611a4157600080fd5b5af11515611a4e57600080fd5b505050604051805190501580611b1257508273ffffffffffffffffffffffffffffffffffffffff16638c41eae6306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515611af957600080fd5b5af11515611b0657600080fd5b50505060405180519050155b15611b1c57600080fd5b8791508173ffffffffffffffffffffffffffffffffffffffff166343e9286288886040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611bae578082015181840152602081019050611b93565b50505050905090810190601f168015611bdb5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1515611bfa57600080fd5b5af11515611c0757600080fd5b50505086600660008660001916600019168152602001908152602001600020600001819055503060066000866000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760066000866000191660001916815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005460066000866000191660001916815260200190815260200160002060030181905550600060066000866000191660001916815260200190815260200160002060020160146101000a81548160ff0219169083151502179055506005600081548092919060010191905055505050505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dbb57600080fd5b60018060146101000a81548160ff021916908315150217905550565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663288bdecf336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515611e9857600080fd5b5af11515611ea557600080fd5b505050604051805190501515611eba57600080fd5b60066000836000191660001916815260200190815260200160002060020160149054906101000a900460ff1615156121bc57600160066000846000191660001916815260200190815260200160002060020160146101000a81548160ff0219169083151502179055503073ffffffffffffffffffffffffffffffffffffffff1660066000846000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561206f57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000846000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061203b5750600160149054906101000a900460ff165b1561206e576006600083600019166000191681526020019081526020016000206000015460008082825401925050819055505b5b3073ffffffffffffffffffffffffffffffffffffffff1660066000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121bb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660066000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806121875750600160149054906101000a900460ff165b156121ba576006600083600019166000191681526020019081526020016000206000015460008082825403925050819055505b5b5b5050565b60005481565b60055481565b60076020528060005260406000206000915090505481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561226657600080fd5b80600081905550505600a165627a7a7230582032d1c3a1e4248485339c97c8de48ff76a1159511c7809e00acef3db21c30d79e0029', + gas: '4700000', + privateFor: ["BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo=","QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=","oNspPPgszVUFw0qmGFfWwh1uxVUXgvBxleXORHj07g8="] + }, function (e, contract){ + console.log(e, contract); + if (typeof contract.address !== 'undefined') { + console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); + } + }) diff --git a/examples/5nodesRTGS/deploy-regulatorTransactionList-0-4-10.js b/examples/5nodesRTGS/deploy-regulatorTransactionList-0-4-10.js new file mode 100644 index 00000000..9d236d14 --- /dev/null +++ b/examples/5nodesRTGS/deploy-regulatorTransactionList-0-4-10.js @@ -0,0 +1,12 @@ +var regulatortransactionlistContract = web3.eth.contract([{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionExistance","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_contract","type":"address"},{"name":"_sender","type":"address"}],"name":"addBank","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"blockBank","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankExistance","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankSender","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"exists","type":"bool"},{"name":"timestamp","type":"uint256"},{"name":"blocked","type":"bool"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"authorizeBank","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"banks","outputs":[{"name":"name","type":"string"},{"name":"authorized","type":"bool"},{"name":"exists","type":"bool"},{"name":"authorizedSender","type":"address"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankState","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"addTransaction","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"unblockTransaction","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionState","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function","stateMutability":"view"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"blockTransaction","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[],"name":"getRegulator","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function","stateMutability":"view"},{"inputs":[],"payable":false,"type":"constructor","stateMutability":"nonpayable"}]); +var regulatortransactionlist = regulatortransactionlistContract.new( + { + from: web3.eth.accounts[0], + data: '0x6060604052341561000c57fe5b5b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b610f3b8061005f6000396000f300606060405236156100e4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063054380f9146100e65780631eaa25561461012257806321574ff8146101ba578063288bdecf146101f05780632fbff5201461023e5780635065426014610276578063642f2eaf146102ec5780636f74a2c01461033a57806380c3b8c2146103705780638c41eae61461048557806394bbaa80146104d3578063b809e2f9146104f7578063c71cca161461051b578063dd8fee1414610557578063e5f9f94d146105a9578063f7e317f4146105cd575bfe5b34156100ee57fe5b61010860048080356000191690602001909190505061061f565b604051808215151515815260200191505060405180910390f35b341561012a57fe5b6101b8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610655565b005b34156101c257fe5b6101ee600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610847565b005b34156101f857fe5b610224600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610904565b604051808215151515815260200191505060405180910390f35b341561024657fe5b61026060048080356000191690602001909190505061095e565b6040518082815260200191505060405180910390f35b341561027e57fe5b6102aa600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610987565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102f457fe5b61030e6004808035600019169060200190919050506109f4565b604051808415151515815260200183815260200182151515158152602001935050505060405180910390f35b341561034257fe5b61036e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a38565b005b341561037857fe5b6103a4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610af5565b604051808060200185151515158152602001841515151581526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252868181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104735780601f1061044857610100808354040283529160200191610473565b820191906000526020600020905b81548152906001019060200180831161045657829003601f168201915b50509550505050505060405180910390f35b341561048d57fe5b6104b9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b5e565b604051808215151515815260200191505060405180910390f35b34156104db57fe5b6104f5600480803560001916906020019091905050610bb8565b005b34156104ff57fe5b610519600480803560001916906020019091905050610c4d565b005b341561052357fe5b61053d600480803560001916906020019091905050610d18565b604051808215151515815260200191505060405180910390f35b341561055f57fe5b610567610d4e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b157fe5b6105cb600480803560001916906020019091905050610d74565b005b34156105d557fe5b6105dd610e3f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060016000836000191660001916815260200190815260200160002060000160009054906101000a900460ff1690505b919050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106b25760006000fd5b82600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000019080519060200190610708929190610e6a565b506001600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160016101000a81548160ff0219169083151502179055506001600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b505050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108a45760006000fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055505b5b50565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff1690505b919050565b60006001600083600019166000191681526020019081526020016000206001015490505b919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b919050565b60016020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900460ff16905083565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a955760006000fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055505b5b50565b600260205280600052604060002060009150905080600001908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1690505b919050565b600160016000836000191660001916815260200190815260200160002060000160006101000a81548160ff0219169083151502179055504260016000836000191660001916815260200190815260200160002060010181905550600060016000836000191660001916815260200190815260200160002060020160006101000a81548160ff0219169083151502179055505b50565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610caa5760006000fd5b60016000826000191660001916815260200190815260200160002060000160009054906101000a900460ff1615610d1357600060016000836000191660001916815260200190815260200160002060020160006101000a81548160ff0219169083151502179055505b5b5b50565b600060016000836000191660001916815260200190815260200160002060020160009054906101000a900460ff1690505b919050565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dd15760006000fd5b60016000826000191660001916815260200190815260200160002060000160009054906101000a900460ff1615610e3a57600160016000836000191660001916815260200190815260200160002060020160006101000a81548160ff0219169083151502179055505b5b5b50565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610eab57805160ff1916838001178555610ed9565b82800160010185558215610ed9579182015b82811115610ed8578251825591602001919060010190610ebd565b5b509050610ee69190610eea565b5090565b610f0c91905b80821115610f08576000816000905550600101610ef0565b5090565b905600a165627a7a723058206828bf6bff945aac605d5fbff7d02b27eb55187cfce94de378c783efefa575dd0029', + gas: '4700000' + }, function (e, contract){ + console.log(e, contract); + if (typeof contract.address !== 'undefined') { + console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); + } + }) diff --git a/examples/5nodesRTGS/deploy-regulatorTransactionList-0-4-21.js b/examples/5nodesRTGS/deploy-regulatorTransactionList-0-4-21.js new file mode 100644 index 00000000..798eb522 --- /dev/null +++ b/examples/5nodesRTGS/deploy-regulatorTransactionList-0-4-21.js @@ -0,0 +1,12 @@ +var regulatortransactionlistContract = web3.eth.contract([{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionExistance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_contract","type":"address"},{"name":"_sender","type":"address"}],"name":"addBank","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"blockBank","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankExistance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankSender","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"transactions","outputs":[{"name":"exists","type":"bool"},{"name":"timestamp","type":"uint256"},{"name":"blocked","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"authorizeBank","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"banks","outputs":[{"name":"name","type":"string"},{"name":"authorized","type":"bool"},{"name":"exists","type":"bool"},{"name":"authorizedSender","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_contract","type":"address"}],"name":"getBankState","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"addTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"unblockTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"getTransactionState","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"regulator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transactionID","type":"bytes32"}],"name":"blockTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRegulator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]); +var regulatortransactionlist = regulatortransactionlistContract.new( + { + from: web3.eth.accounts[0], + data: '0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610fcc8061005e6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063054380f9146100eb5780631eaa25561461012a57806321574ff8146101c5578063288bdecf146101fe5780632fbff5201461024f578063506542601461028a578063642f2eaf146103035780636f74a2c01461035457806380c3b8c21461038d5780638c41eae61461048857806394bbaa80146104d9578063b809e2f914610500578063c71cca1614610527578063dd8fee1414610566578063e5f9f94d146105bb578063f7e317f4146105e2575b600080fd5b34156100f657600080fd5b610110600480803560001916906020019091905050610637565b604051808215151515815260200191505060405180910390f35b341561013557600080fd5b6101c3600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061066c565b005b34156101d057600080fd5b6101fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085a565b005b341561020957600080fd5b610235600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610913565b604051808215151515815260200191505060405180910390f35b341561025a57600080fd5b61027460048080356000191690602001909190505061096c565b6040518082815260200191505060405180910390f35b341561029557600080fd5b6102c1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610994565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030e57600080fd5b610328600480803560001916906020019091905050610a00565b604051808415151515815260200183815260200182151515158152602001935050505060405180910390f35b341561035f57600080fd5b61038b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a44565b005b341561039857600080fd5b6103c4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610afd565b604051808060200185151515158152602001841515151581526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825286818151815260200191508051906020019080838360005b8381101561044a57808201518184015260208101905061042f565b50505050905090810190601f1680156104775780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561049357600080fd5b6104bf600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bff565b604051808215151515815260200191505060405180910390f35b34156104e457600080fd5b6104fe600480803560001916906020019091905050610c58565b005b341561050b57600080fd5b610525600480803560001916906020019091905050610ceb565b005b341561053257600080fd5b61054c600480803560001916906020019091905050610db2565b604051808215151515815260200191505060405180910390f35b341561057157600080fd5b610579610de7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105c657600080fd5b6105e0600480803560001916906020019091905050610e0c565b005b34156105ed57600080fd5b6105f5610ed2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060016000836000191660001916815260200190815260200160002060000160009054906101000a900460ff169050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106c757600080fd5b82600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001908051906020019061071d929190610efb565b506001600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160016101000a81548160ff0219169083151502179055506001600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b557600080fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160019054906101000a900460ff169050919050565b6000600160008360001916600019168152602001908152602001600020600101549050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60016020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900460ff16905083565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9f57600080fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555050565b6002602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b5050505050908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff169050919050565b6001806000836000191660001916815260200190815260200160002060000160006101000a81548160ff0219169083151502179055504260016000836000191660001916815260200190815260200160002060010181905550600060016000836000191660001916815260200190815260200160002060020160006101000a81548160ff02191690831515021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d4657600080fd5b60016000826000191660001916815260200190815260200160002060000160009054906101000a900460ff1615610daf57600060016000836000191660001916815260200190815260200160002060020160006101000a81548160ff0219169083151502179055505b50565b600060016000836000191660001916815260200190815260200160002060020160009054906101000a900460ff169050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e6757600080fd5b60016000826000191660001916815260200190815260200160002060000160009054906101000a900460ff1615610ecf576001806000836000191660001916815260200190815260200160002060020160006101000a81548160ff0219169083151502179055505b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610f3c57805160ff1916838001178555610f6a565b82800160010185558215610f6a579182015b82811115610f69578251825591602001919060010190610f4e565b5b509050610f779190610f7b565b5090565b610f9d91905b80821115610f99576000816000905550600101610f81565b5090565b905600a165627a7a72305820e0813f84c4801f3855422fca230c97b75c73adfcd13199358b24319581ecc5410029', + gas: '4700000' + }, function (e, contract){ + console.log(e, contract); + if (typeof contract.address !== 'undefined') { + console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); + } + })