Proof of Work là gì? Tìm hiểu về giao thức Proof of Work (PoW)

Proof of Work (PoW) là một khái niệm cơ bản trong đào coin. Giao thức PoW hướng đến sự đồng thuận trong Blockchain.

Proof of Work (bằng chứng công việc) là gì?

Proof of Work (Ký hiệu: PoW) còn gọi là thuật toán bằng chứng công việc. Đây là một giao thức có mục đích chính là ngăn chặn các cuộc tấn công không gian mạng như cuộc tấn công DDoS (Tấn công từ chối dịch vụ phân tán – Distributed Denial Of Service).

Mục đích của PoW là làm cạn kiệt nguồn của hệ thống máy tính bằng cách gửi nhiều yêu cầu giả mạo, khiến các trang web, dịch vụ trực tuyến, trở nên quá tải, người dùng gặp khó khăn, hay thậm chí không thể truy cập vào các trang web, dịch vụ này.

Khái niệm Proof of Work đã tồn tại trước khi có khái niệm về Bitcoin. Satoshi Nakamoto đã áp dụng kỹ thuật này cho đồng tiền số của mình, tạo nên một cuộc cách mạng hóa các giao dịch truyền thống được thiết lập trước đó.

Trên thực tế, khái niệm PoW ban đầu được Cynthia Dwork và Moni Naor đưa ra năm 1993, nhưng từ “Proof of Work” đã được Markus Jakobsson và Ari Juels đặt ra trong một tài liệu xuất bản năm 1999.

Nhưng, trở lại ngày hôm nay, Proof of Work có lẽ là ý tưởng lớn nhất đằng sau WhitePaper Bitcoin của Nakamoto – được xuất bản vào năm 2008 – bởi vì nó cho phép sự đồng thuận không tín nhiệm và phân tán.

Tìm hiểu ví dụ:

Giả sử chuỗi cơ sở mà chúng ta sẽ thực hiện là “Xin chào, thế giới!”. Mục tiêu của chúng tôi là tìm ra một biến thể của SHA-256 băm đến giá trị nhỏ hơn 2 ^ 240.

Chúng tôi thay đổi chuỗi bằng cách thêm một giá trị số nguyên vào cuối được gọi là nonce và tăng nó mỗi lần. Sau đó diễn giải kết quả băm dưới dạng một số nguyên dài và kiểm tra xem nó có nhỏ hơn mục tiêu 2 ^ 240 hay không. Chúng tôi phải cần đến 4251 lần thử.

"Xin chào, thế giới! 0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64 = 2 ^ 252.253458683
"Xin chào, thế giới! 1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8 = 2 ^ 255.868431117
"Xin chào, thế giới! 2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7 = 2 ^ 255.444730341
...
"Xin chào, thế giới! 4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965 = 2 ^ 254.782233115
"Xin chào, thế giới! 4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6 = 2 ^ 255.585082774
"Xin chào, thế giới! 4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9 = 2 ^ 239.61238653

4251 băm trên một máy tính hiện đại không phải là khó (hầu hết các máy tính có thể đạt được ít nhất 4 triệu băm mỗi giây). Bitcoin tự động thay đổi mục tiêu để giữ tốc độ tạo khối gần như không đổi.

Blockchain của Proof of Work

Giải quyết Proof of Work giống như quá trình ngẫu nhiên, xác suất thành công thấp. Trong đó, xảy ra một số lượng lỗi lớn. Bitcoin sử dụng hàm “Hashcash” làm bằng chứng về thực hiện công việc.

Một ý nghĩa về EZ Flash IV của ý tưởng là sử dụng Hashcash như phương pháp ngăn chặn thư rác bằng cách yêu cầu nội dung Proof of Work cho bức thư.

Người dùng Email thông thường sẽ có thể dễ dàng giải quyết Proof of Work của họ. Do thực tế điều này không đòi hỏi nhiều tài nguyên, nhưng người dùng cố gắng gửi spam sẽ phải đối mặt với việc phải gửi PoW cho hàng triệu bức thư.

Nguyên lý hoạt động của Proof of Work (PoW)

Công việc của miner là giải quyết bài toán, tạo ra khối mới và cuối cùng là xác nhận giao dịch.

Độ khó của thuật toán của block sẽ phụ thuộc vào số người dùng, khả năng khai thác hiện tại và tải trọng của mạng lưới.

Hash của mỗi block chứa trong nó hash của các khối trước đó, giúp tăng cường an ninh và tránh vi phạm.

nguyen ly hoat dong pow

Sau khi miner giải quyết được bài toán thì hệ thống sẽ cho phép tạo thêm một khối mới. Các giao dịch sẽ được chuyển vào khối này và xem như là đã được xác nhận.

nguyen tac hoat dong cua pow

Ưu điểm của Proof of Work

Ưu điểm chính của Proof of Work là ngăn ngừa các cuộc tấn công Ddos và ảnh hưởng của các phần tiền điện tử thuộc sở hữu của thợ đào trong khả năng giải nén.

PoW áp đặt một số hạn chế nhất định đối với hành động của những người tham gia, bởi vì các chức năng đòi hỏi quyền hạn đáng kể.

Những người nắm giữ vốn lớn không thể đưa ra quyết định cho toàn bộ mạng lưới. Bởi vì, để hình thành khối mới thì bạn cần phải có khả năng tính toán cao hơn mới giải được thuật toán.

Nhược điểm của Proof of Work

Proof of Work có một số điểm yếu như: chi phí lớn, tính toán không cần thiết và tỷ lệ tấn công lên đến 51%.

  • Phần cứng máy tính chuyên dụng và đắt tiền. Chi phí lớn dẫn đến mỏ đào sẽ chỉ phù hợp cho các nhóm thợ đào lớn.
  • Máy đào tiêu thụ rất nhiều năng lượng, chi phí cao.
  • Các thợ mỏ thực hiện công việc tạo ra các khối, đồng thời tiêu thụ một lượng năng lượng lớn.
  • Các tính toán mà thợ mỏ thực hiện đối với Proof of Work hoàn toàn vô dụng.
  • Các thợ mỏ muốn đảm bảo an toàn trực tuyến, nhưng kết quả đầu ra không thể sử dụng trong kinh doanh hoặc nghiên cứu.

Mathematical puzzle (phương trình toán học phức tạp) là gì?

Một bài toán cần rất nhiều năng lực tính toán của máy tính mới có thể giải được.

Một số bài toán phổ biến như:

  • Hash function (hàm băm): tìm ẩn số đầu vào khi đã biết kết quả đầu ra.
  • Integer factorization (thừa số nguyên): tìm một số biết nó là tích của hai số khác.
  • Guided tour puzzle protocol (giao thức hướng dẫn giải quyết bài toán): nếu server cảm thấy mình đang bị tấn công DoS, nó sẽ cần phải tính toán lại hàm băm của một số node theo thứ tự nhất định – trong trường hợp này, bài toán của chúng ta sẽ là để “tìm một chuỗi các giá trị băm”.

Câu trả lời dành cho phương trình toán học Proof of Work là “hash”.

Khi mạng lưới ngày càng lớn mạnh thì nó sẽ phải đối mặt với nhiều bài toán với cấp độ khó hơn. Vì thế, thuật toán để đủ sức tìm ra đáp án và đào khối thì sẽ càng cần nhiều hash power – năng lực băm.

Độ khó thuật toán đào coin là một trong những vấn đề được quan tâm nhất trên Blockchain hiện nay.

Vì sao PoW lại ảnh hưởng đến tốc độ blockchain?

Sự chính xác trong xử lý và tốc độ của Blockchain phụ thuộc rất nhiều vào Proof of work.

Tuy nhiên, độ khó bài toán không nên quá phức tạp để tránh việc thời gian tạo khối mới sẽ lâu. Các giao dịch sẽ bị nghẽn cho đến khi nào được xác nhận chuyển vào khối và công việc sẽ bị chậm.

Nếu bài toán không thể được giải quyết trong khoảng thời gian đã định, mạng lưới xem như là sụp đổ.

Nhưng nếu bài toán quá dễ thì sẽ dễ bị spam, tấn công DoS…

Bên cạnh đó, đáp án trả về cũng nên đơn giản cho công tác kiểm tra và chấp thuận. Không phải node nào cũng có thể đủ khả năng để xác định xem tất cả công đoạn tính toán đã làm đúng theo quy trình chưa?

Lúc này thì bạn sẽ phải tin tưởng vào quyết định từ các node khác và vi phạm một trong những khía cạnh quan trọng nhất của Blockchain – tính minh bạch.

PoW được áp dụng vào đâu?

Hiện tại, giao thức Proof of work đang được rất nhiều đồng tiền điện mã hóa sử dụng.

Bitcoin là ví dụ tiêu biểu nhất của Proof of Work. Chính BTC đã giới thiệu thuật toán đồng thuận này với thế giới. PoW của Bitcoin có tên gọi là Hashcash. Giao thức này cho phép thay đổi độ khó thuật toán đào dựa trên khả năng khai thác của mạng lưới ở từng thời điểm.

Thời gian trung bình tạo khối mới hiện tại là 10p. Những đồng tiền kỹ thuật số khác trên nền tảng Bitcoin (Vd: Litecoin, ethereum…) cũng sử dụng hệ thống tương tự.

Tại sao phải sử dụng Proof of work ngay từ ban đầu?

Một trong những lợi ích chính là bảo vệ chống tấn công DoS và giảm thiểu rủi ro trong hoạt động đào coin.

  • Bảo vệ chống tấn công DoS (Denial of Service): Proof of Work đặt ra giới hạn cao lên mạng lưới. Muốn thực hiện hành động gì đó thì trước hết phải đáp ứng được chúng. Vì thế, muốn tấn công vào mạng lưới thì cần phải tập hợp năng lực máy tính đủ lớn và thời gian tính toán nhiều. Vẫn có thể tấn công được nhưng phải cần tới chi phí rất lớn.
  • Khả năng đào khối: Điều quan trọng ở đây là liệu bạn có đủ năng lực máy tính để giải thuật toán đào coin không.

Proof of work và việc khai thác

PoW là một yêu cầu để xác định sức mạnh tính toán máy tính đắt tiền, còn được gọi là khai thác, cần phải được thực hiện để tạo ra một nhóm các giao dịch không tín nhiệm mới (cái gọi là khối) trên một sổ cái phân tán gọi là Blockchain.

Khai thác phục vụ cho hai mục đích:

  • Xác minh tính hợp lệ của một giao dịch, hoặc tránh cái gọi là chi tiêu gấp đôi;
  • Đồng tiền tệ kỹ thuật số mới thưởng cho thợ đào thực hiện nhiệm vụ trước đó.

Khi bạn muốn thiết lập một giao dịch, điều này sẽ xảy ra phía sau:

  • Các giao dịch được nhóm lại thành một khối;
  • Người khai thác xác minh rằng các giao dịch trong mỗi block là hợp lệ;
  • Để làm như vậy, thợ đào phải giải quyết một “câu đố toán học” được gọi là bài toán bằng chứng công việc (PoW).
  • Phần thưởng được trao cho thợ đào đầu tiên giải quyết hết từng “câu đố toán học” trong khối;
  • Các giao dịch đã được xác minh sẽ được lưu trữ trong Blockchain công khai.

Bài toán có một tính năng chính đó là không đối xứng. Công việc trên thực tế chỉ ở độ khó vừa phải từ phía người yêu cầu và phải dễ kiểm tra mạng. Ý tưởng này còn được gọi là chức năng chi phí CPU, câu đố của khách hàng, câu đố tính toán hoặc chức năng đánh giá CPU.

Tất cả các thợ đào đều phải cạnh tranh để là người đầu tiên tìm ra giải pháp cho vấn đề toán học cho các khối đã ứng cử. Đây chính là vấn đề không thể giải quyết theo cách nào khác hơn là thông qua sức mạnh của máy tính dùng để đào coin. Vì vậy việc này đòi hỏi sự nỗ lực cùng đầu tư lớn để có thể cạnh tranh khi đào tiền thuật toán.

Khi một người thợ đào cuối cùng tìm ra được giải pháp đúng đắn, anh ta sẽ thông báo cho toàn bộ mạng cùng một lúc và nhận được giải thưởng là đồng tiền thuật toán đang đào. Đồng tiền thuật toán này sẽ được cung cấp bởi giao thức.

Từ quan điểm kỹ thuật, quá trình khai thác là một phép băm đảo ngược. Nó được xác định bởi một số (nonce). Do đó thuật toán băm mã hóa của dữ liệu khối cho kết quả theo một ngưỡng nhất định.

Ngưỡng này – hay còn được gọi là độ khó, là thứ để quyết định tính cạnh tranh của việc khai thác: càng nhiều sức mạnh tính toán được thêm vào mạng thì thông số này tăng lên tương đương với việc tăng số lượng trung bình các phép tính cần thiết để tạo một khối mới.

Phương pháp này cũng làm tăng chi phí của việc tạo ra khối và khiến các thợ đào buộc phải nâng cao hiệu quả của hệ thống khai thác để tiếp tục đào, duy trì sự cân bằng kinh tế tích cực. Việc cập nhật thông số sẽ xảy ra khoảng 14 ngày một lần, mỗi khối mới sẽ được tạo ra sau mỗi 10 phút.

Như vậy, bạn cần phải có một lượng lớn sức mạnh tính toán, nhiều hơn sức mạnh mà một máy tính phổ thông sở hữu. Điều đó sẽ khiến cộng đồng thợ mỏ gom cụm lại. Những thợ mỏ nhỏ lẻ sẽ không cạnh tranh được với thợ mỏ lớn hơn.

Dẫn đến sự độc quyền khai thác mỏ từ các thợ mỏ lớn. Vì với sức mạnh tính toán lớn thì xác suất tìm ra đáp án nhanh và chính xác cao hơn những thợ mỏ nhỏ lẻ. Điều này đi ngược lại với lý tưởng của một hệ thống Blockchain phân cấp và có thể dẫn đến một cuộc tấn công 51%.

Tấn công 51%

Một cuộc tấn công 51% xảy ra khi một thợ mỏ hay một pool đào kiểm soát được 51% sức mạnh tính toán trong mạng lưới. Khi đó họ sẽ thao túng toàn bộ giao dịch và gian lận. Bằng cách tạo ra những khối giả mạo, họ hủy bỏ hoàn toàn những khối hợp lệ mà cộng đồng khai thác được.

Đó là lý do giao thức Proof of Stake (PoS) ra đời, hay còn gọi là giao thức bằng chứng cổ phần. Khi một ai đó sở hữu 51% cổ phần nguồn cung của một loại tiền tệ kỹ thuật số cụ thể, dĩ nhiên họ sẽ không tự tấn công loại tiền tệ đó.

Ngoài ra không ai dám bỏ tài sản ra mua 51% nguồn cung của một đồng tiền, rất tốn kém. Về mặt lý thuyết thì bất kỳ cuộc tấn công nào vào loại tiền tệ kỹ thuật số đó chỉ làm mất giá trị cổ phần mà họ sở hữu.

Tìm hiểu thêm:

Tìm hiểu mã nguồn của quá trình đào

Tìm hiểu mã nguồn của quá trình đào (mining hay quá trình tính toán block hợp lệ):

/*
    File: /src/rpc/mining.cpp
    Line: 124
*/
        while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) {
            ++pblock->nNonce;
            --nMaxTries;
        }

Quá trình mining là quá trình tìm ra số nonce sao cho blockhash (digest/hashes của block header) thỏa mãn hàm CheckProofOfWork(), hàm này nội dung như sau:

/*
    File: /src/pow.cpp
    Line: 77
*/
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params& params)
{
    bool fNegative;
    bool fOverflow;
    arith_uint256 bnTarget;
bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
// Check range
    if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
        return false;
// Check proof of work matches claimed amount
    if (UintToArith256(hash) > bnTarget)
        return false;
return true;
}

Function này hoàn toàn rất dễ hiểu, mục đích là tìm ra blockhash nhỏ hơn giá trị bnTarget. Giá trị bnTarget sẽ được tạo ra thông qua việc sữ dụng hàm SetCompact() lên biến nBits.

bnTarget.SetCompact(nBits, &fNegative, &fOverflow);

bnTarget là một class arith_uint256 kế thừa từ base_uint. Ta xét hàm tạo (constructor) của class này:

/*
    File: /src/arith_uint256.h
    Line: 32
*/
    base_uint()
    {
        for (int i = 0; i < WIDTH; i++)
            pn[i] = 0;
    }

Các bits tạo nên bnTarget sẽ được set là 0 (trong thực tế khi bạn xin cấp phát một vùng nhớ động thì không nhất thiết các bits trong vùng nhớ được cấp phát sẽ là 0).
Giờ ta cùng xem function SetCompact() làm gì:

/*
    File: /src/arith_uint256.h
    Line: 253
*/
arith_uint256& arith_uint256::SetCompact(uint32_t nCompact, bool* pfNegative, bool* pfOverflow)
{
    int nSize = nCompact >> 24;
    uint32_t nWord = nCompact & 0x007fffff;
    if (nSize <= 3) {
        nWord >>= 8 * (3 - nSize);
        *this = nWord;
    } else {
        *this = nWord;
        *this <<= 8 * (nSize - 3);
    }
    if (pfNegative)
        *pfNegative = nWord != 0 && (nCompact & 0x00800000) != 0;
    if (pfOverflow)
        *pfOverflow = nWord != 0 && ((nSize > 34) ||
                                     (nWord > 0xff && nSize > 33) ||
                                     (nWord > 0xffff && nSize > 32));
    return *this;
}

SetCompact() sẽ biến đổi nBits (uint32) sang bnTarget (uint256). nBits là dạng “packed” của bnTarget (nBits là độ khó được lưu trữ trong block header và bnTarget là giá trị thực tế được dùng để so sánh blockhash để kiểm tra xem một block có thỏa proof-of-work của Bitcoin hay không).

nSize = nCompact >> 24;

Lấy 8 bits bên trái của nCompact gán cho nSize

uint32_t nWord = nCompact & 0x007fffff;

Lấy 23 bits bên phải của nCompact gán cho nWord. Bằng cách sử dụng toán tử AND

nCompact AND 0x007fffff

Từ toàn bộ mã nguồn trên ta có thể viết lại như sau:

Từ công thức này ta có thể tính chính xác giá trị bnTarget từ nBits lưu trữ trong block header.

Ở đây còn một giá trị mình muốn nhắc đến là: powLimit giá trị này đại diện cho giá trị lớn nhất của bnTarget mà Bitcoin proof-of-work chấp nhận.

/*
 File: /src/chainparams.cpp
 Line: 78
*/
 consensus.powLimit = uint256S(“00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff”);

Trên đây là bài viết Proof of Work là gì? Tìm hiểu về giao thức Proof of Work (PoW) mà CafeBitcoin gửi tới bạn đọc! Cảm ơn độc giả đã đón đọc!