0,'FinalChainHash'=>'']; //循环获取 while(true) { //通过ID递增来不停向下获取,每次只获取一条 $t = file_get_contents('https://'.$server.$public_config['PathGetSingleFinalChainItem'].'?no='.($last_item['BlockWeightChainId']+1).'&nonexist=next'); if($t===false) throw new Exception('访问连接远程服务器失败', 1); $t =json_decode($t,true); if(!$t) throw new Exception('JSON解码失败', 1); if(!$t['success']) throw new Exception('远程服务器报错:'.$t['detail'], 1); $detail=$t['detail']; //先验证一遍哈希2和哈希3合法性 $source_text=$detail['ChainHash'].','.$detail['CalcInnerAddtion'].','.$detail['CalcOutAddtion'].','.$detail['CalcLast'].','; if(hash('sha3-256',$source_text.$detail['WeightedHash3Value'])!=$detail['WeightedHash3']) throw new Exception('哈希3验证失败', 1); if(hash('sha256',$source_text.$detail['WeightedHash2Value'])!=$detail['WeightedHash2']) throw new Exception('哈希2验证失败', 1); $t = site_general_hash($detail['WeightedHash3'].$detail['WeightedHash2'].'.'.$last_item['FinalChainHash'].'.'.$detail['NodeHash']); if($t != $detail['FinalChainHash']) throw new Exception('验证失败', 1); $last_item=['BlockWeightChainId'=>$detail['BlockWeightChainId'],'FinalChainHash'=>$detail['FinalChainHash']]; if(strlen($chain_data)) $chain_data.="\r\n"; $chain_data.=$source_text."\t".$detail['WeightedHash3Value']."\t".$detail['WeightedHash2Value']."\t".$detail['NodeHash']."\t".$detail['FinalChainHash']; } } catch (Exception $e) { //并不是所有的异常均为出错,如已经超出链数据范围可能异常是“没有搜索到您需要的条目” log_append('异常退出,'.$e->getMessage()); } //上面运行无论全部成功、部分成功均输出到文件 log_append(file_put_contents($chain_file, $chain_data) ? '成功输出到文件'.$chain_file."\r\n" : '输出到文件 '.$chain_file.' 失败'); function log_append($title) { //为方便设置变量$log_file放在了文件开头,此时在函数内部要用global global $log_file; $text = date('Y-m-d H:i:s ').$title."\r\n"; file_put_contents($log_file,$text,FILE_APPEND); //echo $text;//用户可以直接输出到控制台代替输出文件来查看错误 } function site_general_hash($s) { //有时未安装sha3-256组件,此时停止运行并报错 $t = hash('sha3-256',$s).hash('sha256',$s); if(strlen($t)!= 128) exit('哈希出错'); return $t; }