Arun78787 Noobchain Crypt0.Git
Arun78787 Noobchain Crypt0.Git
└── arun78787-noobchain_crypt0.git/
├── noobchain.iml
└── src/
├── Block.java
├── NoobChain.java
├── StringUtil.java
├── Transaction.java
├── TransactionInput.java
├── TransactionOutput.java
└── Wallet.java
================================================
FILE: noobchain.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/Downloads/gson-2.11.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/Downloads/bcpkix-jdk18on-1.79.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$USER_HOME$/Downloads/bcprov-jdk18on-1.79.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>
================================================
FILE: src/Block.java
================================================
//work of day 1
import java.util.ArrayList;
import java.util.Date;
this.previousHash = previousHash;
this.timeStamp = new Date().getTime();
this.hash = calculateHash();
}
public String calculateHash(){
String calculatedhash = StringUtil.applySha256(previousHash +
Long.toString(timeStamp) + Integer.toString(nonce) + merkleRoot );
return calculatedhash;
}
public void mineBlock(int difficulty){
merkleRoot = StringUtil.getMerkleRoot((transactions));
String target = StringUtil.getDifficultyString(difficulty);
while(!hash.substring(0,difficulty).equals(target)){
nonce++;
hash = calculateHash();
}
System.out.println("Block Mined!!! : " + hash);
}
================================================
FILE: src/NoobChain.java
================================================
import java.util.ArrayList;
import java.security.Security;
import java.util.HashMap;
isChainValid();
tempUTXOs.put(genesisTransaction.outputs.get(0).id,genesisTransaction.outputs.get(0
));
for(int i=1;i<blockchain.size();i++){
currentBlock = blockchain.get(i);
previousBlock = blockchain.get(i-1);
if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){
System.out.println("current hashes not equal");
return false;
}
if(!previousBlock.hash.equals(currentBlock.previousHash)){
System.out.println("previous hashes not equal");
return false;
}
if(!currentBlock.hash.substring( 0,difficulty).equals(hashTarget)){
System.out.println("this block hasn't been mined");
return false;
}
TransactionOutput tempOutput;
for(int t= 0; t< currentBlock.transactions.size();t++){
Transaction currentTransaction = currentBlock.transactions.get(t);
if(!currentTransaction.verifySignature()){
System.out.println("#Signature on Transaction(" + t + ")is
Invalid");
return false;
}
if(currentTransaction.getInputsValue() !=
currentTransaction.getOutputValue()){
System.out.println("#Inputs are not equal to outputs on
Transaction(" + t + ")");
return false;
}
for(TransactionInput input : currentTransaction.inputs){
tempOutput = tempUTXOs.get(input.transactionOutputId);
if(tempOutput == null){
System.out.println("#Referenced input on Transaction(" + t
+") is MIssion");
return false;
}
if(input.UTXO.value != tempOutput.value){
System.out.println("#Referenced input Transaction(" + t +")
value in invalid");
return false;
}
tempUTXOs.remove(input.transactionOutputId);
}
for(TransactionOutput output: currentTransaction.outputs){
tempUTXOs.put(output.id, output);
}
if( currentTransaction.outputs.get(0).reciepient !=
currentTransaction.reciepient){
System.out.println("#Transaction(" + t + ")output reciepient is
not who it should be");
return false;
}
if(currentTransaction.outputs.get(1).reciepient !=
currentTransaction.sender){
System.out.println("#Transaction(" + t +") output 'change' is
not sender");
return false;
}
}
}
System.out.println("Blockchain is valid");
return true;
}
public static void addBlock(Block newBlock){
newBlock.mineBlock(difficulty);
blockchain.add(newBlock);
}
}
================================================
FILE: src/StringUtil.java
================================================
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;
import java.security.Key;
import java.security.Signature;
import java.util.ArrayList;
} catch(Exception e) {
throw new RuntimeException(e);
}
}
}
count = treeLayer.size();
previousTreeLayer = treeLayer;
}
String merkleRoot = (treeLayer.size() == 1) ? treeLayer.get(0) : "";
return merkleRoot;
}
public static String getDifficultyString(int difficulty){
return new String(new char[difficulty]).replace('\0', '0');
}
================================================
FILE: src/Transaction.java
================================================
import java.security.*;
import java.util.ArrayList;
}
public boolean verifySignature(){
String data = StringUtil.getStringFromKey(sender) +
StringUtil.getStringFromKey(reciepient) + Float.toString(value);
return StringUtil.verifyECDSASig(sender, data,signature);
}
public boolean processTransaction(){
if(verifySignature() == false){
System.out.println("#Transaction Signature failed to verify");
return false;
}
for(TransactionInput i : inputs){
i.UTXO = NoobChain.UTXOs.get(i.transactionOutputId);
}
if(getInputsValue() < NoobChain.minimumTransaction){
System.out.println("#Transaction Inputs to small: " +
getInputsValue());
return false;
}
float leftOver = getInputsValue() - value;
transactionId = calculateHash();
outputs.add(new TransactionOutput(this.reciepient, value, transactionId));
outputs.add(new TransactionOutput(this.sender,leftOver, transactionId));
for(TransactionOutput o : outputs){
NoobChain.UTXOs.put(o.id, o);
}
for(TransactionInput i: inputs){
if(i.UTXO == null) continue;
NoobChain.UTXOs.remove(i.UTXO.id);
}
return true;
}
public float getInputsValue(){
float total = 0;
for(TransactionInput i : inputs){
if(i.UTXO == null) continue;
total += i.UTXO.value;
}
return total;
}
public float getOutputValue(){
float total = 0;
for(TransactionOutput o : outputs){
total += o.value;
}
return total;
}
================================================
FILE: src/TransactionInput.java
================================================
public class TransactionInput {
public String transactionOutputId;
public TransactionOutput UTXO;
================================================
FILE: src/TransactionOutput.java
================================================
import java.security.PublicKey;
}
public boolean isMine(PublicKey publicKey){
return (publicKey == reciepient);
}
================================================
FILE: src/Wallet.java
================================================
//package noobchain;
import java.security.*;
import java.security.spec.ECGenParameterSpec;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Wallet {
public PrivateKey privateKey;
public PublicKey publicKey;
public Wallet(){
generateKeyPair();
}
keyGen.initialize(ecSpec, random);
KeyPair keyPair = keyGen.generateKeyPair();
privateKey = keyPair.getPrivate();
publicKey = keyPair.getPublic();
}catch(Exception e){
throw new RuntimeException(e);
}
}
public float getBalance(){
float total = 0;
for(Map.Entry<String, TransactionOutput> item:
NoobChain.UTXOs.entrySet()){
TransactionOutput UTXO = item.getValue();
if(UTXO.isMine(publicKey)){
UTXOs.put(UTXO.id, UTXO);
total += UTXO.value;
}
}
return total;
}
public Transaction sendFunds(PublicKey _recipient,float value){
if(getBalance() < value){
System.out.println("#Not enough funds to send transaction.
Transaction Declined");
return null;
}
ArrayList<TransactionInput> inputs = new ArrayList<TransactionInput>();
float total = 0;
for(Map.Entry<String, TransactionOutput> item: UTXOs.entrySet()){
TransactionOutput UTXO = item.getValue();
total += UTXO.value;
inputs.add(new TransactionInput(UTXO.id));
if(total > value) break;
}
Transaction newTransaction = new Transaction(publicKey, _recipient,
value, inputs);
newTransaction.generateSignature(privateKey);