Skip to content

Commit

Permalink
Merge pull request #6 from thoschu/release
Browse files Browse the repository at this point in the history
Release
  • Loading branch information
thoschu authored Sep 22, 2020
2 parents e1a0f23 + 853f616 commit a960e2f
Show file tree
Hide file tree
Showing 3 changed files with 210 additions and 44 deletions.
128 changes: 87 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,115 +5,161 @@
## blockchain.js

```javascript
function Blockchain(currentNodeUrl, nodeIdentifier);
function Blockchain(currentNodeUrl, nodeIdentifier) {}
```

```javascript
Blockchain.prototype.isChainValid = function (blockchain);
Blockchain.prototype.getAddressData = function (address) {}
```

```javascript
Blockchain.prototype.currentBlockData = function ();
Blockchain.prototype.getTransactionById = function (transactionId) {}
```

```javascript
Blockchain.prototype.proofOfWork = function (previousBlockHash, currentBlockData);
Blockchain.prototype.getBlockByHash = function (blockHash) {}
```

```javascript
Blockchain.prototype.hashBlock = function (previousBlockHash, currentBlockData, nonce);
Blockchain.prototype.isChainValid = function (blockchain) {}
```

```javascript
Blockchain.prototype.hash = function (dataAsString);
Blockchain.prototype.currentBlockData = function () {}
```

```javascript
Blockchain.prototype.createNewTransaction = function(amount, sender, recipient);
Blockchain.prototype.proofOfWork = function (previousBlockHash, currentBlockData) {}
```

```javascript
Blockchain.prototype.addTransactionToPendingTransaction = function(newTransaction);
Blockchain.prototype.hashBlock = function (previousBlockHash, currentBlockData, nonce) {}
```

```javascript
Blockchain.prototype.getLastBlock = function();
Blockchain.prototype.hash = function (dataAsString) {}
```

```javascript
Blockchain.prototype.createNewBlock = function(nonce, previousBlockHash, hash);
Blockchain.prototype.createNewTransaction = function(amount, sender, recipient) {}
```

```javascript
Blockchain.prototype.addTransactionToPendingTransaction = function(newTransaction) {}
```

```javascript
Blockchain.prototype.getLastBlock = function() {}
```

```javascript
Blockchain.prototype.createNewBlock = function(nonce, previousBlockHash, hash) {}
```

## server.js

```ecmascript 6
{
const route = {
method: 'GET',
path: '/blockchain'
}
path: '/blockchain',
handler: (request, h) => {}
};
```

```ecmascript 6
{
const route = {
method: 'GET',
path: '/blockchain/hash'
}
path: '/blockchain/hash',
handler: (request, h) => {}
};
```

```ecmascript 6
{
const route = {
method: 'POST',
path: '/transaction'
}
path: '/transaction',
handler: (request, h) => {}
};
```

```ecmascript 6
{
const route = {
method: 'POST',
path: '/transaction/broadcast'
}
path: '/transaction/broadcast',
handler: (request, h) => {}
};
```

```ecmascript 6
{
const route = {
method: 'GET',
path: '/mine'
}
path: '/mine',
handler: (request, h) => {}
};
```

```ecmascript 6
{
const route = {
method: 'POST',
path: '/receive-new-block'
}
path: '/receive-new-block',
handler: (request, h) => {}
};
```

```ecmascript 6
{
const route = {
method: 'POST',
path: '/register-and-broadcast-node'
}
path: '/register-and-broadcast-node',
handler: (request, h) => {}
};
```

```ecmascript 6
{
const route = {
method: 'POST',
path: '/register-node'
}
path: '/register-node',
handler: (request, h) => {}
};
```

```ecmascript 6
{
const route = {
method: 'POST',
path: '/register-nodes-bulk'
}
path: '/register-nodes-bulk',
handler: (request, h) => {}
};
```

```ecmascript 6
const route = {
method: 'GET',
path: '/consensus',
handler: (request, h) => {}
};
```

```ecmascript 6
const route = {
method: 'GET',
path: '/block/{blockHash?}',
handler: (request, h) => {}
};
```

```ecmascript 6
const route = {
method: 'GET',
path: '/transaction/{transactionId?}',
handler: (request, h) => {}
};
```

```ecmascript 6
{
const route = {
method: 'GET',
path: '/consensus'
}
path: '/address/{addresse?}',
handler: (request, h) => {}
};
```

## 💡
Expand All @@ -126,4 +172,4 @@ Blockchain.prototype.createNewBlock = function(nonce, previousBlockHash, hash);

#

Software made with <img src="https://www.thomas-schulte.de/images/made_with_love.gif" width="32" height="32"> in Germany.
Software made with <img src="https://www.thomas-schulte.de/images/made_with_love.gif" width="32" height="32"> in Hamburg - Germany.
72 changes: 69 additions & 3 deletions dev/blockchain.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const R = require('ramda');
const {v4: uuidv4} = require('uuid');

function Blockchain(currentNodeUrl, nodeIdentifier) {
this.nodeIdentifier = nodeIdentifier.replace(/\D/g, '');
this.nodeIdentifier = nodeIdentifier;
this.currentNodeUrl = currentNodeUrl;
this.networkNodes = [];

Expand All @@ -15,6 +15,72 @@ function Blockchain(currentNodeUrl, nodeIdentifier) {
console.info(`${this.nodeIdentifier} # Genesis-Block created: ${JSON.stringify(this.createNewBlock(undefined, null, '0'))} on ${this.currentNodeUrl}`);
}

Blockchain.prototype.getAddressData = function (address) {
let balance = 0;
const addressTransactions = [];

this.chain.forEach(block => {
block.transactions.forEach(transaction => {
const isSenderHit = transaction.sender === address;
const isRecipientHit = transaction.recipient === address;

if (isSenderHit || isRecipientHit) {
addressTransactions.push(transaction);
}
});
});

addressTransactions.forEach(transaction => {
if (transaction.recipient === address) {
balance += transaction.amount;
} else if (transaction.sender === address) {
balance -= transaction.amount;
}
});

return {
addressTransactions,
balance
};
}

Blockchain.prototype.getTransactionById = function (transactionId) {
let correctTransaction = null;
let correctBlock = null;

this.chain.some(block => {
return block.transactions.some(transaction => {
const isHit = transaction.transactionId === transactionId;

if (isHit) {
correctTransaction = transaction;
correctBlock = block;
}

return isHit;
});
});

return {
transaction: correctTransaction,
block: correctBlock
};
}

Blockchain.prototype.getBlockByHash = function (blockHash) {
let correctBlock = null;

this.chain.some(block => {
const isHit = block.hash === blockHash;

correctBlock = isHit ? block : correctBlock;

return isHit;
});

return correctBlock;
}

Blockchain.prototype.isChainValid = function (blockchain) {
let validChain = true;
const genesisBlock = blockchain[0];
Expand All @@ -33,8 +99,8 @@ Blockchain.prototype.isChainValid = function (blockchain) {
};
const blockHash = this.hashBlock(previousBlock.hash, tempBlockData, currentBlock.nonce);

console.log('previousBlock.hash ->', previousBlock.hash);
console.log('currentBlock.hash ->', currentBlock.hash);
// console.log('previousBlock.hash ->', previousBlock.hash);
// console.log('currentBlock.hash ->', currentBlock.hash);

if ((!blockHash.substring(0, 4).startsWith('0000')) && currentBlock.previousBlockHash !== previousBlock.hash) {
validChain = false;
Expand Down
54 changes: 54 additions & 0 deletions dev/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,60 @@ if (cluster.isMaster) {
return h.response({note, chain}).code(200);
});
}
}, {
method: 'GET',
path: '/block/{blockHash?}',
handler: (request, h) => {
let blockByHash, statusCode;
const params = request.params;
const blockHash = params.blockHash;

blockByHash = bitcoin.getBlockByHash(blockHash);

if (R.isNil(blockByHash)) {
statusCode = 404;
} else {
statusCode = 200;
}

return h.response({block: blockByHash}).code(statusCode);
}
}, {
method: 'GET',
path: '/transaction/{transactionId?}',
handler: (request, h) => {
let transactionById, statusCode;
const params = request.params;
const transactionId = params.transactionId;

transactionById = bitcoin.getTransactionById(transactionId);

if (R.isNil(transactionById.transaction) || R.isNil(transactionById.block)) {
statusCode = 404;
} else {
statusCode = 200;
}

return h.response(transactionById).code(statusCode);
}
}, {
method: 'GET',
path: '/address/{address?}',
handler: (request, h) => {
let addressData, statusCode;
const params = request.params;
const address = params.address;

addressData = bitcoin.getAddressData(address);

if (R.isNil(addressData.addressTransactions)) {
statusCode = 404;
} else {
statusCode = 200;
}

return h.response(addressData).code(statusCode);
}
}, {
method: '*',
path: '/',
Expand Down

0 comments on commit a960e2f

Please sign in to comment.