หลักฐานการทำงาน
Proof of Work (PoW) เป็นอัลกอริธึมฉันทามติทั่วไปที่ใช้กันอย่างแพร่หลายในสกุลเงินดิจิตอลส่วนใหญ่ เช่น Bitcoin โหนดผู้เข้าร่วมในเครือข่ายที่ต้องการเพิ่มธุรกรรมใหม่ใน blockchain ซึ่งจะต้องพิสูจน์ว่ามีการทำงานด้านการคำนวณการถอดรหัส เมื่อถอดรหัสสำเร็จ ก็จะได้รับรางวัลเป็นเหรียญ (Token) ตอบแทน โดยที่โหนดอื่นๆ ก็สามารถตรวจสอบความถูกต้องได้ง่ายมาก หากมีผู้โจมตี คนเหล่านั้นจะต้องมีความสามารถในการคำนวณที่มากกว่าเครือข่ายมากกว่า 51% ซึ่งหากปัจจุบันต้องการโจมตี Bitcoin จะต้องใช้เงินมหาศาล เพื่อสร้างโหนดสำหรับการโจมตี
ตัวอย่างโปรเจ็กต์นี้ใช้อัลกอริทึมเช่นเดียวกันกับ PoW แบบง่ายโดยอิงจากแฮช (Hash) ในลักษณะเดียวกับที่ Bitcoin ทำ ไฟล์ miner.rs ใช้ขั้นตอนในการสร้างบล็อกที่ถูกต้อง:
1. ธุรกรรมทั้งหมดในพูลจะถูกเพิ่มไปยังบล็อก หากไม่มีการทำธุรกรรมใด ๆ ในพูล อย่าทำเหมืองจนกว่าจะมาถึง
2. บล็อกประกอบด้วยดัชนีและการประทับเวลาที่ถูกต้อง ตลอดจนแฮชของบล็อกก่อนหน้าเพื่อรักษาลำดับ
3. ทำซ้ำค่า nonce จนกว่าแฮชของทั้งบล็อกจะเป็นไปตามข้อจำกัดความยาก ซึ่งจะน้อยกว่าค่าเป้าหมาย เป้าหมายความยากได้รับการแก้ไขสำหรับการดำเนินการของเซิร์ฟเวอร์ แต่ในโครงการจริง เราต้องการให้ปรับความยากแบบไดนามิกในรันไทม์ให้มีช่วงเวลาคงที่ระหว่างบล็อก
เมื่อพบบล็อกที่ถูกต้อง ให้เพิ่มลงในบล็อกเชนและทำซ้ำตั้งแต่ขั้นตอนที่ 1 เพื่อสร้างบล็อกถัดไป
4. ทำการบันทึกข้อมูล
การแฮช (Hash)
การแฮช คือ รูปแบบการเข้ารหัส จากตัวอย่าง
MD5("project2you") = "8b758b1f702794969037442bc80f26d1"
SHA1("project2you") = "f40ff7ae5b1cda04c2c946d6b32173a4d5cf32a8"
SHA256("project2you") = "672cf309ed315eacda82c3a47fd46f2fbd58f0136d09629305971046e6372c6a"
ณ ปัจจุบัน อัลกอริธึม MD5 และ SHA1 ไม่ถือว่าปลอดภัยแล้ว ส่วน SHA256 ยังคงถือว่าปลอดภัย และเนื่องจาก Bitcoin ใช้ในการเข้ารหัส
บล็อก (Block)
Index — ตำแหน่งของบล็อกนี้ในบล็อคเชน
Payload — ข้อมูลที่บล็อกนี้มี ต่อมา ฟิลด์นี้จะเก็บรายการธุรกรรม
Timestamp — สิ่งนี้จะเชื่อมโยงข้อมูลที่เก็บไว้ใน Payload ไปยังจุดใดเวลาหนึ่ง
Nonce — เราจะใช้สิ่งนี้ในโพสต์เกี่ยวกับการขุดในภายหลัง
Previous Block Hash — บล็อกเชนนี้จะถูกสร้างขึ้นอย่างต่อเนื่องเมื่อเวลาผ่านไป ฟิลด์นี้เข้ารหัสลับหนึ่งบล็อกไปยังบล็อกก่อนหน้า
Hash— แฮชของบล็อกนี้ ซึ่งต่อมาจะอยู่ในฟิลด์แฮชบล็อกก่อนหน้า ของบล็อกถัดไป
ตัวอย่างโค๊ดการทำงาน
เราได้ทำการกำหนดตัวแปร ทั้งหมด 6 ค่า ซึ่งเราจะใช้ในการเก็บบล๊อคข้อมูล
type BlockHash = Vec<u8>; // vector of bytes
pub struct Block {
pub index: u32,
pub timestamp: u128,
pub hash: BlockHash,
pub prev_block_hash: BlockHash,
pub nonce: u64,
pub payload: String,
}
สร้างฟังก์ชั่นสำหรับ Hashable
pub trait Hashable {
fn bytes (&self) -> Vec<u8>; // ฟังก์ชันส่งคืนเวกเตอร์ของไบต์
fn hash (&self) -> Vec<u8> {
crypto_hash::digest(
crypto_hash::Algorithm::SHA256,
&self.bytes(),
)
}
}
ตอนนี้เราสามารถตั้งค่าการแฮชบนโครงสร้างอะไรก็ได้ที่เราต้องการ! สิ่งที่เราต้องทำคือนำ Hashable ไปใช้งานและจัดเตรียมเนื้อความของฟังก์ชัน (&self) -> Vec<u8>
โครงสร้างของ Block ในการเก็บข้อมูล
impl Hashable for Block {
fn bytes (&self) -> Vec<u8> {
let mut bytes = vec![]; // empty, mutable vector
bytes.extend(&u32_bytes(&self.index));
bytes.extend(&u128_bytes(&self.timestamp));
bytes.extend(&self.prev_block_hash);
bytes.extend(&u64_bytes(&self.nonce));
bytes.extend(self.payload.as_bytes());
bytes // implicit return. Same as `return bytes;`
}
}
เริ่มต้นคำสั่งการทำงาน
ในสภาพแวดล้อมการทำงาน เราจะใช้เป็นระบบปฏิบัติการ Ubuntu 20.04
#ติดตั้ง Library
sudo apt update && sudo apt install -y git clang curl libssl-dev llvm libudev-dev make
#ติดตั้งโปรแกรม RUST
curl https://sh.rustup.rs -sSf | sh
source ~/.cargo/env
rustup default stable
rustup update
rustup update nightly
rustup target add wasm32-unknown-unknown --toolchain nightly
rustc --version
rustup show
#โหลดไฟล์ Git
git clone https://github.com/project2you/rust-blockchain.git
cd rust-blockchain
# Run all tests
cargo test
# Build
cargo build --release
# รันการทำงาน
./target/release/rust_blockchain
#Note
แอปพลิเคชันจะเริ่มขุด และใช้พอร์ต 8000 สำหรับคำขอของ Client ที่เข้ามาผ่าน REST API หากต้องการเปลี่ยนตัวแปรสภาพแวดล้อม (พอร์ต พารามิเตอร์การขุด สามารถแก้ไขได้ที่ไฟล์ .env.example )
#Firewall
sudo ufw allow 8000
sudo ufw enable
sudo service ufw restart
sudo ufw status
#Client REST API
#The application provides a REST API for clients to operate with the blockchain.
Method URL Description
GET /blocks แสดงรายการบล็อคทั้งหมดของ blockchain
POST /blocks ผนวกบล็อกใหม่เข้ากับ blockchain
POST /transactions เพิ่มธุรกรรมใหม่ไปยังพูล
#ตัวอย่างการเรียกใช้งาน
curl -X GET http://localhost:8000/blocks
curl -X POST http://localhost:8000/transactions -H 'Content-Type: application/json' -d '{"sender": "1", "recipient": "2", "amount": 1002}'
#อ้างอิง :
https://medium.com/geeklaunch/blockchain-in-rust-01-blocks-hashing-4192f2265d3d
https://morioh.com/p/d554ac13bad3