ä»é¶å¼å§å建èªå·±çåºåé¾åºç¨ï¼JAVAçï¼
é 读对象
æ¬æé 读对象ï¼ä¸»è¦æ¯å¸æåå³å°ä»äºåºåé¾å¼åçé¡¹ç®æ¶æå¸ï¼å¼åå·¥ç¨å¸ï¼é¡¹ç®è®¾è®¡æäº§å设计å¸ãè¦æ±é 读è å ·å¤ä¸å®çâåºåé¾âåºç¡ç¥è¯ãæ¦å¿µå以åç¸å ³çææ¯ç¥è¯ã
å¦æä½ åªéè¦å¯¹åºåé¾åºç¨åä¸ä¸ªæ´æ·±æ´ç´è§çäºè§£ï¼éè¿æ¬æçä¾åæ´æ¸ æ°äºè§£åºå龿¯æä¹åäºï¼å¤§æ¦æ¯æä¹å¼ååºæ¥çï¼æä¹ä½¿ç¨ï¼é£ä¹ç¥éä¸äºåºåé¾ç¸å ³ç¥è¯å³å¯ã
å¦æä½ æ¯ä¸ä¸ªæ³ä»äºè¿æ¹é¢å·¥ä½ç人ï¼å°¤å ¶æ¯ä»äºå¼ååæ¶æçææ¯äººåï¼é£ä¹éè¦çææ¯ç¥è¯å°±ç¸å½çå¤äºï¼æ æ³ä¸ä¸å举ï¼å¤§æ¦ä¸ä¸ªé«çº§ç½ç»å¼åå·¥ç¨å¸åä¸çº§ä»¥ä¸çæ¶æå¸æ°´å¹³ï¼æ¯éè¦çã
åè¨
å¾å¤æ°çæ¦å¿µï¼äººä»¬å¨åæ¥è§¦çæ¶åï¼ä¼è®©äººæå°é叏尿ï¼å¦äºå¥½å¤æ¬¡é½ç¨éç³æ¶ï¼å¹¶ä¸ä» ä» æ¯ææ¯ï¼å¾å¤å°æ¹é½æ¯å¦æ¤ãå¯¹äºæ¯è¾é¾çè§£çæ¦å¿µï¼ç¨ä»ä¹åæ³å»å¦ä¹ æé«æå¢ï¼æä¸ç´è®¤ä¸ºï¼å°±æ¯æ¾ä¸ä¸ªä¾åï¼æè åä¸ä¸ªDemoï¼ä¸ä¸æ é¾äºï¼forä¸ä¸ªexampleå³å¯ããã
æè¿ä¸æ®µæ¶é´ï¼AI人工æºè½æ¹å ´æªè¾ï¼åºå龿æ¯åè¿é¢èµ°æ¥ï¼å¯¹æ°åè´§å¸çå´èµ·æå°æ°å¥çæä»¬ï¼ä¼°è®¡å¾æ³ç¥éå ¶èåçææ¯--åºå龿¯ææ ·çä¸ä¸ªä¸è¥¿ã使¯å®å ¨ææåºåé¾å¹¶éæäºï¼å¨å®è·µä¸å¦ä¹ æ¹ä¸ºä¸çã
æå欢æç¨åºå½æè¯ææ¥åï¼çæå½ç¶è¦éè¿åä»£ç æ¥å®ç°å¹¶è¿è¡ä¸ä¸ªä¾åï¼æ¥ç解并å¦ä¹ è¿é¨ææ¯ãè¿éï¼å°±éè¿ç¨JAVAè¯è¨å®ç°åæå»ºä¸ä¸ªåºå龿¥æ¢è®¨å¯¹åºåé¾ççè§£ã
æ¬æï¼æä»¬è¦ç¨åºå龿¥å®ç°è¿ä¹ä¸ä¸ªä¾åï¼ååå«âåºåé¾æè¯æ¥é¾âãç¨æ·éè¿è¿ä¸ªä¾åï¼å¯ä»¥ä¸æçæ¥é¾åé¢ä¸ä¸ªç¨æ·çæè¯ï¼è§å忮鿏¸æä¸æ ·ï¼åé¢ä¸ä¸ªç¨æ·çæè¯çæåä¸ä¸ªåï¼ä½ä¸ºåé¢ä¸ä¸ªæè¯ç第ä¸ä¸ªåã
ååä½ä¸ºä¸ä¸ªåºç¨ï¼è¿ä¸ªå¾ç®ååï¼é®é¢æ¯ï¼æä»¬è¦ç¨åºåé¾çåçåç¸å ³ææ¯å®ç°å®ã
OKï¼letâs go⦠â¦
åå¤å·¥ä½
è¿ä¸ªæ¶åå ¶å®æå¾æ³å¤§åä¸å£°ï¼âåºåé¾âå ¶å®ä¸æ¯æä¸ç§åçº¯çææ¯ï¼èæ¯åºäºæä¸ç§ææ³çå¤ç§ææ¯çç»åã
éè¦çææ¯å æ¬åå¸å¼åå¨ï¼åå¸å¼è®¡ç®ï¼P2Pæ°æ®åæ¥ï¼å å¯è§£å¯ï¼å®å ¨ä¼ è¾ï¼ä¸äºè¯è¨ï¼ä¸äºå¼åå·¥å ·ãããè¿æä¸äºæ°åçæ¦å¿µ â åå¸å¼èç¹ï¼å·¥ä½éè¯æï¼å ±è¯ç®æ³ãããçç
åºäºåªä¸ç§ææ³å¢ï¼å¤§å®¶é½è¯´æ¯âå»ä¸å¿åâï¼æè§å¾å°±æ¯âååæââåãããâï¼ææè¯é¢ï¼ä¸å±å¼äºã使¯æäºå®ä¸æ¯ä¸ä¸ªå欢æ°ä¸»çäººï¼æä»¥åºåé¾çâå»ä¸å¿åâ对æå¸å¼åé¢å¤§ãããall men are created equalâ¦J
æ¬æé颿¶åå°çä¸äºä¾åï¼æ¥æºæ¯ç½ä¸ï¼æäºæ¯Pythonçæ¬ï¼æäºæ¯Javaçæ¬ï¼Cçæ¬ï¼èèå°JAVAæ´ä¸ºéç¨åæè¯»åï¼å ¶å®ææ¯è®¤ä¸ºJAVAè¯è¨æ´åè¯æäºï¼ï¼å°±æä»ä»¬æ¹æäºJAVAçï¼æä»¥è¦æ±è¯»è å¯¹è¯æ..å¦ï¼ä¸æ¯ï¼æ¯å¯¹JAVAé常äºè§£ï¼è½è¯»ååºæ¬çè¯æ³æ¡æ¶åé»è¾ï¼å¹¶ä¸å 为è¿ä¸ªDEMOçç¹æ®æ§ï¼éè¦å¯¹ç½ç»æ¡æ¶åHTTPè¯·æ±æåºæ¬çäºè§£ã
æä»¬ç¥éåºå龿¯æ°æ®ååé¾çå卿¹å¼çç»åï¼æ¯ç±Nå¤ä¸ªæ°æ®åºåæç §é¾çç»ç»åè®°å½ææçä¸å¯åãæåºçé¾ç»æï¼è®°å½å¯ä»¥æ¯äº¤æãæä»¶æä»»ä½ä½ æ³è¦çæ°æ®ï¼åæ¶å®ä»¬æ¯éè¿åå¸å¼ï¼hashesï¼é¾æ¥èµ·æ¥çãæä»¥ï¼å¨é è¯»æ¬æä¹åï¼ä¸å®è¦é 读å ç¯å ³äºåºåé¾çæç« ï¼äºè§£éé¢åï¼é¾ï¼æ°æ®ï¼å·¥ä½éè¯æççæ¦å¿µï¼æå¥½ä¹äºè§£ä¸äºç¸å ³ææ¯æ¯å¦Hashï¼åå¸å¼åå¨çççæ¦å¿µãå¦æä½ è¿ä¸æ¯å¾äºè§£è¿äºï¼è¯·æ¾åº¦å¨ã
妿å¨äºè§£è¿äºæ¦å¿µçè¿ç¨ä¸ï¼ä¸ä¸å°å¿æ¥è§¦å°äºæ¯ç¹å¸ï¼è¯·ä¸å®è¦æç½ï¼æ¯ç¹å¸åªæ¯åºå龿æ¯çä¸ä¸ªäº§åå®ç°ãå¦æè¿æ¥è§¦å°å ¶å®ä¸äºè¯¸å¦ä»¥å¤ªç½çççåè¯ï¼é£ä¹éè¦ç¥éï¼è¿äºé½æ¯åºå龿æ¯ä¸å®ç°çä¸äºæ¡æ¶å产åã
ç¯å¢åå¤
çè®ºä¸æ¥è¯´ï¼å¯ä»¥ç¨ä»»ä½ä¸ç§è¯è¨æ¥å建任ä½ä¸ç§ææ¯çä¾åï¼å æ¬åºåé¾çä¾åï¼æä»¬è¿ééç¨äºJAVAï¼æä»¥è¦å¨èªå·±ççµèä¸ï¼åå¤JAVAçç¸å ³å¼åç¯å¢ã
ç¡®ä¿ä½ ççµèä¸å·²ç»å®è£ äºè¾æ°çæ¬çJDKï¼Tomcatåæä¸ç§ä½ çæçæå¥½è½æ´åTomcatçJAVA IDEï¼æ¬ä¾ç¨çæ¯EclipseãTomcat卿们è¿ä¸ªä¾åä¸é´ï¼æ¯ä¸ä¸ªWEBå·¥å ·ï¼å 为æä»¬ç项ç®ï¼éè¦åºäºWEB HTTP åå¸åè¿è¡ã
å¦ä½å®è£ Javaååç§å·¥å ·ï¼å æ¬å¦ä½ç¨Eclipseå建Dynamic web项ç®å¹¶åå¸å°Tomcatççæ¥éª¤ï¼æ¢ç¶ä½ å·²ç»å¦æ¤çæJAVAäºï¼è¿éå°±ä¸åå¤è®²ã
å¼å§å建åºåé¾
åºåæç§°æ°æ®åBlockç±»
åºåé¾ä¸æ¯ä¸ªåºåå å«ä»¥ä¸åºæ¬å 容ï¼ç´¢å¼ï¼indexï¼ï¼Unixæ¶é´æ³ï¼timestampï¼ï¼æ°æ®å(data)ï¼å æ¬äº¤æï¼æåï¼ç³æï¼å¥å±çä»»ä½ååéçå 容ï¼ï¼è¯ææå·¥ä½éè¯æï¼proofç¨åè§£éï¼ä»¥ååä¸ä¸ªåºåçHashå¼ï¼Hash ç¨æ¥é¾æ¥æ°æ®åï¼åæ¶ç¡®ä¿æ°æ®åä¸è¢«éæ³ä¿®æ¹ã
以䏿¯ä¸ä¸ªåºåçç»æï¼
public class Block {
int iIndex; //ç´¢å¼
String sProof; //å·¥ä½éè¯æï¼å¨è¿ä¸ªä¾åéé¢ï¼å ¶å®å°±æ¯ä¸ä¸ªç»è¿éªè¯çæ£ç¡®çæè¯
String sPreviousHash; //åä¸ä¸ªåºåçHashå¼
Timestamp tsCreateTime; //åºåå建æ¶é´æ³
/*æ°æ®å
*
* ç¨æ·æ¯æ¥ä¸ä¸ä¸ªæè¯ï¼ä¼å¾å°ç³»ç»10å é±çå¥å±ï¼åæ¶ä¼èµ¢å¾åé¢ä¸ä¸ªç¨æ·ç2å é±
* æ°æ®åºåæ¶éè¦è®°å½èªå·±çç¨æ·åååçåºä¸ä¸ä¸ªæè¯çç¨æ·å
*
* */
String sSender; //åçåºä¸ä¸ä¸ªæè¯çç¨æ·å
String sRecipient; //åçåºå½åè¿ä¸ªæè¯çç¨æ·å
final int iMoneyAward=10; //ç³»ç»å¥å±ï¼æ°é¢åºå®
final int iMoneyWin=2; //èµ¢åå¥å±ï¼æ°é¢åºå®
public Block(){
}
}
åºåé¾å®ç°Blockchainç±»
import java.util.*;
import blockchain.Block;
public class BlockChain {
//ç¨æ¥åå¨åºå
private List<Block> lBlockchain=new ArrayList<>[];
public BlockChain(){
}
//å建æ°å
public Block NewBlock(){
Block bRet=null;
//å¨è¿éå建ä¸ä¸ªæ°å
return bRet;
}
//Hash ä¸ä¸ªå
public String Hash(Block block){
String sHash=null;
//å¨è¿éHash ä¸ä¸ªå
return sHash;
}
//å ¶ä»æ¹æ³
//....
}
Blockchainç±»ç¨æ¥ç®¡ç龿¡ï¼å®è½åå¨åæ´æ°é¾æ°æ®ï¼å å ¥æ°åççï¼ä¸é¢æä»¬æ¥è¿ä¸æ¥å¢å åå®åéé¢çä¸äºæ¹æ³
å建æ°åååä¸å
å½ä¸ä¸ªç¨æ·æç §æè¯æ¥é¾çè§åï¼å¯¹ä¸ä¸ä¸ä¸ªæè¯ï¼å¹¶ä¸ç³»ç»éªè¯è¿æè¯æ£ç¡®ï¼å·¥ä½éè¢«è¯æï¼ãè¿ä¸ªæ¶åæä»¬å°±å¯ä»¥å建ä¸ä¸ªæ°åï¼å¹¶ä¸å å°é¾éé¢ã
䏿¦å·¥ä½éè¯æç¡®è®¤ï¼å¹¶ä¸ä¸ä¸ä¸ªåhash çæåï¼å°±å¯ä»¥ç®åè°ç¨å½æ°å建ä¸ä¸ªæ°åäºã
å建æ°åæ¹æ³å¦ä¸ï¼
//å建æ°å
public Block NewBlock(int i,String proof,String hash,Timestamp c,String sender,String recipient){
Block bRet=null;
//å¨è¿éå建ä¸ä¸ªæ°å
bRet = new Block(i,proof,hash,c,sender,recipient);
return bRet;
}
è¿éï¼æä»¬éè¦æä¸ä¸åä¸åçæ¦å¿µï¼åä¸åæ¯åºåé¾ç第ä¸ä¸ªåºåï¼å®æ¯æ²¡æååºåçãé»è¾ä¸åªå¨ç¬¬ä¸ä¸ªç¨æ·ç¬¬ä¸æ¬¡å¯å¨ç³»ç»çæ¶åï¼æéè¦å建åä¸åï¼åé¢ç齿¯éè¿åæ¥è·å¾ãåä¸åç´¢å¼æ¯0ï¼åæ ·éè¦ç»å®å ä¸ä¸ä¸ªå·¥ä½éè¯æï¼æä»¬è¿éå°±æ¯åå§æè¯âæµ·é天空âï¼å 为没æåé¢çåï¼æä»¥hash=ââï¼åæ¶ç»ä¸ä¸ªåºå®çå建æ¶é´ãæ¹æ³å¦ä¸ï¼
//åå§åçå建ï¼åä¸åæ¯ä¸ä¸ªåï¼å¿ é¡»æ¯åºå®çä¿¡æ¯
//é»è¾ä¸æ¥è¯´ï¼åªæå¨åºåé¾äº§åç第ä¸ä¸ªç¨æ·ç¬¬ä¸æ¬¡å¯å¨çæ¶åï¼æä¼éè¦å建åä¸å
public Block CreateFirstBlock(){
try{
Timestamp t=new Timestamp((new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse("2018-01-01 01:01:01").getTime());
return NewBlock(0,"æµ·é天空","",t,"","");
}catch(Exception e){
return null;
}
}
è¿é顺便贴ä¸çæåçHashåç¬¦ä¸²çæ¹æ³ï¼
//Hash ä¸ä¸ªå
public static String Hash(Block block){
String sHash=null;
//å¨è¿éHash ä¸ä¸ªå
String s=block.sPreviousHash+block.sProof+block.sRecipient+block.sSender+block.tsCreateTime.toString();
sHash = MD5(s);
return sHash;
}
public static String MD5(String key) {
char hexDigits[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
try {
byte[] btInput = key.getBytes();
// è·å¾MD5æè¦ç®æ³ç MessageDigest 对象
java.security.MessageDigest mdInst = java.security.MessageDigest.getInstance("MD5");
// ä½¿ç¨æå®çåèæ´æ°æè¦
mdInst.update(btInput);
// è·å¾å¯æ
byte[] md = mdInst.digest();
// æå¯æè½¬æ¢æåå è¿å¶çå符串形å¼
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
ç解工ä½éè¯æ
æ°çåºåçæï¼å¿ é¡»ä¾èµå·¥ä½éè¯æç®æ³ï¼PoWï¼æ¥æé ã
PoWçç®æ æ¯æ¾åºä¸ä¸ªè½è¢«å ¬è®¤çæ¹æ³ï¼æ¥è¯æä½ æä»äºå·¥ä½çæ£ç¡®æ§ã
å¨å½ååºåé¾åºç¨ä¸ï¼PoWç»å¸¸æ¯è¢«è®¾è®¡æéè¿å¯»æ¾æä¸ä¸ªç¬¦åç¹å®æ¡ä»¶çæ°åæ¥è¯æï¼è¿ä¸ªæ°åå¯è½å¾é¾è®¡ç®åºæ¥ï¼ä½å¾å®¹æéªè¯ã
è¿å°±æ¯å·¥ä½éè¯æçæ ¸å¿ææ³ã
ä¸ºäºæ¹ä¾¿çè§£ï¼ä¸¾ä¸ªä¾åï¼
å设ä¸ä¸ªæ´æ° x ä¹ä»¥å¦ä¸ä¸ªæ´æ° y ç积ç Hash å¼å¿ é¡»ä»¥ä¸¤ä¸ªé¶ â00â ç»å°¾ï¼å³ hash(x * y) = xxxxxx...00ã设åé x = 5ï¼æ± y çå¼ï¼
ç¨Javaå®ç°å¦ä¸ï¼
int x=5;
int y=0;
while(true){
String md5=BlockChain.MD5(""+(x*y));
if(md5.charAt(md5.length()-1)=='0'){
break;
}
y+=1;
}
æåå¾åº y=69
å 为MD5(5*69)=D81F9C1BE2E08964BF9F24B15F0E4900
éçåºåé¾åºç¨çæ©å±ï¼åºè¯¥ææ´å¤åççå·¥ä½éè¯æç®æ³ã
卿¯ç¹å¸ä¸ï¼ä½¿ç¨ç§°ä¸ºHashcashçå·¥ä½éè¯æç®æ³ï¼å®åä¸é¢çé®é¢å¾ç±»ä¼¼ãç¿å·¥ä»¬ä¸ºäºäºå¤ºå建åºåçæå©èäºç¸è®¡ç®ç»æï¼çè³å¨ç¨Nå°çµèï¼è¿å°±æ¯ç§°ä¹ä¸ºæç¿ãé常ï¼è®¡ç®é¾åº¦ä¸ç®æ å符串éè¦æ»¡è¶³çç¹å®åç¬¦çæ°éææ£æ¯ï¼ç¿å·¥ç®åºç»æåï¼ä¼è·å¾æ¯ç¹å¸å¥å±ãå½ç¶ï¼ä¸æ¦è®¡ç®åºæ¥ï¼ä¼é常容æéªè¯è¿ä¸ªç»æã
å®ç°æä»¬çå·¥ä½éè¯æ
æä»¬çå·¥ä½éè¯æï¼é£å°±æ¯è¾ç®åï¼å½ç¨æ·è¾å ¥ä¸ä¸ä¸ªæè¯çæ¶åï¼æä»¬æå¼æè¯è¯å ¸æè ç¾åº¦ï¼ä¸æ¥ããããå°±å¯ä»¥ç¥é宿¥çå¯¹è¿æ¯éäºã
ä»ç³»ç»ä¸æ¥è¯´ï¼æä»¬å¯ä»¥éè¿è°ç¨å¤é¨å¼åæ¥è¯¢æ¥å£ï¼æè èªå¸¦æè¯è¯åºï¼æ¥å®ç°è¿ä¸ªå·¥ä½éè¯æï¼ä»£ç å¦ä¸ï¼æ¤å¤å¼ç¨äºä¸ä¸ªå¤é¨æè¯ç宿§æ¥è¯¢æ¥å£ï¼ï¼
//éªè¯å½åçæè¯æ¯å¦ç¬¦åè§å
//pre åä¸ä¸ªæè¯
//cur è¿ä¸ä¸ªæè¯
public static boolean ValidProof(String pre,String cur){
//éªè¯è¿ä¸ªæè¯ç头ä¸ä¸ªåæ¯ä¸æ¯ä¸ä¸ä¸ªæè¯çæåä¸ä¸ªå
if(cur.charAt(0)!=pre.charAt(pre.length()-1)){
return false;
}
//éªè¯æ¯å¦æ¯æè¯
//http://chengyu.t086.com/chaxun.php?q=%B9%E2%C3%F7%D5%FD%B4%F3&t=ChengYu
String content=httpRequest("http://chengyu.t086.com/chaxun.php?q="+cur+"&t=ChengYu");
if(content.indexOf("æ²¡ææ¾å°ä¸æ¨æç´¢ç¸å ³çæè¯")!=-1 || content.indexOf("æç´¢è¯å¤ªé¿")!=-1){
return false;
}
return true;
}
å°ç»ï¼éè¿ä¸é¢çè®²è§£ï¼æè¿°äºåºå龿¶åå°çä¸äºæ°æ¦å¿µï¼åºåï¼åä¸åï¼é¾å¼åå¨ï¼å·¥ä½éè¯æï¼ä¸»æ°æ®å½¢å¼åå 容ï¼Hashå å¯ççãåæ¶æä»¬éè¿âæè¯æ¥é¾âçä¾åï¼å¨ä¾åä¸ç¨Javaæé äºç¸å ³çç±»åæ¹æ³ã
å ·å¤äºåºåé¾é¡¹ç®çåºç¡ç»ä»¶åï¼ä¸ä¸æ¥å°±æ¯å°è¿äºç»ä»¶è¿è¡èµ·æ¥ï¼æé ä¸ä¸ªå¯ä»¥çæ£è¿è¡èµ·æ¥çåºåé¾é¡¹ç®ã
å¯å¨ä¸ä¸ªBlockchain项ç®
æä»¬é½ç¥éï¼åºå龿¯ä¸ä¸ªåå¸å¼åå¨ååå¸å¼è®¡ç®äºç¸ç»åçææ¯åäº§åæ¡æ¶ãå ¶æ ¸å¿æ¯å»ä¸å¿ååå¨ãè¿ä¸ªæå³çï¼ææåºåé¾çæ°æ®é½åºè¯¥åå¨å¨ç¨æ·æ¬å°è䏿¯æä¸ªä¸å¿æå¡å¨ãæä»¥ï¼ä¸ä¸ªçæ£çåºåé¾äº§åï¼éè¦å¨æ²¡æä¸å¿æå¡å¨æ¯ææ åµä¸ï¼è§£å³å¦ä¸å ä¸ªåºæ¬çé®é¢ï¼
1ã æ¯ä¸ªç¨æ·ç«¯å¯å¨åºåé¾äº§åæ¶ï¼å¦ä½å°åºåæ°æ®çåå§ä¸è½½å°æ¬å°ï¼
2ã æ°å¢å åºåæ¶ï¼åºåé¾å å®¹çæ´æ°åå¸ä»¥åä¸åç¨æ·æ°å¢åºåæ¶é´å²çªçå¤çï¼
3ã æ¥å¸¸è¿è¡è¿ç¨ä¸å¦ä½ä¿è¯æ¯ä¸ªç¨æ·ç«¯ï¼èç¹ï¼æ°æ®çææ°å忶忥ï¼
å建èç¹
åºåé¾é¡¹ç®ä¸ï¼ä¸ä¸ªæ£å¨è¿è¡çåºåé¾é¡¹ç®çç¨æ·ç»ç«¯ï¼ç§°ä¸ºä¸ä¸ªèç¹ã
æ¯ä¸ªç¨æ·ç¬¬ä¸æ¬¡å¯å¨æä¸ªåºåé¾é¡¹ç®ï¼å°±ç¸å½äºå建äºä¸ä¸ªèç¹ãèä»¥åæ¯æ¬¡å¯å¨é¡¹ç®ï¼é½æå³çå¯å¨äºè¿ä¸ªèç¹ã
为ä»ä¹è¯´æ¯å建ä¸ä¸ªèç¹ï¼åå å¾ç®åï¼åºåé¾çåºæ¬ææ³æ¯å»ä¸å¿åï¼å»ä¸å¿åçæ¢ä¸ç§è¯´æ³ï¼ä¸é´ä»»ä½ä¸ä¸ªç»ç«¯ï¼é½å¯ä»¥æ¯ä¸å¿ï¼åèªæ¯å¯¹ççç»ç½æ¨¡åï¼ä¹å°±æ¯P2Pç»ç½æ¨¡åãå 为任ä½å¯å¨çç»ç«¯ï¼é¤äºéè¦å®ææ°æ®ä¸è½½ï¼ä½¿ç¨ï¼è¿ç®ä¹å¤ï¼è¿éè¦å®æå¯¹å¤æä¾æ°æ®ï¼åæ¥ï¼éªè¯ççåè½ã
åºåé¾ç½ç»ç³»ç»ä¹æä»¥éæ©P2Pä½ä¸ºå ¶ç»ç½æ¨¡åï¼è¿æ¯ç±äºäºè ææ³çå¥å度确å®çï¼åºåé¾çæ ¹æ¬åºåç¹ä¹ä¸æ¯å»ä¸å¿åï¼ä¸æ¬èªå¨ä»çç½ç®ä¹¦éï¼æå°çµåç°éç³»ç»ä¸ï¼ç¬¬ä¸æ¹ç³»ç»æ¯å¤ä½çï¼æ²¡æä»·å¼ï¼ææå°±æ¯æ´ä¸ªç³»ç»ä¸è¦ä¾èµä»»ä½ç¹æ®çç¬¬ä¸æ¹æ¥å®æèªèº«ç³»ç»çè¿è½¬ï¼èP2Pç½ç»ç天ç¶å±æ§ï¼å°±æ¯å ¨ç½èç¹å¹³çï¼æ ç¹æ®èç¹ï¼ç±äºåºåé¾å对çç½ç»çå»ºè®¾ææ³ï¼é«åº¦å¥åï¼åå ä¸P2Pç½ç»å·²ç»æ¯ä¸ä¸ªå屿ççç½ç»ææ¯ï¼äºè èµ°å°ä¸èµ·ï¼å 乿¯ä¸ç§å¿ ç¶ã
æä»¥æä»¬å¨è¿ä¸ªä¾åéé¢å¼å ¥Tomcatï¼ä¸æ¹é¢æ¯ä¸ºäºå°ä¸äºç¨æ·æä½è½¬æ¢å°æµè§å¨ï¼æ¼ç¤ºæ¹ä¾¿ï¼å¦å¤ä¸æ¹é¢ï¼æ¯ä¸ºäºæ¹ä¾¿åå¸ä¸äºå¯¹å¤æ¥å£ï¼ç¨æ¥æ¨¡æå¨P2P对çç½ç»ä¹é´æ°æ®åæ¥ã
é¦å æä»¬ä½¿ç¨Eclipse建ç«ä¸ä¸ªå¨æWEB 项ç®ï¼å°ä¸é¢ç¸å ³ç±»å¯¼å ¥ï¼åæ¶æ°å»ºä¸ä¸ªç±»ä¼¼ä¸é¢ç index.jsp 欢è¿é¡µé¢
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>åºå龿µè¯</title>
</head>
<body>
<% java.util.Date d = new java.util.Date(); %>
<h1>
欢è¿ä½¿ç¨åºåé¾æè¯æ¥é¾ã <br>
</h1>
åºåæ°æ®åæ¥ä¸ï¼è¯·ç¨çããã<br>
<%= d.toString() %> !
</body>
</html>
åå¸é¡¹ç®å°ä½ å®è£ çTomcatï¼å¯å¨Tomcatï¼è¾å ¥å¦ä¸å°åï¼å½çå°å¦ä¸å¾æç¤ºé¡µé¢ï¼å³å建åºåé¾é¡¹ç®âæè¯æ¥é¾âçèç¹åå¤å·¥ä½å·²ç»å®æã
å¯å¨åºåé¾åºç¨ï¼å建èç¹ï¼å æ¬ä»¥åæ¯æ¬¡å¯å¨åºç¨ï¼é½éè¦å®æç第ä¸ä¸ªå·¥ä½ï¼æ¯åæ¥åºå龿°æ®å°æ¬å°æè æ´æ°æ¬å°åºåæ°æ®ã碰å°ç第ä¸ä¸ªé®é¢æ¯ï¼ææä¹ç¥éå°åªéå»åæ¥æ°æ®å¢ï¼æè 说ææä¹ç¥éå ¶å®å¯ä»¥åæ¥æ°æ®çèç¹çå°åå¢ï¼
æ¾éç¾åº¦ï¼å¾å¤é½è¯´ç徿¨¡ç³ï¼å¤§è´æ¯éè¦ node-seed ä¹å°±æ¯ç§åèç¹æ¯æï¼æåæ¾å°äºåºåé¾å¸ç¥æ¯ç¹å¸çå¼åè ç䏿®µè¯´æå¦ä¸ï¼
ç¿»è¯æä¸æï¼ç®èè¨ä¹å°±æ¯å¨ä»£ç éé¢åæ»äºä¸ä¸ªååæ°ç»åIPå°åæ°ç»ï¼ç¨åºå¯å¨çæ¶åå°±å»è¿è¿äºåååIPã
å½ç¶ï¼è§å¾è¿ç§æ¹æ³å¯ä»¥è§£å³é®é¢ï¼ä½æ¯ï¼è¿æå¤æå°ä½¿å¾âå»ä¸å¿åâèä¸äºä¸å±æ·¡æ·¡çé´å½±ã
é£ä¹æ ¹æ®æè¿ä¸ªä¾åçæ¨¡æç¯å¢ï¼æå°±æå ¬å¸å±åç½å¯è½çIPé½ hard-code å¨ç¨åºéï¼éä¸ªæ«ææ¥æ¾æé¿é¾ï¼ä½ä¸ºä¸è½½åºå龿°æ®çæ«æå°åå§ãä¸é¢æ¯Java代ç ï¼
static final String sIPPre="10.70.5.";
//对å±åç½å ççµèè¿è¡æ«æï¼æ¾å°æé¿çé¾ï¼ä¸è½½å°æ¬å°
static final String sDataFileDir="c://blockchain"; //æ¬å°åå¨è·¯å¾
//ä»ç½ç»è¯»ååºå龿°æ®å°æ¬å°æä»¶
public static void DowloadData(){
//æ£æ¥æ°æ®æä»¶ç®å½ï¼ä¸åå¨å°±å建
File dirFile = new File(sDataFileDir);
boolean bFile = dirFile.exists();
if(!bFile ){
bFile = dirFile.mkdir();
//徿°åå»ºçæ¬å°æä»¶éé¢åä¸ä¸ªåä¸å
try{
FileOutputStream out = new FileOutputStream(new File(dirFile+"//data.txt"));
out.write((BlockChain.CreateFirstBlock().toInfoString()+"\r\n").getBytes());
out.close();
}catch(Exception e){
}
}
//æ«æå¨è¾¹çèç¹ï¼æ¾å°æé¿çé¾ï¼ä¸è½½å°æ¬å°
int iLastLen=0;
String sLastChain="";
for(int i=0;i<255;i+=1){
String sThisURL="http://"+sIPPre+i+":8080/blockchain/chain.jsp";
System.out.println(sThisURL);
String sChain=httpRequest(sThisURL);
if(sChain!=""){
System.out.println(sChain);
String sTemp[]=sChain.split("##");
if(sTemp.length>iLastLen){
iLastLen=sTemp.length;
sLastChain=sChain;
}
}
}
try{
if(sLastChain!=""){
FileOutputStream out = new FileOutputStream(new File(dirFile+"//data.txt"));
//System.out.println("before:"+sLastChain);
sLastChain=sLastChain.replace("##", "\r\n");
//System.out.println("after:"+sLastChain);
out.write((sLastChain+"\r\n").getBytes());
out.close();
}
}catch(Exception e){
}
}
DowloadDataï¼ï¼è¿ä¸ªæ¹æ³ï¼åºè¯¥å¨åºç¨å¯å¨çæ¶å被è°ç¨ãä¹å¯è½å¨åºç¨æ§è¡è¿ç¨ä¸ï¼åå°é´éæ§è¢«è°ç¨ã
ä½ å¯è½é©¬ä¸ä¼åç°ï¼å¤äºä¸ä¸ªå¤é¨æ¥å£ï¼
http://"+IP+":8080/blockchain/chain.jsp
è¿ä¸ªæ¥å£æ¯æ¯ä¸ªèç¹é½éè¦å®ç°çï¼ç¨æ¥è¾åºèªå·±èç¹ææ°çåºå龿°æ®ï¼å¨å¹³æ¶å个èç¹å½¼æ¤äºç¸è°ç¨ï¼åå§åå忥åºå龿°æ®ã卿¬ä¾ä¸ï¼ç®åå®ç°æ¹æ³å¦ä¸ï¼
建ç«ä¸ä¸ª chain.jsp 页é¢ï¼æ¾å°Tomcat è·¯å¾ä¸ï¼è´´ä¸éé¢ä¸»è¦ä»£ç
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%><%
//java.util.Date d = new java.util.Date();
blockchain.BlockChain.LoadData();
%>
<%= blockchain.BlockChain.StringBlockchain() %>
ç¨æ·æä¹æç¿
å°äºè¿ä¸æ¥ï¼å¯ä»¥ææä»¬ä¾åç¨åºç¨å¾®å®åä¸ä¸ï¼ä¸ºåé¢çâæç¿âæ¦å¿µååå¤ã
å®ååç产åçé¢å¦ä¸
å¯å¨åºç¨ï¼é¦å æ¯ä¸ä¸ªæ°æ®åæ¥ç欢è¿é¡µé¢ãæ¤é¡µé¢ç¨ajaxæ¹å¼å®ç°åå°æ°æ®åæ¥ã
忥宿åï¼è¾å ¥ææºå·ç ï¼è¿å ¥ä¸ä¸ä¸ªé¡µé¢ã
注æé¡µé¢ä¸æ¹ï¼å¢å äºä¸ä¸ªèªå¨æ´æ°åºåé¾åè½ï¼ä¹éè¿ajaxå®ç°ã
æè°âæç¿âåâç¿å·¥âï¼åªä¸è¿æ¯åç¨äºæ¯ç¹å¸éé¢çç¸å ³è¯´æ³ãâç¿å·¥âå°±æ¯ç¨æ·äºï¼âæç¿âå°±æ¯ç¨æ·å¨è¿ä¸ªåºåé¾åºç¨ä¸é¢åçäºæ ï¼ä¸è¬å¸¦æä¸å®çä»·å¼åç®çï¼ç®åå¾å¤åºåé¾åºç¨ï¼âæç¿âå°±æ¯å®ææä¸ªå·¥ä½ï¼è·å¾ç³»ç»ä¸äºå¥å±ã
卿们è¿ä¸ªæ¼ç¤ºåºç¨éé¢ï¼æç¿å°±æ¯ç¨æ·æ ¹æ®ä¸ä¸ä¸ªæè¯ï¼éµå®æè¯æ¥é¾çè§åï¼æ³åºå¹¶è¾å ¥ä¸ä¸ä¸ªæè¯ï¼ç³»ç»éªè¯æ 误ï¼å°±ä¼ä¸ºä½ å¨åºåé¾å¢å 䏿¡è®°å½ï¼åæ¶æå¥å±ä¹ç»ä½ è®°å½ã
å ¶å®æåååå¾é£ä¹ç¥å¥ï¼äºå®å´å¾ç®åï¼ç³»ç»å°±æ¯åäºä»¥ä¸ä¸ä»¶äºï¼
1ã计ç®å·¥ä½éè¯æPoWï¼éªè¯ç¨æ·é交çå·¥ä½ï¼
2ã对äºâæç¿âæåçç¨æ·ï¼éè¿æ°å¢ä¸ä¸ªåºåæäºç¿å·¥å³ç¨æ·ä¸äºåæ°æè èæå¸å¥å±ï¼
3ãæé æ°åºåå¹¶å°å ¶æ·»å å°é¾ä¸ï¼åæ¥å°æ¯ä¸ªèç¹ã
代ç å¦ä¸:
if(request.getParameter("answer")!=null){ //读åå°ç¨æ·çè¾å ¥
//å è½½åºå龿°æ®
blockchain.BlockChain.LoadData();
//è·ååºåé¾ä¸æåä¸ä¸ªæè¯
String sPre=blockchain.BlockChain.lBlockchain.get(blockchain.BlockChain.lBlockchain.size()-1).sProof;
//ç¨æ·è¾å ¥çæè¯
String sCur=new String(request.getParameter("answer").getBytes("ISO8859-1"),"gb2312");
//夿æ¯ä¸æ¯æ£ç¡®çæ¡ï¼å¦ææ¯ï¼å°±è¦å建æ°åå¹¶æ·»å å°åºåé¾ä¸
if(blockchain.BlockChain.ValidProof(sPre,sCur)){
blockchain.Block bPre=blockchain.BlockChain.lBlockchain.get(blockchain.BlockChain.lBlockchain.size()-1);
//è·ååä¸ä¸ªåçHash
String sHash=blockchain.BlockChain.Hash(bPre);
//å建æ°å
blockchain.Block bCur=blockchain.BlockChain.NewBlock(bPre.iIndex+1, sCur, sHash,new java.sql.Timestamp(System.currentTimeMillis()), bPre.sRecipient, (String)session.getAttribute("mobile"));
//å å ¥åºåé¾å¹¶ä¿åå°æ¬å°æä»¶
blockchain.BlockChain.lBlockchain.add(bCur);
blockchain.BlockChain.WriteData();
ããã
}else{
ãããã
}
}
ä¸é¢æ¯ç»è¿å 个æ¥é¾åç页é¢ï¼
è¿æ¯å¯ä»¥æå¼æ¬å°åºå龿°æ®æä»¶ âc:/blockchain/data.txtâå¯ä»¥çå°å¦ä¸å 容ï¼ä¸ºäºæ¥çç®åï¼æ°æ®æä»¶ç¨æætxtåå¨ã
å ¶ä¸ç¬¬ä¸æ¡ï¼æ¯åä¸åçæ°æ®ï¼å¨åºåé¾ä¸ï¼å®æ¯æ ¹åºåã
å¨å®é 项ç®ä¸ï¼æ°æ®æä»¶ä¸è¬é½ä¼ä»¥æç§è¾å¤æçæ¹å¼åå¨ï¼æ¯å¦éç¨æç§å 坿¹å¼ã
èç¹æ°æ®ä¸è´æ§ï¼å ±è¯ç®æ³/ä¸è´æ§ç®æ³ï¼
å°ç®åä¸ºæ¢æä»¬å·²ç»æäºä¸ä¸ªåºæ¬çåºåé¾äº§ååçé¢ï¼å¹¶ä¸å¯ä»¥åç®åçâæç¿âï¼å¨åºç¨å¯å¨çæ¶åï¼æä»¬ä¹çå°äºç¬¬ä¸æ¬¡æ°æ®åæ¥åå颿¯é䏿®µæ¶é´æ°æ®åæ¥çå®ç°æ¹æ³ï¼å¨ä¸ä¸ªèç¹ä¸è¿è¡æ²¡æé®é¢ã
使¯ï¼åºåé¾ç³»ç»åºè¯¥æ¯åå¸å¼çãæ¢ç¶æ¯åå¸å¼çï¼é£ä¹æä»¬å°±éè¦èèç©¶ç«æ¿ä»ä¹ä¿è¯ææèç¹æåæ ·çé¾å¢ï¼è¿å°±æ¯ä¸è´æ§é®é¢ï¼æä»¬è¦æ³å¨ç½ç»ä¸æå¾å¤ä¸ªèç¹å¹¶ä¸ä»ä»¬çæ°æ®ä¿æä¸è´ï¼é£å°±å¿ é¡»å®ç°ä¸ä¸ªä¸è´æ§çç®æ³ã
å®ç°å ±è¯ç®æ³ï¼ä¸è´æ§ç®æ³ï¼
å个èç¹åå¸å¨ä¸åçè®¡ç®æºæææºççç»ç«¯ï¼åèªå·¥ä½ï¼å¿ ç¶æä¸äºå²çªäº§çãå²çªç产çï¼ä¸»è¦æ¥èªä¸¤æ¹é¢ï¼ä¸æ¯é¾é¿çä¸ä¸è´ï¼äºæ¯é¾ååç产çã
ç¨æ¬ä¾æ¥è¯´æã第ä¸ç§æ 嵿¯ï¼æ¯ä¸ªèç¹åæ¥åï¼åèªååèªçé¢ç®ï¼åèªç龿°æ®é½å¨æ©å±ï¼å¯¼è´æ¯ä¸ªäººçé¾é¿åº¦ä¸ä¸è´ãè¿æä¸ç§æ 嵿¯ï¼å¨æä¸ªåºåä¸é¢ï¼åå¨ä¸åç齿£ç¡®ççæ¡ï¼é£ä¹ï¼å³ä½¿é¿åº¦ä¸è´ï¼ä½é¾çå 容ä¸ä¸è´ãæ¯å¦å¨æ¬ä¾ä¸âæµ·é天空âåé¢å¯ä»¥æ¥çæè¯æå¾å¤ï¼æ¯å¦âç©ºä¸æ¥¼éâãâ空åç»åâãâç©ºå£æ åâï¼ä»ä»¬é½æ¯æ£ç¡®çãè¿ç§æ åµä¸ï¼ç³»ç»å¿ é¡»å®ä¹ä¸ä¸ªå¯ä¸æ§çç®æ³ã
è§£å³ä¸é¢é®é¢çç®æ³ï¼ç§°ä¹ä¸ºâå ±è¯ç®æ³âæâä¸è´æ§ç®æ³âã
éè¿ä¸é¢çæè¿°ï¼æä»¬ç¥éâå ±è¯ç®æ³âå ¶å®æ¯è§£å³ä¸åç¨æ·ï¼æç§°ä¸åèç¹ï¼å¨å®æè¢«âå·¥ä½éè¯æâç®æ³æ¿è®¤çå·¥ä½ä¹åï¼å¦ä½å ¬å¹³åççå¥å±é®é¢ãä»å¿ é¡»åçï¼ä½ç°å ¬å¹³ãå ¬æ£ãå¨ä¸åçåºåé¾åºç¨ä¸ï¼å¨ä¸åçâå·¥ä½éè¯æâåºç¡ä¸ï¼å ¶å®ç°æ¹æ³æ¯ä¸åçï¼å¨åºäºæäºå¤æçâå·¥ä½éè¯æâçåºåé¾åºç¨ä¸ï¼å¯ä»¥æ³è±¡ï¼è¿äºå¤æçâå·¥ä½éè¯æâï¼ä¼å¯¼è´éè¦é叏夿çâå ±è¯ç®æ³âå»è§£å³å²çªã
妿æ¯ä¸ªèç¹å¨å¢å ä¸ä¸ªæ°åºåçæ¶åï¼é½å¯ä»¥å®æ¶åæ¥å°æ¯ä¸ªèç¹ï¼å¹¶ä¸å¨åæ¥è¿ç¨ä¸ï¼è½éå®å ¶å®èç¹ï¼å½ç¶è¿æ¯æçæ³çãä½äºå®ä¸ï¼å¨ç°å®åºæ¯ä¸ï¼è¿å¾é¾åå°ãç½ä¸æå¾å¤å ±è¯æ§ç®æ³è®¨è®ºï¼å¤§å®¶å¯ä»¥æ¥è¯¢åèï¼ä¸è¿å¾å¤é½åå¨ä¸ä¸ªé®é¢ï¼éè¦ä¸å¿èç¹æ¯æï¼æè§å¾è¿ä¸ªæ¯âå»ä¸å¿åâä¸å¯æ¥åçï¼æä»¥é常ä¸ä»¥ä¸ºç¶ã
å°±æ¬ä¾åèè¨ï¼å¯ä»¥è®¾è®¡ä¸ä¸ªç¸å¯¹ç®åçâå ±è¯ç®æ³âï¼æä»¬ç§°ä¹ä¸ºæé¿é¾æ³ï¼ä¸ºäºè§£å³è¿ä¸ªé®é¢ï¼è§å®æé¿çãææçé¾ææ¯æç»çé¾ï¼æ¢å¥è¯è¯´ï¼ç½ç»ä¸æææé¿é¾ææ¯å®é çé¾ãå ·ä½å®ç°å¦ä¸ï¼
å½ä¸ä¸ªç¨æ·å®æä¸ä¸ªæè¯æ¥é¾å¹¶è¢«ç³»ç»å¤æçæ¡æ£ç¡®çæ¶åï¼ä»å°è®¡åæ°å¢ä¸ä¸ªåºåï¼å¹¶ä¸å¸ææ·»å å°åºåé¾ä¸ï¼ä½è¿ä¹åï¼ç³»ç»ä¼å 廿«æå½åææèç¹ç®åçé¾ï¼å¦æåç°åå¨é¿åº¦æ¯å½åèç¹å ä¸è¿è¦é¿çé¾ï¼é£ä¹ç³»ç»è®¤ä¸ºï¼å½åèç¹è½ç¶å®æäºé¢ç®ï¼ä½å·²ç»ä¸æ¯æå¿«çé£ä¸ªäººäºï¼å æ¤ä¸åæ¿è®¤è¿æ¬¡å·¥ä½çæææ§ãå¹¶ä¸åæ¶åæ¥æé¿é¾å°æ¬å°ï¼æç¤ºç¨æ·éæ°åæè¯æ¥é¾ã
è¿ä¸ªç®æ³å¨æ¬ä¾ä¸ï¼çè®ºä¸æ¯åççï¼å 为ä¸è½è¯´ä¸ä¸ªç¨æ·è±äºä¸åéå°±åçåºæ¥ççæ¡ï¼å¦å¤ä¸ä¸ªè±äºä¸å¤©æåçåºæ¥ï¼å½ç¶åé¢çå°±ä¸è½è¯´ææäºãæ²¡ææ´ä»ç»çæ³è¿è¿ä¸ªâå ±è¯ç®æ³âçåçæ§ï¼ä½ä¸ºæ¼ç¤ºï¼ææ¶å°±é£ä¹ç¨ä¸ä¸äºãä¸é¢è¯´ä¸ä¸å¨æ¬ä¾ä¸å®ç°éè¦ç两个ææï¼
1ã æ¯ä¸ªèç¹éè¦ä¸ä¸ªè½è¢«æ«æåæä¾å®èªå·±çåºå龿°æ®çæ¥å£ï¼è¿ä¸ªå ¶å®æ¥å£å·²ç»æäºï¼å°±æ¯http:/â¦/blockchain/chain.jspï¼å顾åé¢ï¼å¨å¯å¨èç¹çæ¶åç¨å°è¿ï¼
2ã å®ç°ä¸ä¸ªå ±è¯ç®æ³æ¹æ³ï¼å¨æ¯æ¬¡âæç¿â宿åï¼å¤æå·¥ä½çæææ§ã
å ±è¯ç®æ³å¦ä¸ï¼
//å ±è¯ç®æ³
//è¿å true 表示å½åèç¹å·¥ä½å¯ä»¥è¢«è®¤å¯
public static boolean Unanimous(){
boolean bRet=true;
//æ«æå¨è¾¹çèç¹ï¼æ¾å°æé¿çé¾ï¼ä¸è½½å°æ¬å°
int iLastLen=0;
String sLastChain="";
for(int i=0;i<255;i+=1){
String sThisURL="http://"+sIPPre+i+":8080/blockchain/chain.jsp";
System.out.println(sThisURL);
String sChain=httpRequest(sThisURL);
if(sChain!=""){
System.out.println(sChain);
String sTemp[]=sChain.split("##");
if(sTemp.length>iLastLen){
iLastLen=sTemp.length;
sLastChain=sChain;
}
}
}
BlockChain.LoadData();
try{
//å¦æå ¶å®èç¹åå¨é¿åº¦å¤§äºæ¬å°èç¹+1çé¾ï¼åæ¬æ¬¡âæç¿âæ æ
if(sLastChain!="" && iLastLen >= BlockChain.lBlockchain.size()+1){
bRet=false;
FileOutputStream out = new FileOutputStream(new File(sDataFileDir+"//data.txt"));
sLastChain=sLastChain.replace("##", "\r\n");
out.write((sLastChain+"\r\n").getBytes());
out.close();
}
}catch(Exception e){
}
return bRet;
}
å å ¥âå ±è¯ç®æ³âåççé¢åæå¦ä¸ï¼
å½ç¨æ·é交ä¸ä¸ªæè¯åï¼ç³»ç»ä¼éè¿Ajaxé¦å æ£æµåºåé¾çä¸è´æ§ï¼ä¸è´æ§éè¿äºï¼ç¨æ·é交çè¿ä¸ªæ°çæè¯ï¼æä¼å å ¥å°åºåé¾ã妿åç°ææ´é¿ç龿¡åå¨ï¼åç³»ç»ä¼æç¤ºä½ æ ¢äºä¸æ¥ï¼å·²ç»è¢«æ¢çäºï¼å¿ 须鿰å¼å§ã
页é¢å¤§è´å¦ä¸ï¼
åå¸åè¿è¡åºåé¾æè¯æ¥é¾
å°è¿éï¼è¿ä¸ªâåºåé¾æè¯æ¥é¾â游æå°±åºæ¬æå»ºåæµè¯å®æã
æ¥ä¸æ¥çäºæ ï¼ä½ å¯ä»¥å°æ¤é¡¹ç®æå warï¼ç¶ååå¸å°ä½ æå¨å±åç½ä¸åçèç¹çæºå¨ä¸ï¼å 为ç¯å¢çæ¯æé®é¢ï¼æä»¥èç¹å¿ é¡»æWindows+JDK+Tomcatè¿è¡ç¯å¢ï¼å°é¡¹ç®æå æ blockchain.warï¼æ¾å°ä½ çTomcatç®å½ webappsä¸é¢ï¼ç¶åå¯å¨Tomcatï¼æå¼ä½ çæµè§å¨ï¼è¾å ¥ï¼http://localhost:8080/blockchain/
è¿ç¨ä¸å累述ã妿å±åç½çç¯å¢åæ¬å°ç®å½ç»ææææ¹åï¼åéè¦å¯¹é¡¹ç®çé¨åå°æ¹ç¨ä½ä¿®æ¹ï¼æ¯å¦ï¼
//对å±åç½å ççµèè¿è¡æ«æï¼æ¾å°æé¿çé¾ï¼ä¸è½½å°æ¬å°
static final String sIPPre="10.70.5.";
//æ¬å°åå¨è·¯å¾
static final String sDataFileDir="c://blockchain";
好å¦ï¼ä½ å¯ä»¥éè¯·ä½ çåäºåæå们ä¸èµ·æ¥æµè¯ä½ çåºåé¾æè¯æ¥é¾ï¼
æ»ç»ï¼
éè¿æå»ºä¸ä¸ªåºåé¾é¡¹ç®ï¼æä»¬å¯ä»¥äºè§£ä¸ä¸ªåºåé¾é¡¹ç®å¯å¨æéè¦çææç¥è¯ï¼ç¯å¢åå ¶åºæ¬ç®æ³æä»£è¡¨çæ¦å¿µï¼å¨ä¾åä¸ï¼æä»¬ä¸ä¸è®²è§£å¹¶ä¸å®ç°ï¼æä»¬å¯ä»¥éå¸¸å ·ä½å°ä½ä¼å°âå»ä¸å¿åâççå®å«ä¹ãäºå®ä¸ï¼å¯ä»¥å¨æµè¯è¿ç¨ä¸ï¼å å ¥å¾å¤ç»ç«¯ï¼ç¶åï¼å ³éä¸é´ä»»ä½ä¸å°ç»ç«¯ï¼çè¿ä¸ªäº§åæ¯å¦è¿æ¯å¯ä»¥æ£å¸¸è¿è¡ã
è½ç¶å¦æ¤ï¼å¨è¿ä¸ªè¿ç¨ä¸ï¼ä¹å¯ä»¥çå°æäºé®é¢å¹¶æ²¡æå¾å¥½åå½»åºçè§£å³æ¹æ¡ï¼åºåé¾ä½ä¸ºä¸ä¸ªæ°èµ·çæ¦å¿µåææ¯ï¼è¿ä¸ªå½ç¶ä¹å¯ä»¥çè§£ï¼åæ ·ï¼è¿ä¸ªå¯ä»¥ä½ä¸ºæä»¬ç 究人åè¿ä¸æ¥ä»ç»èèçç¹ã
1ã å ³äºç§åèç¹çé®é¢
å¨ä»»ä½ä¸ä¸ªèç¹å¯å¨çæ¶åï¼å¦ä½è·å¾å ¶å®èç¹çä½ç½®ä¿¡æ¯ï¼ä»èä¸è½½ååå§ååºåé¾å¢ï¼ç§åèç¹çåå¨ï¼çç¡®å¯ä»¥è§£å³è¿ä¸ªé®é¢ï¼ä½ç§åèç¹æ¬èº«ï¼å°±å¸¦æâä¸å¿åâè¿ä¸ªæ¦å¿µï¼æä»¥ï¼å¦ææ²¡æç§åèç¹ä¼æ´å 好ï¼ä½å¦ä½å®ç°å¢ï¼
2ã å ³äºâå·¥ä½éè¯æâ
ä¸ä¸ªææ¯æ¯å¦è½æ®åååä¸åï¼æè è¯´å¯¹ç¨æ·å¯¹ç¤¾ä¼æ¯å¦æçæ£çä»·å¼ï¼å°±å¨äºå®è½ä¸è½è§£å³æä»¬å ·ä½çæ´»åºæ¯çé®é¢ãåºåé¾éé¢å ·ä½æåçäºæ ï¼é½å¨âå·¥ä½éè¯æâéé¢ï¼å½åå¾å¤åºåé¾é¡¹ç®ï¼æ¯å¦âæ¯ç¹å¸âï¼é½æ¯ç¨ä¸ä¸ªè®¡ç®æºåçæ¹å¼ï¼æ¥æè¿°ååæä¸ç§å·¥ä½ï¼ä½è¿ç±»å·¥ä½çæä¹ç©¶ç«æå¤å¤§ï¼æè å ¶éç¨æ§æå¤å¤§ï¼ççéè¦æèãè¿ç§æ¹å¼ç¨æ¥äº§çâèæå¸âæ¯ä¸éï¼ä½âèæå¸âæççä»·å¼ä¹ï¼è¿æå°±æ¯ï¼ççææå·¥ä½ï¼é½å¯ä»¥ä¸éè¦âä¸å¿èç¹âæ¯æä¹ï¼æä»¥ï¼è®¾è®¡æ´å¤ç符åäººä»¬çæ´»åºæ¯çâå·¥ä½éè¯æâç®æ³ï¼å°å¤§å¤§æå±è¿ä¸ªææ¯ç忝ã
3ã å ³äºâå ±è¯ç®æ³â
âå ±è¯ç®æ³âåâå·¥ä½éè¯æâææç¸å ³ï¼ä½ææâå ±è¯ç®æ³âé½éè¦èèè§£å³èµ·ç 两个é®é¢ï¼å½å个èç¹ç¬èªè¿ä½çæ¶åï¼ä¸å¯é¿å ä¼äº§çæ¯ä¸ªèç¹åºåé¾ä¸åæ¥çé®é¢ï¼ä¸åæ¥å¯è½å¨æ¶é´ä¸ï¼ä¹å¯è½å¨âå·¥ä½éè¯æâçå¤éç»æä¸ï¼è¿ä¸¤ç§ï¼éè¦æç»è¾¾æå ±è¯ï¼ä½¿å¾ç³»ç»ä¸å§ç»åªæä¸æ¡æ£ç¡®çé¾ï¼åºè¯¥è¯´æ¯ç¸å½å°é¾ãç½ç»æå»¶è¿ï¼ç»ç«¯æå·®å¼ï¼ä¸åçç»æé½åçï¼æä¹å ¬å¹³åèãããççãå®å¨ä¸æ¯é£ä¹ç®åçã
4ã å ³äºå·¨éåºå龿°æ®åæ¥é度
å³ä½¿è§£å³äºä¸é¢1ï¼2ï¼3 æåºçé®é¢ï¼ä¹å卿°æ®åæ¥é度é®é¢ã
çè®ºä¸æ¥è¯´ï¼åºå龿¯ä¸ªèç¹ï¼åºè¯¥æ¯æ°æ®çå ¨å¤ä»½ã卿们è¿ä¸ªä¾åä¸ï¼åæ¥æ°æ®éæ¯è¾å°ï¼åæ¥èç¹ä¹ä¸å¤ï¼æä»¥æ¯æ¬¡åæ¥æ¶é´å¾çã使¯å¨åç¨ç³»ç»ä¸ï¼å¦æåºç°å¤§éçèç¹ï¼å¤§éçæ°æ®ï¼è¿ä¸ªåæ¥è¯å®ä¼ææ¶é´ãä¸ä¸ªæ¯èç¹åå¨å®¹éé®é¢ï¼ä¸ä¸ªæ¯åæ¥å¸¦å®½é®é¢ï¼ä¸¤è 齿¯ä¸å¯é¢æçãç®ååºäºåºåé¾çæºè½å约å¼åæ¡æ¶ä»¥å¤ªè®¿ï¼Ethereumï¼éè¦åæ¥çæ°æ®å·²ç»æ¥è¿äºæäººç100Gï¼è¿å¨ä¸æå¢é¿ï¼æä¸è½½å®è£ ä¸ä¸ªåæ¥äºä¸ä¸ªææãå¨å¦æ¤å¤§çæ°æ®ä¸¤ä¸ï¼ç®åç忥忷è´ï¼è¯å®æ¯ä¸åççï¼æ¢ä¼å¸¦æ¥å·¨å¤§çèµæºæµªè´¹ï¼ä¹ä¼å¸¦æ¥åºç¨çå¯ä½¿ç¨æ§åå·®ãæä»¥è¿éé¢éè¦è§£å³çé®é¢è¿å¾å¤ã
以ä¸è¿äºï¼ä»»ä½ä¸ç¹ï¼ä»ç»ç ç©¶é½æ¯ä¸ä¸ªå·¨å¤§ç课é¢ï¼åä¸ä¸ªç®åé£çåºåé¾é¡¹ç®ä¸é¾ï¼è¦å好并ä¸åæç¤¾ä¼çæ£æç¨èéçä½ç产åï¼ä¼°è®¡è¿æå¾è¿çè·¯ï¼å ·ä½æ³æ¥é½æ¯éè¦å¥½å¥½è§£å³çé®é¢ã让æä»¬ä¸èµ·åªåå§ã