ขุดในปี 2559 ใน Bitcoins! PCG.SE ปริศนาปีใหม่ 2559


17

ในโปรโตคอล Bitcoin 2016เป็นจำนวนที่พิเศษมาก "ความยาก" ในการค้นหาแฮชเพื่อสร้างบล็อกใหม่จะถูกปรับทุก ๆ 2,016 บล็อกเพื่อการเปลี่ยนแปลงโดยประมาณทุกๆสองสัปดาห์

หมายเลขนี้ถูกเลือกเนื่องจากความยากลำบากในการปรับตัวเองเพื่อให้ทุกบล็อกใช้เวลาประมาณ 10 นาทีและในอีกสองสัปดาห์จะมี 2 × 7 × 24 × 6 = 2,016 ระยะเวลาสิบนาที


เพื่อเป็นการระลึกถึงความบังเอิญเชิงตัวเลขปัญหาปีใหม่ในปีนี้เป็นเรื่องของ Bitcoin โดยเฉพาะอัลกอริทึมคร่ำเครียดที่ใช้เพื่อลงนามบล็อค SHA-256

งานของคุณคือการสร้างโปรแกรมที่จะรับไบต์ (อย่างน้อย ASCII) และส่งออกเป็น nonce ในไบต์ (ในรูปแบบที่คุณเลือก) ที่จะผลิตกัญชา SHA-256 ที่มี2016อยู่ในการเป็นตัวแทนbase64เมื่อผนวกเข้ากับต้นฉบับ อินพุตไบต์

ต่อไปนี้เป็นตัวอย่างของโซลูชันที่ถูกต้องความสุภาพของเครื่องยนต์ที่ผู้คนสร้างไว้แล้ว

> foo
Nonce: 196870
SHA256 hash: OCUdDDtQ42wUlKz2016x+NROo8P2lbJf8F4yCKedTLE=

> bar
Nonce: 48230
SHA256 hash: CNcaOCQgT7bnlQzQPXNwuBu8/LYEdk2016khRaROyZk=

> happynewyear
Nonce: 1740131
SHA256 hash: XsKke6z2016BzB+wRNCm53LKJ6TW6ir66GwuC8oz1nQ=

> 2016
Nonce: 494069
SHA256 hash: rWAHW2YFhHCr22016zw+Sog6aW76eImgO5Lh72u6o5s=

(note: the nonces don't actually have to be ASCII numbers; you can do
 any byte input you find convenient.)

ไลบรารีที่สร้างไว้ล่วงหน้าเท่านั้น (นอกเหนือจากฟังก์ชั่นอินพุตและเอาต์พุตมาตรฐาน) โปรแกรมของคุณอาจใช้เป็นSHA256(bytes)ฟังก์ชั่นที่รับอินพุตไบต์และส่งคืนแฮช SHA256 ในรูปแบบใด ๆ รวมถึง base64

โปรแกรมที่จะทำเช่นนี้ในจำนวนไบต์ที่น้อยที่สุดของซอร์สโค้ดจะชนะ


1
เรียกฉันว่าบ้า แต่ชื่ออื่นไม่ใช่ bitcoin
Codefun64

1
นอกจากนี้กำหนด "ห้องสมุดที่สร้างไว้ล่วงหน้า" ฟังก์ชัน SHA-256 ของภาษาของฉันสร้างแฮช แต่ไม่ใช่แฮช Base64 ดังนั้นฉันจะต้องใช้การแปลงเป็นไบต์แล้วแปลงเป็นอักขระแล้วแปลงเป็น Base64
LegionMammal978

@ LegionMammal978 "ห้องสมุดที่สร้างไว้ล่วงหน้า" จะเป็นฟังก์ชั่นใด ๆ ที่กำหนดไว้นอกรหัสที่นับสำหรับความท้าทายนี้ ดังนั้นคุณสามารถสร้างฟังก์ชัน base64 wrapper สำหรับฟังก์ชัน SHA-256 ของคุณเพื่อใช้ในปัญหานี้
Joe Z.

@ Codefun64 นี่เป็นปัญหารหัสที่จำลองขั้นตอนที่ใช้ในการขุด Bitcoin แต่ไม่ได้ทำการขุดเพื่อ bitcoin
Joe Z.

คำตอบ:


7

Perl 5.10+, 39 + 18 = 57 ไบต์

sha256_base64($_.++$i)!~2016?redo:say$i

สิ่งนี้จะต้องรันด้วย-nMDigest::SHA=/./สวิตช์บรรทัดคำสั่งซึ่งรวมอยู่ในจำนวนไบต์ นอกจากนี้ยังใช้คุณสมบัติ Perl 5.10+ sayและจำเป็นต้องเรียกใช้ด้วยสวิตช์บรรทัดคำสั่ง-M5.010(หรือ-E) ซึ่งถือว่าฟรี อินพุตควรถูกจัดเตรียมไว้บน stdin โดยไม่ขึ้นบรรทัดใหม่ (ยกเว้นว่าคุณต้องการให้บรรทัดใหม่ถูกพิจารณาเป็นส่วนหนึ่งของอินพุต)

ตัวอย่าง:

$ echo -n foo | perl -nMDigest::SHA=/./ -E 'sha256_base64($_.++$i)!~2016?redo:say$i'
196870
$ echo -n bar | perl -nMDigest::SHA=/./ -E 'sha256_base64($_.++$i)!~2016?redo:say$i'
48230
$ echo -n happynewyear | perl -nMDigest::SHA=/./ -E 'sha256_base64($_.++$i)!~2016?redo:say$i'
1740131
$ echo -n 2016 | perl -nMDigest::SHA=/./ -E 'sha256_base64($_.++$i)!~2016?redo:say$i'
494069

8

Mathematica, 94

(For[i=0,IntegerDigits[4Hash[#<>ToString@++i,"SHA256"],64]~SequenceCount~{54,52,53,58}<1,];i)&

ฟังก์ชันนี้จะลองเลขจำนวนเต็มบวกเป็นตัวเลือก ใช้เวลาประมาณ 4 นาทีบนแล็ปท็อปของฉันเพื่อรับคำตอบที่ถูกต้อง

%["foo"]
(* 196870 *)

การใช้งานอีกต่อไป (เร็วขึ้น~5x) ทำให้การใช้งานของการขนาน:

f[k_]:=
    Do[If[Length@#>0,Return[i+#[[1,1]]]]&@
        Position[ParallelMap[IntegerDigits[4Hash[k<>ToString@#,"SHA256"],64]
            ~SequenceCount~{54,52,53,58}&,i+Range@1*^4],1]
        ,{i,0,∞,1*^4}]

2
เราควรสร้าง Wolfram Language รุ่นกอล์ฟโดยทุกคำสั่งจะถูกแทนที่ด้วยหนึ่งหรือสองตัวอักษร ที่จริงแล้วด้วยจำนวนคำสั่งเราอาจต้องใช้อักขระสามตัวสำหรับคำสั่งทั่วไปบางตัว
Michael Stern

@MichaelStern ฉันไม่สามารถตกลงเพิ่มเติมได้
njpipeorgan


@ LegionMammal978 สุดยอด! แต่ทำไมไม่พิจารณาชื่อที่ดีกว่าเช่น "WOLF"
njpipeorgan

5

Ruby, 87 86 ไบต์

ผมไม่แน่ใจว่าผมเข้าใจความท้าทายอย่างถูกต้อง แต่ก็พบว่าในไม่กี่วินาทีถ้าคุณป้อน196870foo

require"digest"
gets.chop!
$.+=1until/2016/=~Digest::SHA256.base64digest("#$_#$.")
p$.

5

PowerShell, 150 152 153ไบต์

while([Convert]::ToBase64String([Security.Cryptography.SHA256]::Create().ComputeHash([Text.Encoding]::UTF8.GetBytes("$args$i")))-notmatch2016){$i++}$i

ตัวอย่าง

PS > .\BitCoin.ps1 foo
196870

PS > .\BitCoin.ps1 bar
48230

PS > .\BitCoin.ps1 happynewyear
1740131

PS > .\BitCoin.ps1 2016
494069

2

C #, 179 ไบต์

s=>{int i=0;while(!System.Convert.ToBase64String(System.Security.Cryptography.SHA256.Create().ComputeHash(System.Text.Encoding.UTF8.GetBytes(s+i))).Contains("2016"))i++;return i;}

คล้ายกับโซลูชัน PowerShell อีกต่อไป


นั่นเป็นคำหลักจำนวนมาก
Joe Z.

1
@JoeZ นั่นคือ C # สำหรับคุณ
LegionMammal978
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.