ããã¯ãã¹ãŠããããã³ã€ã³ãããããç¥ãããšã決ãããšããäºå®ããå§ãŸããŸããã ããããã©ã®ããã«æ¡æãããããç解ãããã£ãã æè¿ããããã³ã€ã³ãšãããã¯ãã§ãŒã³ã«é¢ããèšäºãé »ç¹ã«èŠã€ãããŸããããæè¡çãªè©³çŽ°ããã¹ãŠèšèŒãããèšäºã¯ããŸãå€ããããŸããã
ãã¹ãŠã®è©³çŽ°ãææ¡ããæãç°¡åãªæ¹æ³ã¯ããªãŒãã³ãœãŒã¹ã調ã¹ãããšã§ãã
FPGAãã€ããŒã® VerilogãœãŒã¹ã³ãŒãã調æ»ããããšã«ããŸããã ããã¯ãã®ãããªãããžã§ã¯ãã ãã§ã¯ãããŸãããgithubã«ã¯ããã«ããã€ãã®äŸãããããããã¯ãã¹ãŠç°ãªãäœè
ã®ãã®ã§ãããã»ãŒåãã¹ããŒã ã«åŸã£ãŠæ©èœããŠããããã§ãã äœè
ãæåã«ãã¹ãŠãæã£ãŠããå¯èœæ§ããããŸããç°ãªãããããšç°ãªãããŒãã«åãã³ãŒããé©å¿ãããéçºè
ãç°ãªãã ãã§ã...å°ãªããšãç§ã«ã¯æããŸãã...
Verilogã®ãœãŒã¹ã³ãŒããç 究ããç§ã¯ã5äžåã®ããžãã¯èŠçŽ ãåããAltera MAX10 FPGAã«åºã¥ããŠãgithubããMars rover3ããŒãã«ãããžã§ã¯ããé©åãããŸããã ç§ã¯é±å±±åŽåè
ãç«ã¡äžãããããã³ã€ã³ã®èšç®ããã»ã¹ãéå§ããããšããã§ããŸããããç¡é§ã®ãã30ååŸã«ãã®ããžãã¹ãçµäºããŸããã çŸåšã®ãšãããFPGAãã€ããŒã¯åäœããŠããŸãã ãŸããããããããŠãã ããã
æ£çŽãªãšããããããã³ã€ã³èªäœïŒãããããããã®ãéã®ä»£çšç©ïŒã«ã¯èå³ããããŸããã§ããããSHA256ã¢ã«ãŽãªãºã ã®æ°åŠçãªåŽé¢ã«èå³ããããŸããã ãããç§ã話ãããããšã§ãã SHA256ã¢ã«ãŽãªãºã ã䜿çšããŠããã€ãã®å®éšãå®æœããŸãããããããã®å®éšã®çµæã¯èå³æ·±ããã®ã«ãªãã§ãããã
å®éšã®ããã«æåã«å¿
èŠãªããšã¯ãVerilogã§ãã¯ãªãŒã³ãªãSHA256å®è£
ãäœæããããšã§ããã
å®éãå°ãªããšãåã
opencores.orgäžãå°ãªããšãgithub.comäžã§ãVerilogã«SHA256ã¢ã«ãŽãªãºã ã®å®è£
ãå€æ°ãããŸãã ãã ãããã®ãããªå®è£
ã¯å®éšã«ã¯é©ããŠããŸããã æ¢åã®ã¢ãžã¥ãŒã«ã«ã¯ãåžžã«ãã€ãã©ã€ã³æ§é ããã€ãã©ã€ã³ããããŸãã ããã¯æ£ããããã§ãã ãã€ãã©ã€ã³ãããå Žåã®ã¿ãé«éã¢ã«ãŽãªãºã ãååŸã§ããŸãã SHA256ã¢ã«ãŽãªãºã ã¯ã64ã®åŠçã¹ãããããããããã©ãŠã³ããã§æ§æãããŠããŸãã FPGAã®ããªã¥ãŒã ãèš±ãã°ã64ã©ãŠã³ããã¹ãŠãåäžã®æäœãã§ãŒã³ã«å±éã§ããŸããèšç®ã®ãã¹ãŠã®æ®µéã¯ãåäœåšæ³¢æ°ã®1ã¯ããã¯ãµã€ã¯ã«ã§äžŠè¡ããŠå®è¡ãããŸãã ãã®ãããªãã®ïŒ
ã¢ã«ãŽãªãºã ã®å
¥åã§ãSHA256ãã·ã³ã®8ã€ã®32ãããç¶æ
ã¯ãŒãã ãããã¯ã¬ãžã¹ã¿AãBãCãDãEãFãGãHã§ããå
¥åããŒã¿èªäœã512ãããã¯Wä¿æ°ã«å€æãããåã©ãŠã³ãã§æ··åãããŸãã æ°ããåèªããŒã¿ã¯æåã®ã©ãŠã³ãã®ã¬ãžã¹ã¿ã«ããŒããããŸããã2çªç®ã®ã©ãŠã³ãã¯åã®ã¡ãžã£ãŒã«ããŒããããããŒã¿ã®èªã¿åããç¶ãã3çªç®ã®ã©ãŠã³ãã¯åã®ã¡ãžã£ãŒã«ããŒããããããŒã¿ã®èªã¿åããç¶ããŸãã çµæã®ã¬ã€ãã³ã·ãã€ãŸãèšç®çµæã®é
延ã¯æ£ç¢ºã«64ãµã€ã¯ã«ã«ãªããŸãããäžè¬ã«ããã€ãã©ã€ã³ã䜿çšãããšã¢ã«ãŽãªãºã å
šäœã1ãµã€ã¯ã«ã§èªã¿åãããšãã§ããŸãã FPGAã®ããªã¥ãŒã ãå°ãããã©ãŠã³ããã§ãŒã³å
šäœãæ¡åŒµã§ããªãå Žåãååã«ãªããŸãã ãã®ããããããžã§ã¯ããæ¢åã®FPGAã«é©åãããããšãã§ããŸãããèšç®é床ãåœç¶ååã«ãªããŸãã ããã«å®¹éã®å°ãªãFPGAã䜿çšããŠããã«åãããããšãã§ããŸããããã€ãã©ã€ã³ãçãããå¿
èŠããããçç£æ§ãåã³äœäžããŸãã ç§ãç解ããŠããããã«ã2åé£ç¶ã®SHA256å€æãè¡ãBitcoinãã€ããŒå
šäœã§ã¯ãã¢ã«ãã©/ Intel FPGAã«çŽ8äžã®ããžãã¯ãšã¬ã¡ã³ããå¿
èŠã§ãã ããããç§ã¯æ°ãåãããŸãã...
ã ãããç§ã¯å®å
šã«ã°ãããããšãããã-äžéã¬ãžã¹ã¿ãªãã§SHA256ã¢ã«ãŽãªãºã ã®ãçŽç²ãªãé¢æ°ãVerilogã«æžããŠããã€ãã©ã€ã³ãªãã§ãããæ®ãã ãã®å¥åŠãªã¢ã¯ã·ã§ã³ã®ç®æšã¯åçŽã§ã-SHA256ã¢ã«ãŽãªãºã ã®èšç®ã«å¿
èŠãªå®éã®ããžãã¯éã決å®ããããšã§ãã 512ãããã®ããŒã¿ïŒãŸãã256ãããã®åæç¶æ
ïŒãäŸçµŠããåçŽãªçµã¿åããåè·¯ãå¿
èŠã§ã256ãããã®çµæãçæããŸãã
ç§ã¯ãã®Verilogã¢ãžã¥ãŒã«ãæžããŸãããèªåã§äœããæžããã©ããã§ãä»ã®ãªãŒãã³ãœãŒã¹ããäœããåããŸããã ç§ã®ãããžã§ã¯ãã¯sha256-testã§ãã
ããã¯ãåäžã®äžéã¬ãžã¹ã¿ã§ã¯ãªããçŽç²ãªã©ãã³SHA256ã§ããmodule e0 (x, y); input [31:0] x; output [31:0] y; assign y = {x[1:0],x[31:2]} ^ {x[12:0],x[31:13]} ^ {x[21:0],x[31:22]}; endmodule module e1 (x, y); input [31:0] x; output [31:0] y; assign y = {x[5:0],x[31:6]} ^ {x[10:0],x[31:11]} ^ {x[24:0],x[31:25]}; endmodule module ch (x, y, z, o); input [31:0] x, y, z; output [31:0] o; assign o = z ^ (x & (y ^ z)); endmodule module maj (x, y, z, o); input [31:0] x, y, z; output [31:0] o; assign o = (x & y) | (z & (x | y)); endmodule module s0 (x, y); input [31:0] x; output [31:0] y; assign y[31:29] = x[6:4] ^ x[17:15]; assign y[28:0] = {x[3:0], x[31:7]} ^ {x[14:0],x[31:18]} ^ x[31:3]; endmodule module s1 (x, y); input [31:0] x; output [31:0] y; assign y[31:22] = x[16:7] ^ x[18:9]; assign y[21:0] = {x[6:0],x[31:17]} ^ {x[8:0],x[31:19]} ^ x[31:10]; endmodule module round (idx, in, k, w, out); input [7:0]idx; input [255:0]in; input [ 31:0]k; input [ 31:0]w; output [255:0]out; always @(w) $display("i=%dk=%8x w=%8x",idx,k,w); wire [31:0]a; assign a = in[ 31: 0]; wire [31:0]b; assign b = in[ 63: 32]; wire [31:0]c; assign c = in[ 95: 64]; wire [31:0]d; assign d = in[127: 96]; wire [31:0]e; assign e = in[159:128]; wire [31:0]f; assign f = in[191:160]; wire [31:0]g; assign g = in[223:192]; wire [31:0]h; assign h = in[255:224]; wire [31:0]e0_w; e0 e0_(a,e0_w); wire [31:0]e1_w; e1 e1_(e,e1_w); wire [31:0]ch_w; ch ch_(e,f,g,ch_w); wire [31:0]mj_w; maj maj_(a,b,c,mj_w); wire [31:0]t1; assign t1 = h+w+k+ch_w+e1_w; wire [31:0]t2; assign t2 = mj_w+e0_w; wire [31:0]a_; assign a_ = t1+t2; wire [31:0]d_; assign d_ = d+t1; assign out = { g,f,e,d_,c,b,a,a_ }; endmodule module sha256_transform( input wire [255:0]state_in, input wire [511:0]data_in, output wire [255:0]state_out ); localparam Ks = { 32'h428a2f98, 32'h71374491, 32'hb5c0fbcf, 32'he9b5dba5, 32'h3956c25b, 32'h59f111f1, 32'h923f82a4, 32'hab1c5ed5, 32'hd807aa98, 32'h12835b01, 32'h243185be, 32'h550c7dc3, 32'h72be5d74, 32'h80deb1fe, 32'h9bdc06a7, 32'hc19bf174, 32'he49b69c1, 32'hefbe4786, 32'h0fc19dc6, 32'h240ca1cc, 32'h2de92c6f, 32'h4a7484aa, 32'h5cb0a9dc, 32'h76f988da, 32'h983e5152, 32'ha831c66d, 32'hb00327c8, 32'hbf597fc7, 32'hc6e00bf3, 32'hd5a79147, 32'h06ca6351, 32'h14292967, 32'h27b70a85, 32'h2e1b2138, 32'h4d2c6dfc, 32'h53380d13, 32'h650a7354, 32'h766a0abb, 32'h81c2c92e, 32'h92722c85, 32'ha2bfe8a1, 32'ha81a664b, 32'hc24b8b70, 32'hc76c51a3, 32'hd192e819, 32'hd6990624, 32'hf40e3585, 32'h106aa070, 32'h19a4c116, 32'h1e376c08, 32'h2748774c, 32'h34b0bcb5, 32'h391c0cb3, 32'h4ed8aa4a, 32'h5b9cca4f, 32'h682e6ff3, 32'h748f82ee, 32'h78a5636f, 32'h84c87814, 32'h8cc70208, 32'h90befffa, 32'ha4506ceb, 32'hbef9a3f7, 32'hc67178f2}; genvar i; generate for(i=0; i<64; i=i+1) begin : RND wire [255:0] state; wire [31:0]W; if(i<16) begin assign W = data_in[i*32+31:i*32]; end else begin wire [31:0]s0_w; s0 so_(RND[i-15].W,s0_w); wire [31:0]s1_w; s1 s1_(RND[i-2].W,s1_w); assign W = s1_w + RND[i - 7].W + s0_w + RND[i - 16].W; end if(i == 0) round R ( .idx(i[7:0]), .in(state_in), .k( Ks[32*(63-i)+31:32*(63-i)] ), .w(W), .out(state) ); else round R ( .idx(i[7:0]), .in(RND[i-1].state), .k( Ks[32*(63-i)+31:32*(63-i)] ), .w(W), .out(state) ); end endgenerate wire [31:0]a; assign a = state_in[ 31: 0]; wire [31:0]b; assign b = state_in[ 63: 32]; wire [31:0]c; assign c = state_in[ 95: 64]; wire [31:0]d; assign d = state_in[127: 96]; wire [31:0]e; assign e = state_in[159:128]; wire [31:0]f; assign f = state_in[191:160]; wire [31:0]g; assign g = state_in[223:192]; wire [31:0]h; assign h = state_in[255:224]; wire [31:0]a1; assign a1 = RND[63].state[ 31: 0]; wire [31:0]b1; assign b1 = RND[63].state[ 63: 32]; wire [31:0]c1; assign c1 = RND[63].state[ 95: 64]; wire [31:0]d1; assign d1 = RND[63].state[127: 96]; wire [31:0]e1; assign e1 = RND[63].state[159:128]; wire [31:0]f1; assign f1 = RND[63].state[191:160]; wire [31:0]g1; assign g1 = RND[63].state[223:192]; wire [31:0]h1; assign h1 = RND[63].state[255:224]; wire [31:0]a2; assign a2 = a+a1; wire [31:0]b2; assign b2 = b+b1; wire [31:0]c2; assign c2 = c+c1; wire [31:0]d2; assign d2 = d+d1; wire [31:0]e2; assign e2 = e+e1; wire [31:0]f2; assign f2 = f+f1; wire [31:0]g2; assign g2 = g+g1; wire [31:0]h2; assign h2 = h+h1; assign state_out = {h2,g2,f2,e2,d2,c2,b2,a2}; endmodule
åœç¶ãã¢ãžã¥ãŒã«ãæ©èœããŠããããšã確èªããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãããã€ãã®ããŒã¿ãããã¯ãå
¥åã«éä¿¡ããŠçµæã確èªããç°¡åãªãã¹ããã³ããå¿
èŠã§ãã
ããããã¹ããã³ãVerilogã§ã `timescale 1ns/1ps module tb; initial begin $dumpfile("tb.vcd"); $dumpvars(0, tb);
Cã§èšè¿°ãããsha256_transformé¢æ°ã«ãã£ãŠäžããããçããšæ¯èŒããŸãïŒCã§ã³ãŒããæäŸã§ããŸãããïŒC / C ++ã§ã®ãããã®å®è£
ã¯å®å
šã«å®äºããŠããŸãïŒã äž»ãªçµæïŒ
Visual Studioç°å¢ã§C / C ++ã§ããã°ã©ã ããicarus verilogãšgtkwaveã§Verilogããã°ã©ã ããã¹ãããŸãã ç§ã¯çããäžèŽãããšç¢ºä¿¡ããã®ã§ãå
ã«é²ãããšãã§ããŸãã
ããã§ãã¢ãžã¥ãŒã«ãFPGAã«æ¿å
¥ãããã®ãããªé¢æ°ãå æã§ããè«çèŠçŽ ã®æ°ã確èªã§ããŸãã
FPGAã®ãããªãããžã§ã¯ããäœæããŸãã
module sha256_test( input wire clk, input wire data, output wire [255:0]result ); reg [511:0]d; always @(posedge clk) d <= { d[510:0],data }; sha256_transform s0( .state_in( 256'h5be0cd191f83d9ab9b05688c510e527fa54ff53a3c6ef372bb67ae856a09e667 ), .data_in( d ), .state_out(result) ); endmodule
ããã§ã¯ãå
¥åããŒã¿ã512ãããã®1ã€ã®é·ãã¬ãžã¹ã¿ã«ããã·ã¥ããããã¯ãªãŒã³ãªãSHA256_transformãžã®å
¥åãšããŠäŸçµŠããããšæ³å®ããŠããŸãã 256åã®åºåãããã¯ãã¹ãŠãFPGAã®åºåãã³ã«åºåãããŸãã
FPGA Cyclone IVçšã«ã³ã³ãã€ã«ããŠããŸããããã®åŠçã«ã¯30.103ã®è«çèŠçŽ ãå¿
èŠã«ãªãããšãããããŸãã
ãã®çªå·ãèŠããŠãããŠãã ããïŒ
30103 ...
2çªç®ã®å®éšãè¡ããŸãããã ãããžã§ã¯ãã¯ãsha256-eliminatedãã§ãã
module sha256_test( input wire clk, input wire data, output wire [255:0]result ); sha256_transform s0( .state_in( 256'h5be0cd191f83d9ab9b05688c510e527fa54ff53a3c6ef372bb67ae856a09e667 ), .data_in( 512'h66656463626139383736353433323130666564636261393837363534333231306665646362613938373635343332313066656463626139383736353433323130 ), .state_out(result) ); endmodule
ããã§ã¯ãå€éšããå
¥åããŒã¿ãFPGAã«éä¿¡ããã®ã§ã¯ãªããsha256_transformã¢ãžã¥ãŒã«ã®å®æ°ãäžå®ã®å
¥åä¿¡å·ã§åçŽã«èšå®ããŸãã
FPGAã§ã³ã³ãã€ã«ããŸãã ãã®å Žåã
ZEROã«é¢ä¿ããè«çèŠçŽ ã®æ°ãããããŸãã
ã¢ã«ãã©ïŒãŸãã¯Intelã§ããïŒæ£ãããšåŒã¶ã¹ãã§ããïŒïŒQuartus Primeã¯ããã€ã¹ã®ããžãã¯å
šäœãæé©åããã¬ãžã¹ã¿ããªããçµæãäŸåããå
¥åä¿¡å·ããªããããSHA256ã¢ãžã¥ãŒã«ã®å
¥åãã©ã¡ãŒã¿ãŒããçµã¿åããé¢æ°å
šäœãçž®éããçããèšç®ãããŸãã³ã³ãã€ã«ã FPGAãã³ã§åºåä¿¡å·ã確èªã§ããŸãã ã³ã³ãã€ã©ã¯ããã«ãäžéšã®ä¿¡å·ãã°ã©ã³ãã«ãäžéšãVCCã«äŸçµŠé»å§ã«çµåãããããšãæžã蟌ã¿ãŸãã ãããã£ãŠãã³ã³ãã€ã©ãŒã«ãã£ãŠèšç®ãããåºåã¯ãåºåã«è¡šç€ºãããŸãïŒ0x56ã0x70ã...æåã®ãã¹ãã±ãŒã¹ãšãŸã£ããåãã§ãã
ãããã£ãŠããã®ãããªèããçããŸãã ã³ã³ãã€ã©ãŒã¯éåžžã«è³¢ããããžãã¯ãéåžžã«ããŸãæé©åã§ãããããsha256ããã®åºåãããã1ã€ã ãèæ
®ããªãã®ã¯ãªãã§ããïŒ çµæã®ãããã1ã€ã ãã«ãŠã³ãããã«ã¯ãã©ã®ãããã®ããžãã¯ãå¿
èŠã§ããïŒ
å®éã«ã ãããã³ã€ã³ã¯æ¬¡ã®ããã«èæ
®ãããŸãïŒããŒã¿ãããã¯ããããŸãã ããŒã¿ãããã¯ã«ã¯å€æŽå¯èœãªå¯å€ãã£ãŒã«ãããããŸããããã¯32ãããã®ãã³ã¹ãã£ãŒã«ãã§ãã ãããã¯å
ã®æ®ãã®ããŒã¿ã¯ä¿®æ£ãããŠããŸãã sha256ã®çµæããç¹å¥ãã«ãªãããã«ãã€ãŸããsha256å€æçµæã®äžäœãããããŒãã«ãªãããã«ããã³ã¹ãã£ãŒã«ããå埩åŠçããå¿
èŠããããŸãã
ããã§ã¯ãsha256ã1åèæ
®ãããã³ã¹ã1ã€å¢ãããŸããåã³ããã·ã¥ãååŸããäœåºŠãç¹°ãè¿ããŸãã äœçŸãäœååãåãããŒã¿ãããã¯ã§ããããããã«ç°ãªããã³ã¹ãã£ãŒã«ãã ãã®å Žåãsha256ã®çµæã®ãã¹ãŠã®ããããèšç®ãããŸããã€ãŸãããã¹ãŠã®åºåãããã¯256ãããã§ãã ããã¯ãšãã«ã®ãŒçã«æçã§ããïŒ ããã¯ãé¢äžããè«çèŠçŽ ã®æ°ã®ç¹ã§æçã§ããïŒ
ããããçµæã®æäžäœãããã®1ã€ã ããæ°ãããšã©ããªãã§ãããã 圌ã¯ããŒããŸãã¯1ã®ããããã§ããå¯èœæ§ãçãããšèããŠããŸãã 1ã§ããããšãå€æããå Žåãæ®ãã®ããããã«ãŠã³ãããå¿
èŠã¯ãããŸããã 貎éãªãšãã«ã®ãŒãç¡é§é£ãããã®ã¯ãªãã§ããïŒ
ãã®ä»®å®ãè¡ã£ãã®ã§ãäœããã®çç±ã§ã1ã€ã®ããã·ã¥ãããã®ã¿ãèšç®ããããã®è«çèŠçŽ ã®æ°ã¯ãçµæã®ãã¹ãŠã®ããããèšç®ããå Žåã®256åã«ãã¹ãã ãšããã«æããŸããã ããããç§ã¯ééã£ãŠããŸããã
ãã®ä»®èª¬ããã¹ãããããã«ã次ã®ãããªæäžäœã¢ãžã¥ãŒã«ã䜿çšããŠãååäœã®ãããžã§ã¯ããäœæããããšã«ããŸããã
module sha256_test( input wire clk, input wire data, output wire result ); reg [511:0]d; always @(posedge clk) d <= { d[510:0],data }; wire [255:0]r; sha256_transform s0( .state_in( 256'h5be0cd191f83d9ab9b05688c510e527fa54ff53a3c6ef372bb67ae856a09e667 ), .data_in( d ), .state_out(r) ); assign result = r[187]; // , endmodule
sta256_transformã¯ããã·ã¥å
šäœãèšç®ããçãã¯ä¿¡å·ç·[255ïŒ0] rã«ããããã«èŠããŸãããVerilogã¢ãžã¥ãŒã«ã®åºåã¯1ãããã®ã¿ã§ãããçµæ= r [187]ãå²ãåœãŠãããŸãã ããã«ãããã³ã³ãã€ã©ã¯ç®çã®ããããèšç®ããããã«å¿
èŠãªããžãã¯ã®ã¿ãå¹æçã«æ®ãããšãã§ããŸãã æ®ãã¯æé©åããããããžã§ã¯ãããåé€ãããŸãã
å®éšãè¡ãã«ã¯ãæåŸãã2çªç®ã®è¡ãä¿®æ£ãããããžã§ã¯ãã256ååã³ã³ãã€ã«ããã ãã§ãã ãã®äœæ¥ã容æã«ããããã«ãquartusã®ã¹ã¯ãªãããäœæããŸãã
#!/usr/bin/tclsh proc read_rpt { i frpt } { set fp [open "output_files/xxx.map.summary" r] set file_data [read $fp] close $fp set data [split $file_data "\n"] foreach line $data { set half [split $line ":"] set a [lindex $half 0] set b [lindex $half 1] if { $a == " Total combinational functions " } { puts [format "%d %s" $i $b] puts $frpt [format "%d %s" $i $b] } } } proc gen_sha256_src { i } { set fo [open "sha256_test.v" "w"] puts $fo "module sha256_test(" puts $fo " input wire clk," puts $fo " input wire data," puts $fo " output wire result" puts $fo ");" puts $fo "" puts $fo "reg \[511:0]d;" puts $fo "always @(posedge clk)" puts $fo " d <= { d\[510:0],data };" puts $fo "" puts $fo "wire \[255:0]r;" puts $fo "sha256_transform s0(" puts $fo " .state_in( 256'h5be0cd191f83d9ab9b05688c510e527fa54ff53a3c6ef372bb67ae856a09e667 )," puts $fo " .data_in( d )," puts $fo " .state_out(r)" puts $fo " );" puts $fo "" puts $fo "assign result = r\[$i];" puts $fo "" puts $fo "endmodule" close $fo } set frpt [open "rpt.txt" "w"] for {set i 0} {$i < 256} {incr i} { gen_sha256_src $i exec x.bat read_rpt $i $frpt } close $frpt exit
ãã®ã¹ã¯ãªããã¯ãã«ãŒãå
ã§sha256_test.vã¢ãžã¥ãŒã«ãåäœæããsha256ã®çµæã®æ¬¡ã®ããããFPGAåºåãã³ã«åºåãããã³ã«åäœæããŸãã
ã¹ã¯ãªãããæ°æéå®è¡ãããšãåºæ¥äžããã§ãã å€ã®è¡šããããŸãã ããã§ãSHA256ã®ã©ã®ããããæãèšç®ãããããã確å®ã«ããããŸããã èšç®ãããSHA256ãããã®ã·ãªã¢ã«çªå·ã«å¯Ÿããããžãã¯ãšã¬ã¡ã³ãã®å¿
èŠæ°ã®ã°ã©ãã¯æ¬¡ã®ãšããã§ãã
ããããããããçªå·224ãèšç®ããã®ãæãç°¡åã§ããããšãæããã«ãªããŸã
ã27,204åã®è«çèŠçŽ ãå¿
èŠ
ã§ã ã ããã¯å®éã«ã¯ã256åã®åºåããããã¹ãŠãèšç®ããå Žåãããã»ãŒ10ïŒ
å°ãªããªããŸãã
éžã®åœ¢ã®ã°ã©ãã¯ãSHA256ã¢ã«ãŽãªãºã ã«ã¯å€ãã®å ç®åšããããšããäºå®ã«ãã£ãŠèª¬æãããŸãã å ç®åšã§ã¯ã次ã®åäžäœãããã¯ãåã®äžäœããããããèšç®ãå°é£ã§ãã ããã¯ãå ç®åšãå€ãã®å
šå ç®åšãããã¯ã§æ§æãããããã転éã¹ããŒã ãåå ã§ãã
幜éã®ãããªãšãã«ã®ãŒç¯çŽã¯ãã§ã«çŸããŠããŸãã ç§ã¯ãã¹ãŠã®è«çæ©èœããšãã«ã®ãŒãé£ã¹ããšä¿¡ããŠããŸãã FPGAãããžã§ã¯ãã«å«ãŸããLEã²ãŒãã®æ°ãå°ãªãã»ã©ããšãã«ã®ãŒæ¶è²»ãå°ãªããªããŸãã ææ¡ãããã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã1ã€ã®æãåçŽãªããããæ€èšãããŒãã®å Žåã¯æ¬¡ãæ€èšããŸãã 1ã€ã§ããã°ãåãããã·ã¥ã®æ®ãã®ãããã«ãšãã«ã®ãŒãšæéãšãšãã«ã®ãŒãç¡é§ã«ããŸããã
ããžãã¯ãæé©åããã³ã³ãã€ã©ã®æ©èœã«é¢é£ããå¥ã®èãã
ãã³ã¹ãã£ãŒã«ããåæãããšãããããã¯ã®ã¡ã€ã³ããŒã¿ã¯åããŸãŸã§ããããããµã€ã¯ã«ããšã«ãäžéšã®èšç®ãåçŽã«ç¹°ãè¿ãããåãããšãèæ
®ããããšã¯è«ççã§æçœã§ãã 質åïŒç¹°ãè¿ãèšç®ã§å€±ããããšãã«ã®ãŒéãæšå®ããæ¹æ³ã¯ïŒ
å®éšã¯ç°¡åã§ãã ããšãã°ã2ã€ã®sha256_transformã¢ãžã¥ãŒã«ã䞊ã¹ãŠé
眮ãã1ããããé€ããåãå
¥åãé©åã«äŸçµŠããŸãã ãããã®2ã€ã®ã¢ãžã¥ãŒã«ã¯ãé£æ¥ãããã³ã¹ã1ãããç°ãªãããšãèæ
®ããŠãããšèããŠããŸãã
module sha256_test( input wire clk, input wire data, output wire [1:0]result ); reg [511:0]d; always @(posedge clk) d <= { d[510:0],data }; wire [255:0]r0; sha256_transform s0( .state_in( 256'h5be0cd191f83d9ab9b05688c510e527fa54ff53a3c6ef372bb67ae856a09e667 ), .data_in( { 1'b0, d[510:0] } ), .state_out(r0) ); wire [255:0]r1; sha256_transform s1( .state_in( 256'h5be0cd191f83d9ab9b05688c510e527fa54ff53a3c6ef372bb67ae856a09e667 ), .data_in( { 1'b1, d[510:0] } ), .state_out(r1) ); assign result = { r0[224], r1[224] }; endmodule
ã¢ãžã¥ãŒã«s0ãšs1ã®ããããã¯ãåãå
¥åããã®ããã·ã¥ãèæ
®ãã1ã€ã®nonceã ããç°ãªããŸãã ãããããããçµæã®ãæã軜ãããããããããçªå·224ã®ã¿ãååŸããŸãã
ãã®ããžãã¯ã¯FPGAã§ã©ã®ãããæéãããããŸããïŒ 47,805åã®è«çèŠçŽ ã 2ã€ã®ã¢ãžã¥ãŒã«ãããã®ã§ã47805/2 = 23902ãå¿
èŠã§ãã2ã€ã®ããã·ã¥ãäžåºŠã«èªã¿å§ããæ¹ããäžè¬çãªèšç®ããããããé çªã«ã«ãŠã³ããããããã¯ããã«æçã§ãã
ãããŠãããã«4ã€ã®ããã·ã¥ãã«ãŠã³ããå§ãããã³ã¹ãã£ãŒã«ãã§2ãããã ãç°ãªãå Žåã¯ã©ãã§ããããïŒ 89009LE / 4 = 22252 LE / SHA256
ãããŠãããªãã8ã€ã®ããã·ã¥ãæ°ãããïŒ 171418LE / 8 = 21427 LE / SHA256ãšå€æ
ããã§ã¯ãå®å
šãªSHA256_transformãããã®30103åã®è«çèŠçŽ ã®åææ°ãçµæã®256ãããã®åºåãšæ¯èŒããSHA256_transfromã®21427åã®è«çèŠçŽ ãçµæã®1ãããã®åºåãšæ¯èŒã§ããŸãïŒããã¯ãããªãèšç®ã®å®è¡å¯èœæ§ãäºæž¬ããããã«äœ¿çšã§ããŸãïŒã ãã®ãããªæ¹æ³ã¯ãé±å€«ã®ãšãã«ã®ãŒæ¶è²»ãçŽ3åã®1åæžã§ããããã«æããŸãã ãŸããååã®äž...ç§ã¯ãããã©ãã»ã©éèŠã§ãããããããŸããããããã¯éèŠã§ããããã§ãã
ããäžã€èãããããŸãã èšç®çšãããã¯ã®ã¡ã€ã³ããŒã¿ã¯åºå®ããããŸãŸã§ãããããã·ã¥ã®èšç®äžã«ãã³ã¹ãã£ãŒã«ãã®ã¿ãå€æŽãããŸãã FPGAåãã«è¿
éã«ã³ã³ãã€ã«ã§ããå Žåã¯ãã³ã³ãã€ã«æ®µéã§äºåèšç®ã®å€§éšåãå®è¡ã§ããŸãã çµå±ã®ãšãããã³ã³ãã€ã©ãŒãäºåã«èšç®ã§ãããã¹ãŠãèšç®ããå¹çæ§ãäžèšã§ç€ºããŸããã äºåèšç®ã䜿çšããŠæé©åãããããžãã¯ã¯ããã«ã³ã³ãã¥ãŒã¿ãŒã«å¿
èŠãªããªã¥ãŒã ãããã¯ããã«å°ããããã¯ããã«å°ããããããšãã«ã®ãŒæ¶è²»ãå°ãªããªããŸãã
ãŸãããã®ãããªãã®ã å®éãç§èªèº«ã¯èªåã®ç 究ãå®å
šã«ç¢ºä¿¡ããŠããããã§ã¯ãããŸããã äœããèæ
®ããŠããªãããç解ããŠããªãã®ãããããŸããã ãã¡ãããææ¡ãããæ¹æ³ã¯ã°ããŒãã«ãªãã¬ãŒã¯ã¹ã«ãŒããããããã®ã§ã¯ãããŸããããäœããä¿åããããšãã§ããŸãã ãããŸã§ã®ãšããããããã¯ãã¹ãŠçè«çãªèæ
®äºé
ã§ãã å®éã®å®è£
ã§ã¯ããã¯ãªãŒã³ãªãSHA256ã¯é©åã§ã¯ãããŸãã-åäœåšæ³¢æ°ãäœãããŸãã ãã€ãã©ã€ã³ãå°å
¥ããå¿
èŠããããŸãã
ãã1ã€èŠå ããããŸãã å®éã«ã¯ã2ã€ã®é£ç¶ããSHA256_transformããããã³ã€ã³ãšèŠãªãããŸãã ãã®å Žåãè«çèŠçŽ ã®æ°ãšæ¶è²»ããããšãã«ã®ãŒã®ç§ã®æšå®ã²ã€ã³ã¯ããã»ã©éèŠã§ã¯ãªããããããŸããã
ã¢ã«ãã©ã®MAX10ã50K LE FPGAãæèŒããMars rover3ããŒãã®bitconãã€ããŒãããžã§ã¯ãã®ãœãŒã¹ã¯
ãã¡ãã§ãã ããã§ãResearchãã©ã«ãã«ã¯ãSHA256ã¢ã«ãŽãªãºã ã䜿çšããç§ã®å®éšã®ãã¹ãŠã®ãœãŒã¹ããããŸãã
ãã€ããŒFPGAãããžã§ã¯ãã®èª¬æã¯ãã¡ã