@@ -7,6 +7,7 @@ var pkg = require('./package.json');
7
7
var fs = require ( 'fs' ) ;
8
8
var https = require ( 'https' ) ;
9
9
var MemoryStream = require ( 'memorystream' ) ;
10
+ var ethJSUtil = require ( 'ethereumjs-util' ) ;
10
11
11
12
function getVersionList ( cb ) {
12
13
console . log ( 'Retrieving available version list...' ) ;
@@ -24,10 +25,10 @@ function getVersionList (cb) {
24
25
} ) ;
25
26
}
26
27
27
- function downloadBinary ( version ) {
28
+ function downloadBinary ( outputName , version , expectedHash ) {
28
29
console . log ( 'Downloading version' , version ) ;
29
30
30
- var file = fs . createWriteStream ( 'soljson.js' ) ;
31
+ var file = fs . createWriteStream ( outputName , { encoding : 'binary' } ) ;
31
32
https . get ( 'https://ethereum.github.io/solc-bin/bin/' + version , function ( response ) {
32
33
if ( response . statusCode !== 200 ) {
33
34
console . log ( 'Error downloading file: ' + response . statusCode ) ;
@@ -36,6 +37,11 @@ function downloadBinary (version) {
36
37
response . pipe ( file ) ;
37
38
file . on ( 'finish' , function ( ) {
38
39
file . close ( function ( ) {
40
+ var hash = '0x' + ethJSUtil . sha3 ( fs . readFileSync ( outputName , { encoding : 'binary' } ) ) . toString ( 'hex' ) ;
41
+ if ( expectedHash !== hash ) {
42
+ console . log ( 'Hash mismatch: ' + expectedHash + ' vs ' + hash ) ;
43
+ process . exit ( 1 ) ;
44
+ }
39
45
console . log ( 'Done.' ) ;
40
46
} ) ;
41
47
} ) ;
@@ -47,5 +53,7 @@ console.log('Downloading correct solidity binary...');
47
53
getVersionList ( function ( list ) {
48
54
list = JSON . parse ( list ) ;
49
55
var wanted = pkg . version . match ( / ^ ( \d + \. \d + \. \d + ) $ / ) [ 1 ] ;
50
- downloadBinary ( list . releases [ wanted ] ) ;
56
+ var releaseFileName = list . releases [ wanted ] ;
57
+ var expectedHash = list . builds . filter ( function ( entry ) { return entry . path === releaseFileName ; } ) [ 0 ] . keccak256 ;
58
+ downloadBinary ( 'soljson.js' , releaseFileName , expectedHash ) ;
51
59
} ) ;
0 commit comments