Với phạm vi luận văn, ứng dụng triển khai sẽ mô phỏng quá trình tạo Block, thêm vào chuỗi Blockchain, tạo ra ví và xử lý giao dịch giữa các ví. Tất cả các quá trình này sẽ xây dựng nên API tiện cho việc triển khai ví trong ứng dụng sau này.
Giao diện chương trình như sau:
Hình 3.1. Giao diện chương trình 3.2.1. Tạo ra Blockchain
Một Blockchain chỉ là một chuỗi các khối. Mỗi khối trong Blockchain sẽ có chữ ký số riêng của nó, chứa chữ ký số của khối trước và có một số dữ liệu (dữ liệu này có thể là các giao dịch chẳng hạn).
Hình 3.2. Chuỗi Blockchain
Hash = Digital Signature.
Mỗi khối không chỉ chứa hash của khối phía trước của nó, mà hash của khối đó còn được tính toán từ hash của khối phía trước. Nếu dữ liệu của khối
dữ liệu trước đó được thay đổi thì hash của nó cũng sẽ thay đổi (vì nó được tính toán một phần theo dữ liệu) lần lượt ảnh hưởng đến tất cả các hash của các khối sau đó. Tính toán và so sánh các hash cho phép chúng ta xem nếu một blockchain là không hợp lệ.
3.2.1.1. Chữ ký số
Có rất nhiều thuật toán mã hóa để lựa chọn, tuy nhiên tôi sử dụng thuật toán mã hóa SHA256 phù hợp cho ví dụ này. Chúng ta có thể import java.security.MessageDigest; để có được quyền truy cập vào thuật toán SHA256 và tạo ra chữ ký số trong class StringUtil như sau:
import java.security.MessageDigest; public class StringUtil {
// Applies Sha256 to a string and returns the result. public static String applySha256(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256"); // Applies sha256 to our input,
byte[] hash = digest.digest(input.getBytes("UTF-8")); StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]); if (hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } catch (Exception e) {
throw new RuntimeException(e); }
} }
Chúng ta phải tính toán hash từ tất cả các phần của khối mà chúng ta không muốn bị giả mạo. Vì vậy, hãy sử dụng đến previousHash, data và timeStamp. public String calculateHash() {
String calculatedhash = StringUtil.applySha256(previousHash + Long.toString(timeStamp) + data);
return calculatedhash; }
Và thêm phương thức tính hash đó vào constructor của class Block1 Public Block1(String data, String previousHash) {
this.data = data;
this.previousHash = previousHash; this.timeStamp = new Date().getTime(); this.hash = calculateHash();
Tất cả những gì bạn cần biết là đưa vào một string và áp dụng thuật toán SHA256 vào nó, và trả về chữ ký đã tạo là một string:
3.2.1.2. Xác thực công việc
Chúng ta sẽ yêu cầu người khai thác phải làm việc bằng cách thử nghiệm nhiều giá trị khác nhau trong một Block cho đến khi hash của Block đó bắt đầu với một hoặc nhiều số 0, bằng cách thêm một biến int gọi là nonce, biến này sẽ được sử dụng trong phương thức calculateHash() dùng để tính toán hash của Block. Trên thực tế, mỗi người khai thác sẽ bắt đầu lặp lại từ một điểm ngẫu nhiên. Một số người khai thác thậm chí có thể thử số ngẫu nhiên cho nonce.
Phương thức mineBlock() nhận vào một tham số difficulty (Độ khó), đó là số lượng số 0 bắt đầu hash mà người khai thác phải giải quyết. Độ khó thấp
có thể rất dễ dàng để giải quyết gần như là tức thời trên phần lớn các máy tính phổ biến. Tuy nhiên dành cho test chúng ta sẽ đặt tạm là 5. Độ khó càng lớn thì càng mất nhiều thời gian để giải quyết.
Thuật toán xác thực công việc thông qua phương thức mineBlock() trong Class Block như sau:
package NoobChain; import java.util.Date; public class Block {
public String hash;
public String previousHash; private String data;
private long timeStamp; private int nonce;
public Block(String data, String previousHash) { this.data = data;
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) + data);
return calculatedhash; }
public void mineBlock(int difficulty) {
String target = new String(new char[difficulty]).replace('\0', '0'); //Create a string with difficulty * "0"
while(!hash.substring( 0, difficulty).equals(target)) { nonce ++;
hash = calculateHash(); }
System.out.println("Block Mined!!! : " + hash); }
}
3.2.1.3. Tạo block
Thuật toán tạo một Block trong project NoobChain có code như sau: package NoobChain;
import java.util.Date; public class Block1 { public String hash;
public String previousHash;
public String data; // our data will be a simple message.
public long timeStamp; // as number of milliseconds since 1/1/1970. public int nonce;
private String log = "";
public Block1(String data, String previousHash) { this.data = data;
this.previousHash = previousHash; this.timeStamp = new Date().getTime();
this.hash = calculateHash(); // Making sure we do this after we set the other values.
}
public String calculateHash() {
String calculatedhash = StringUtil.applySha256(previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + data);
return calculatedhash; }
String target = new String(new char[difficulty]).replace('\0', '0'); while(!hash.substring( 0, difficulty).equals(target)) {
nonce ++;
hash = calculateHash();
}
this.log += "Block Mined!!! : " + hash; }
public String getLog () { String rs = this.log; this.log = "\n"; return rs; }
}
Kết quả Block1 chứa một String hash sẽ giữ chữ ký số của Block hiện tại. Biến previousHash để giữ hash của block trước đó và String data để giữ dữ liệu được thể hiện như hình 3.3.
3.2.1.4. Kiểm tra tính toàn vẹn của Blockchain
Hàm isChainValid() dùng trong Class NoobChain, nó sẽ lặp qua tất cả các Block trong chuỗi và so sánh tất cả các hash. Hàm này sẽ cần thiết để kiểm tra tính toàn vẹn của Blockchain.
Public static Boolean isChainValid() { Block currentBlock; Block previousBlock;
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; } } return true; } 3.2.1.5. Tạo Blockchain
Hãy tạo một class NoobChain chứa main method như sau và thực hiện nút lệnh Tạo Blockchain để tạo ra một chuỗi Blockchain gồm 3 Block.
Public void TaoBlockchain() {
blockchain1.add(new Block1("Chào bạn tôi là block thứ 1", "0")); blockchain1.get(0).mineBlock(difficulty);
blockchain1.get(blockchain1.size() - 1).hash)); blockchain1.get(1).mineBlock(difficulty);
blockchain1.add(new Block1("Chào bạn tôi là block thứ 3", blockchain1.get(blockchain1.size() - 1).hash));
blockchain1.get(2).mineBlock(difficulty); String blockchainJson = new
GsonBuilder().setPrettyPrinting().create().toJson(blockchain1); txtLog.append("\nThe block chain: ");
txtLog.append(blockchainJson);
txtLog.append("\n- Chain count: " + blockchain1.size());
txtLog.setCaretPosition(txtLog.getDocument().getLength()); }
Kết quả như sau:
Hình 3.4. Kết quả tạo ra chuỗi Blockchain
Để thêm một Block tiếp theo vào chuỗi Blockchain đã có thực hiện nút lệnh Thêm Block với code sau:
Private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { if (blockchain1.size()>0){
cursor1 = blockchain1.size()+1;
blockchain1.add(new Block1("Chào bạn tôi là block thứ "+ cursor1 , blockchain1.get(blockchain1.size() - 1).hash)); blockchain1.get(blockchain1.size() - 1).mineBlock(difficulty); Block1 b = blockchain1.get(blockchain1.size() - 1); txtBlocknum1.setText(0 + ""); txtHash1.setText(b.hash); txtPrevhash1.setText(b.previousHash); txtData1.setText(b.data);
Date date = new Date(b.timeStamp);
txtTimestamp1.setText(date.toGMTString()); txtNonce1.setText(b.nonce + "");
String page = (cursor1) + "/" + this.blockchain1.size(); txtBlocknum1.setText(cursor1 + "");
txtBlock1.setText(page); String blockchainJson = new
GsonBuilder().setPrettyPrinting().create().toJson(blockchain1); txtLog.append("\nThe block chain: ");
txtLog.append(blockchainJson);
txtLog.append("\n- Chain count: " + blockchain1.size()); txtLog.setCaretPosition(txtLog.getDocument().getLength()); }
}
Hình 3.5. Kết quả thêm một Block vào chuỗi Blockchain 3.2.2. Giao dịch trong Ví Blockchain
Ta tiến hành giao dịch chuyển tiền giữa hai Ví A và Ví B dựa vào quá trình tạo một giao dịch ban đầu từ Block Genesis chuyển cho Ví A 100 coin, sau đó giao dịch giữa Ví A và Ví B được thực hiện để thêm các Block tiếp theo thuật toán giao dịch được cài đặt bởi code sau:
Public static void GiaodichVi() {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); walletA = new Wallet();
walletB = new Wallet();
Wallet coinbase = new Wallet();
genesisTransaction = new Transaction(coinbase.publicKey, walletA.publicKey, 100f, null);
genesisTransaction.transactionId = "0";genesisTransaction.outputs.add(new TransactionOutput(genesisTransaction.reciepient, genesisTransaction.value, genesisTransaction.transactionId));
UTXOs.put(genesisTransaction.outputs.get(0).id, genesisTransaction.outputs.get(0));
NoobChain.log += "\n***** GIAO DỊCH GIỮA 2 VÍ A VA B *****"; Block genesis = new Block("0");
genesis.addTransaction(genesisTransaction); addBlock(genesis);
Block block1 = new Block(genesis.hash);
NoobChain.log += "\nWalletA's balance is: " + walletA.getBalance(); NoobChain.log += "\nWalletA is Attempting to send funds (40) to WalletB..."; block1.addTransaction(walletA.sendFunds(walletB.publicKey, 40f)); NoobChain.log += "\nWalletA is Attempting to send funds (20) to WalletB..."; block1.addTransaction(walletA.sendFunds(walletB.publicKey, 20f)); addBlock(block1);
NoobChain.log += block1.getLog();
NoobChain.log += "\nWalletA's balance is: " + walletA.getBalance(); NoobChain.log += "\nWalletB's balance is: " + walletB.getBalance(); Block block2 = new Block(block1.hash);
NoobChain.log += "\nWalletA Attempting to send more funds (1000) than it has..."; block2.addTransaction(walletA.sendFunds(walletB.publicKey, 1000f));
NoobChain.log += "\nWalletA Attempting to send more funds (10) to WalletB..."; block2.addTransaction(walletA.sendFunds(walletB.publicKey, 10f));
addBlock(block2);
NoobChain.log += block2.getLog();
NoobChain.log += "\nWalletA's balance is: " + walletA.getBalance(); NoobChain.log += "\nWalletB's balance is: " + walletB.getBalance();
NoobChain.log += "\nWalletB is Attempting to send funds (20) to WalletA..."; block3.addTransaction(walletB.sendFunds( walletA.publicKey, 20));
addBlock(block3);
NoobChain.log += block3.getLog();
NoobChain.log += "\nWalletA's balance is: " + walletA.getBalance(); NoobChain.log += "\nWalletB's balance is: " + walletB.getBalance(); System.out.println("\n\nLOG"+ NoobChain.log);
}
Kết quả giao dịch sẽ được hiển thị như sau:
KẾT LUẬN
Công nghệ Blockchain đang chuyển đổi thành một nguồn tài nguyên đáng tin cậy và có giá trị trong thế giới kỹ thuật số và kinh doanh. Nó có các ứng dụng trong hầu hết các ngành công nghiệp. Thậm chí các tập đoàn lớn nhất cũng đang theo đuổi việc sử dụng công nghệ này để nâng cấp các quy trình hoạt động của họ.
Để bắt kịp xu hướng phát triển của công nghệ, luận văn chọn nghiên cứu “Ứng dụng công nghệ Blockchain trong ví điện tử” nhằm giúp hiểu rỏ hơn về cách tạo ra Blockchain và việc giao dịch giữa các Ví như thế nào.
Sau một thời gian thực hiện, luận văn đã đạt được một số kết quả như: Tìm hiểu công nghệ Blockchain và công nghệ Ví điện tử Blockchain. Tìm hiểu mô hình xác thực trong giao dịch Blockchain.
Thực nghiệm mô phỏng Blockchain và ví bằng công nghệ Blockchain. Mục tiêu phát triển của nghiên cứu này chính là cách tạo ra Blockchain và việc giao dịch giữa các Ví như thế nào, nhằm giúp người dùng hiểu rỏ hơn về công nghệ Blockchain.
Hướng phát triển trong tương lai:
Xây dựng API Ví Blockchain tương tác để dễ triển khai rộng rãi. Xây dựng qui chế sử dụng Ví Blockchain hiệu quả.
Trong quá trình thực hiện, do thời gian và hạn chế về kiến thức, kinh nghiệm thực tiễn nên luận văn của tôi còn nhiều thiếu sót, tôi rất mong được sự đánh giá, góp ý của thầy cô.
DANH MỤC TÀI LIỆU THAM KHẢO
[1] Satoshi Nakamoto (2009), “Bitcoin: A Peer-to-Peer Electronic Cash System, ” https://bitcoin.org/bitcoin.pdf
[2] Don Tapscott and Alex Tapscott (2016), "Blockchain Revolution: How the Technology Behind Bitcoin Is Changing Money, Business and the World“, http://blockchain-revolution.com/
[3] Narayan Prusty (April 2017), Building Blockchain Projects: Develop real- time practical DApps using Ethereum and JavaScript, Packt Publishing [4] Sesaria Kikitamara (August 23, 2017): MASTER’S THESIS
INFORMATION SCIENCES - Digital Identity Management on Blockchain for Open Model Energy System
[5] Mukesh Thakur (September 13, 2017): Master’s Thesis UNIVERSITY OF HELSINKI Department of Computer Science - Authentication, Authorization and Accounting with Ethereum Blockchain - Helsinki [6] Building new state machines with Virtualchain,
http://blockstack.ghost.io/virtualchain-research-paper-published-at- dccl16
[7] Bitcoin multisig the hard way: Understanding raw P2SH multisig transactions, https://www.soroushjp.com/2014/12/20/bitcoin-multisig- the-hard-way-understanding-raw-multisignature-bitcoin-transactions
[8] BlockCypher Python, https://github.com/blockcypher/blockcypher-python
[9] Transaction, http://adrenaline2017.hatenablog.com/entry/2017/05/29/120701
[10] Understanding Blockchains (and Bitcoin)– Part 2: Technology,
https://luxsci.com/blog/understanding-blockchains-and-bitcoin- technology.html