• admin@project2you.com
  • + 66 089 658 5729

หลักฐานการทำงาน

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