Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¹¹½¨µÚÒ»¸ö Swift Çø¿éÁ´Ó¦ÓÃ
 
  2068  次浏览      30
 2018-9-3
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ51cto£¬½éÉÜÁËÇø¿éÁ´µÄ¹¤×÷Ô­Àí£¬ÔÚ Swift Öж¨ÒåÇø¿é£¬ Swift Öж¨ÒåÇø¿éÁ´µÈ¡£

Çø¿éÁ´µÄ¹¤×÷Ô­Àí

¹ËÃû˼Òå£¬Çø¿éÁ´ÊÇÒ»ÌõÓɲ»Í¬Çø¿éÁ¬½Ó×é³ÉµÄÁ´¡£Ã¿Ò»¸ö¿é°üº¬Èý¸öÐÅÏ¢£ºÊý¾Ý¡¢¹þÏ£(hash)¡¢ÒÔ¼°Ç°ÖÃÇø¿éµÄ¹þÏ£¡£

Êý¾Ý ¨C ÓÉÓÚÓ¦Óó¡¾°²»Í¬£¬´æ´¢ÔÚÇø¿éÖеÄÊý¾ÝÓÉÇø¿éÁ´µÄÀàÐ;ö¶¨¡£ÀýÈ磬ÔÚ±ÈÌØ±ÒÇø¿éÁ´ÖУ¬´æ´¢µÄÊý¾ÝÊǽ»Ò×ÐÅÏ¢£º×ªÕ˽ð¶îºÍ½»Ò×Ë«·½µÄÐÅÏ¢¡£

¹þÏ£ ¨C Äã¿ÉÒÔ½«¹þÏ£¿´×öÊý×ÖÖ¸ÎÆ£¬ÓÃÀ´Î¨Ò»±êʶһ¸öÇø¿é¼°ÆäÊý¾Ý¡£¹þÏ£µÄÖØÒªÖ®´¦ÔÚÓÚËüÊÇÒ»¸ö¶ÀÌØµÄ×ÖĸÊý×Ö´úÂ룬ͨ³£ÊÇ 64 ¸ö×Ö·û¡£µ±Ò»¸öÇø¿é±»´´½¨Ê±£¬¹þÏ£Ò²ËæÖ®´´½¨¡£µ±Ò»¸öÇø¿é±»Ð޸쬹þÏ£Ò²ËæÖ®Ð޸ġ£Òò´Ë£¬µ±ÄãÏëÒª²é¿´ÔÚÇø¿éÉÏËù×öµÄÈκαä¸üʱ£¬¹þÏ£¾ÍÏԵ÷dz£ÖØÒª¡£

ǰÖÃÇø¿éµÄ¹þÏ£ ¨C ͨ¹ý´æ´¢Ç°ÖÃÇø¿éµÄ¹þÏ££¬Äã¿ÉÒÔ»¹Ô­Ã¿¸öÇø¿éÁ¬½Ó³ÉÇø¿éÁ´µÄ¹ý³Ì!ÕâʹµÃÇø¿éÁ´°²È«ÐÔÌØ±ð¸ß¡£

ÎÒÃÇÀ´¿´ÏÂÕâÕÅͼƬ£º

Çø¿éÁ´

Äã¿ÉÒÔ¿´µ½£¬Ã¿Ò»¸öÇø¿é°üº¬Êý¾Ý(ͼƬÖÐûÓÐÖ¸Ã÷)¡¢¹þÏ£ÒÔ¼°Ç°ÖÃÇø¿éµÄ¹þÏ£¡£ÀýÈ磬»ÆÉ«Çø¿é°üº¬×ÔÉíµÄ¹þÏ££ºH7s6£¬ÒÔ¼°ºìÉ«Çø¿éµÄ¹þÏ££º8SD9¡£ÕâÑùËüÃǾ͹¹³ÉÁËÒ»ÌõÏ໥Á¬½ÓµÄÁ´¡£ÏÖÔÚ£¬¼ÙÈçÓÐÒ»¸öºÚ¿Í×¼±¸¶ñÒâ´Û¸ÄºìÉ«µÄÇø¿é¡£Çë¼Çס£¬Ã¿µ±¿éÒÔÈκη½Ê½±»´Û¸Äʱ£¬¸ÃÇø¿éµÄ¹þÏ£¶¼»á¸Ä±ä!µ±ÏÂÒ»¸öÇø¿é¼ì²é²¢·¢ÏÖǰÖùþÏ£²»Ò»ÖÂʱ£¬ºÚ¿Í½«ÎÞ·¨·ÃÎÊËü£¬ÒòΪËûÓëǰÖÃÇø¿éµÄÁªÏµ±»ÇжÏÁË(ÒëÕß×¢£º¼´Èç¹ûºÚ¿ÍÏëÒªÒª´Û¸ÄÒ»¸öÇø¿éµÄ»°£¬¾ÍÐèÒª°ÑÕâ¸öÇø¿éºóÃæµÄËùÓÐÇø¿é¶¼Òª¸Äµô£¬¶øÕâ¸ö¹¤×÷Á¿ÊǺÜÄÑʵÏÖµÄ)¡£

ÕâʹµÃÇø¿éÁ´Ìرð°²È«£¬¼¸ºõ²»¿ÉÄܻعö»òÕß´Û¸ÄÈκÎÊý¾Ý¡£ËäÈ»¹þϣΪ±£ÃܺÍÒþ˽ÌṩÁ˾޴óµÄ±£ÕÏ£¬µ«ÊÇ»¹ÓÐÁ½¸ö¸ü¼Ó°²È«Í×µ±µÄ´ëÊ©ÈÃÇø¿éÁ´¸ü¼Ó°²È«£º¹¤×÷Á¿Ö¤Ã÷(Proof-of-Work)ÒÔ¼°ÖÇÄܺÏÔ¼(Smart Contracts)¡£±¾ÎÄÎÒ²»»áÉîÈë½²½â£¬Äã¿ÉÒÔÔÚÕâÀïÁ˽â¸ü¶àÏà¹ØÖªÊ¶¡£

Çø¿éÁ´×îºóÒ»¸ö±£Ö¤×ÔÉí°²È«ÐԵķ½Ê½ÊÇ»ùÓÚÆä¶¨Î»¡£ºÍ´ó¶àÊý´æ´¢ÔÚ·þÎñÆ÷ºÍÊý¾Ý¿âµÄÊý¾Ý²»Í¬£¬Çø¿éÁ´Ê¹ÓõÄÊǵã¶Ôµã(P2P)ÍøÂç¡£P2P ÊÇÒ»ÖÖÔÊÐíÈκÎÈ˼ÓÈëµÄÍøÂ磬²¢ÇÒ¸ÃÍøÂçÉϵÄÊý¾Ý»á·Ö·¢¸øÃ¿Ò»¸ö½ÓÊÕÕß¡£

ÿµ±ÓÐÈ˼ÓÈëÕâ¸öÍøÂ磬ËûÃǾͻá»ñµÃÒ»·ÝÇø¿éÁ´µÄÍêÕû¿½±´¡£Ã¿µ±ÓÐÈËн¨Ò»¸öÇø¿é£¬¾Í»á¹ã²¥¸øÈ«Íø¡£ÔÚ½«¸Ã¿éÌí¼Óµ½Á´Ö®Ç°£¬½Úµã»áͨ¹ý¼¸¸ö¸´ÔӵijÌÐòÈ·¶¨¸Ã¿éÊÇ·ñ±»´Û¸Ä¡£ÕâÑù£¬ËùÓÐÈË¡¢ËùÓеط½¶¼¿ÉÒÔʹÓÃÕâ¸öÐÅÏ¢¡£Èç¹ûÄãÊÇ HBO ÃÀ¾ç¹è¹È µÄ·ÛË¿£¬¶Ô´ËÓ¦¸Ã²»»á¸Ðµ½Ä°Éú¡£ÔڸþçÖУ¬Ö÷ÑÝ(Richard)ʹÓÃÒ»ÖÖÏàËÆµÄ¼¼Êõ´´ÔìÁËÐÂÐÍ»¥ÁªÍø(ÒëÕß×¢£ºÓÐȤµÄÊǾçÖл¹·¢ÐÐÁËÇø¿éÁ´Êý×Ö»õ±Ò PiedPaperCoin£¬¸ÐÐËȤµÄͯЬ¿ÉÒÔË¢Ò»ÏÂÕⲿ¾ç)¡£

ÒòΪÿ¸öÈ˶¼ÓÐÇø¿éÁ´»òÕß½ÚµãµÄÒ»·Ý¿½±´£¬ËûÃÇ¿ÉÒÔ´ï³ÉÒ»ÖÖ¹²Ê¶²¢¾ö¶¨ÄIJ¿·ÖÇø¿éÊÇÓÐЧµÄ¡£Òò´Ë£¬Èç¹ûÄãÏëÒª¹¥»÷ij¸öÇø¿é£¬Äã±ØÐëͬʱ¹¥»÷ÍøÂçÉÏ 50% ÒÔÉϵÄÇø¿é(ÒëÕߣº51% ¹¥»÷)£¬Ê¹µÃÄãµÄÇø¿é¿ÉÒÔ×·Éϲ¢Ìæ»»Ô­Çø¿éÁ´¡£ËùÒÔÇø¿éÁ´»òÐíÊǹýȥʮÄêËù´´ÔìµÄ×ȫµÄ¼¼ÊõÖ®Ò»¡£

¹ØÓÚʾÀý³ÌÐò

ÏÖÔÚÄãÒѾ­¶ÔÇø¿éÁ´µÄÔ­ÀíÓÐÁ˳õ²½µÄÈÏʶ£¬ÄÇôÎÒÃǾͿªÊ¼Ð´Ê¾Àý³ÌÐò°É!Äã¿ÉÒÔÔÚÕâÀïÏÂÔØÔ­Ê¼ÏîÄ¿¡£

ÈçÄãËù¼û£¬ÎÒÃÇÓÐÁ½¸ö±ÈÌØ±ÒÇ®°ü¡£µÚÒ»¸öÕË»§ 1065 ÓÐ 500 BTC£¬¶øµÚ¶þ¸öÕË»§ 0217 ûÓÐ BTC¡£ÎÒÃÇͨ¹ý send °´Å¥¿ÉÒÔ·¢ËͱÈÌØ±Òµ½ÁíÍâµÄÕË»§¡£ÎªÁË׬ȡ BTC£¬ÎÒÃÇ¿ÉÒÔµã»÷ Mine °´Å¥£¬¿ÉÒÔ»ñµÃ 50 BTC µÄ½±Àø¡£ÎÒÃÇÖ÷Òª¹¤×÷ÊDz鿴¿ØÖÆÌ¨Êä³ö£¬¹Û²ìÁ½¸öÕË»§¼äµÄ½»Ò×¹ý³Ì¡£

ÔÚ×ó²àµ¼º½À¸¿ÉÒÔ¿´µ½Á½¸öºÜÖØÒªµÄÀࣺBlock ºÍ Blockchain¡£Ä¿Ç°ÕâÁ½¸öÀà¶¼ÊÇ¿ÕʵÏÖ£¬ÎÒ»á´ø×ÅÄãÃÇÔÚÕâÁ½¸öÀàÖÐдÈëÏà¹ØÂß¼­¡£ÏÂÃæÈÃÎÒÃÇ¿ªÊ¼°É!

ÔÚ Swift Öж¨ÒåÇø¿é

Ê×ÏÈ´ò¿ª Block.swift ²¢Ìí¼Ó¶¨ÒåÇø¿éµÄ´úÂë¡£ÔÚ´Ë֮ǰ£¬ÎÒÃÇÐèÒª¶¨ÒåÇø¿éÊÇʲô¡£Ç°ÃæÎÒÃÇÔø¶¨Òå¹ý£¬Çø¿éÊÇÓÉÈý²¿·Ö×é³É£º¹þÏ£¡¢Êµ¼Ê¼Ç¼µÄÊý¾ÝÒÔ¼°Ç°ÖÃÇø¿éµÄ¹þÏ£¡£µ±ÎÒÃÇÏëÒª¹¹½¨ÎÒÃǵÄÇø¿éÁ´Ê±£¬ÎÒÃDZØÐëÖªµÀ¸ÃÇø¿éÊǵÚÒ»¸ö»¹Êǵڶþ¸ö¡£ÎÒÃÇ¿ÉÒÔºÜÈÝÒ×µØÔÚ Swift µÄÀàÖÐ×öÈç϶¨Ò壺

var hash: String!
var data: String!
var previousHash: String!
var index: Int!

ÏÖÔÚÐèÒªÌí¼Ó×îÖØÒªµÄ´úÂë¡£ÎÒÔøÌá¹ýÇø¿éÔÚ±»Ð޸ĵÄÇé¿öÏ£¬¹þÏ£Ò²»áËæÖ®±ä»¯£¬ÕâÊÇÇø¿éÁ´Èç´Ë°²È«µÄÌØÐÔÖ®Ò»¡£Òò´ËÎÒÃÇÐèÒª´´½¨Ò»¸öº¯ÊýÈ¥Éú³É¹þÏ££¬¸Ã¹þÏ£ÓÉËæ»ú×ÖĸºÍÊý×Ö×é³É¡£Õâ¸öº¯ÊýÖ»ÐèÒª¼¸ÐдúÂ룺

func generateHash() -> String {
return NSUUID(). uuidString . replacingOccurrences (of: "-", with: "")
}

NSUUID ÊÇÒ»¸ö´ú±íͨÓÃΨһֵµÄ¶ÔÏ󣬲¢ÇÒ¿ÉÒÔÇÅ½Ó³É UUID¡£Ëü¿ÉÒÔ¿ìËÙµØÉú³É 32 ¸ö×Ö·û´®¡£±¾º¯ÊýÉú³ÉÒ»¸ö UUID£¬É¾³ýÆäÖеÄÁ¬½Ó·û£¬È»ºó·µ»ØÒ»¸ö String£¬×îºó½«½á¹û×÷ÎªÇø¿éµÄ¹þÏ£¡£Block.swift ÏÖÔÚ¾ÍÏñÏÂÃæ£º

ÏÖÔÚÎÒÃÇÒѾ­¶¨ÒåºÃÁË Block À࣬ÏÂÃæÀ´¶¨Òå Blockchain À࣬Ê×ÏÈÇл»µ½ Blockchain.swift ¡£

ÔÚ Swift Öж¨ÒåÇø¿éÁ´

ºÍ֮ǰһÑù£¬Ê×ÏÈ·ÖÎöÇø¿éÁ´µÄ»ù±¾Ô­Àí¡£Ó÷dz£»ù´¡µÄÊõÓïÀ´Ëµ£¬Çø¿éÁ´Ö»ÊÇÓÉÒ»Á¬´®µÄÇø¿éÁ¬½Ó¶ø³É£¬Ò²¿ÉÒÔ˵ÊÇÒ»¸öÓɶà¸öÌõÄ¿×é³ÉµÄÁÐ±í¡£ÕâÊDz»ÊÇÌýÆðÀ´ºÜÊìÏ¤ÄØ?ÆäʵÕâ¾ÍÊÇÊý×éµÄ¶¨Òå!¶øÇÒÕâ¸öÊý×éÊÇÓÉÇø¿é×é³ÉµÄ!½ÓÏÂÀ´Ìí¼ÓÒÔÏ´úÂ룺

var chain = [Block]()

¿ìËÙÌáʾ£º Õâ¸ö·½·¨¿ÉÒÔÓ¦ÓÃÓÚ¼ÆËã»ú¿ÆÑ§ÊÀ½çÀïµÄÈκÎÊÂÎï¡£Èç¹ûÄãÓöµ½´óÄÑÌ⣬¿ÉÒÔ³¢ÊÔ°ÑËü·Ö½â³ÉÈô¸É¸öСÎÊÌ⣬ÒÔ´ËÀ´½¨Á¢Æð½â¾öÎÊÌâµÄ·½·¨£¬ÕýÈçÎÒÃǽâ¾öÔÚ Swift ÖÐÈçºÎÌí¼ÓÇø¿éºÍÇø¿éÁ´µÄÎÊÌâ¡£

Äã»á×¢Òâµ½Êý×éÀïÃæÊÇÎÒÃÇÇ°Ãæ¶¨ÒåµÄ Block À࣬Õâ¾ÍÊÇÇø¿éÁ´ËùÐèÒªµÄËùÓбäÁ¿¡£ÎªÁËÍê³É¹¦ÄÜ£¬ÎÒÃÇ»¹ÐèÒªÔÚÀàÖÐÌí¼ÓÁ½¸öº¯Êý¡£Çë³¢ÊÔןù¾ÝÎÒ֮ǰ½Ì¹ýµÄ·½·¨½â´ðÕâ¸öÎÊÌâ¡£

Çø¿éÁ´ÖеÄÁ½¸öÖ÷Òªº¯ÊýÊÇʲô?

ÎÒÏ£ÍûÄãÄÜÈÏÕæË¼¿¼²¢»Ø´ðÕâ¸öÎÊÌâ!ʵ¼ÊÉÏ£¬Çø¿éÁ´µÄÁ½¸öÖ÷Òª¹¦ÄÜÊÇ´´½¨´´ÊÀÇø¿é(×î³õµÄʼ¿é)£¬ÒÔ¼°ÔÚÆä½áβÌí¼ÓеÄÇø¿é¡£µ±È»ÏÖÔÚÎÒ²»´òËãʵÏÖ·Ö²æÇø¿éÁ´ºÍÌí¼ÓÖÇÄܺÏÔ¼µÄ¹¦ÄÜ£¬µ«Äã±ØÐëÁ˽âÕâÁ½¸öÊÇ»ù±¾¹¦ÄÜ!½«ÒÔÏ´úÂëÌí¼Óµ½ Blockchain.swift£º

func createGenesisBlock(data:String) {
let genesisBlock = Block()
genesisBlock.hash = genesisBlock.generateHash()
genesisBlock.data = data
genesisBlock.previousHash = "0000"
genesisBlock.index = 0
chain.append (genesisBlock)
}
func createBlock(data:String) {
let newBlock = Block()
newBlock.hash = newBlock.generateHash()
newBlock.data = data
newBlock.previousHash = chain[chain.count-1].hash
newBlock.index = chain.count
chain.append(newBlock)
}

1¡¢ÎÒÃÇÌí¼ÓµÄµÚÒ»¸öº¯ÊýµÄ×÷ÓÃÊÇ´´½¨´´ÊÀÇø¿é¡£Îª´Ë£¬ÎÒÃÇ´´½¨ÁËÒ»¸öÒÔÇø¿éÊý¾ÝΪÈë²ÎµÄº¯Êý¡£È»ºó¶¨ÒåÁËÒ»¸öÀàÐÍΪ Block µÄ±äÁ¿ genesisBlock£¬ËüÓµÓдËǰÔÚ Block.swift Öж¨ÒåµÄËùÓбäÁ¿ºÍº¯Êý¡£ÎÒÃǽ« generateHash() ¸³Öµ¸ø¹þÏ££¬½«ÊäÈëµÄ data ²ÎÊý¸³Öµ¸øÊý¾Ý¡£ÓÉÓÚÕâÊǵÚÒ»¸öÇø¿é£¬ÎÒÃǽ«Ç°ÖÃÇø¿éµÄ¹þÏ£ÉèΪ 0000£¬ÕâÑùÎÒÃǾͿÉÒÔÖªµÀÕâÊÇÆðÊ¼Çø¿é¡£×îºóÎÒÃǽ« index ÉèΪ 0£¬²¢½«Õâ¸öÇø¿é¼ÓÈëµ½Çø¿éÁ´ÖС£

2¡¢ÎÒÃÇ´´½¨µÄµÚ¶þ¸öº¯ÊýÊÊÓÃÓÚ genesisBlock Ö®ºóµÄËùÓÐÇø¿é£¬²¢ÇÒÄÜ´´½¨Ê£ÓàµÄÇø¿é¡£Äã»á×¢Òâµ½ËüÓëµÚÒ»¸öº¯Êý·Ç³£ÏàËÆ¡£Î¨Ò»µÄÇø±ðÊÇ£¬ÎÒÃǽ« previousHash µÄÖµÉèÖÃΪǰһ¸öÇø¿éµÄ¹þÏ£Öµ£¬²¢½« index ÉèÖÃΪËüÔÚÇø¿éÁ´ÖеÄλÖ᣾ÍÕâÑù£¬Çø¿éÁ´ÒѾ­¶¨ÒåºÃÁË!ÄãµÄ´úÂëÓ¦¸Ã¿´ÆðÀ´¸úÏÂͼһÑù!

Ç®°üºó¶Ë

ÏÖÔÚÇл»µ½ ViewController.swift£¬ÎÒÃǻᷢÏÖËùÓÐµÄ outlet ¶¼ÒѾ­Á¬½ÓºÃÁË¡£ÎÒÃÇÖ»ÐèÒª´¦Àí½»Ò×£¬²¢½«ÆäÊä³öµ½¿ØÖÆÌ¨¡£

È»¶øÔÚ´Ë֮ǰ£¬ÎÒÃÇÐèÒªÉÔ΢Ñо¿Ò»Ï±ÈÌØ±ÒµÄÇø¿éÁ´¡£±ÈÌØ±ÒÊÇÓÉÒ»¸ö×ÜÕË»§²úÉúµÄ£¬ÎÒÃǽ«Õâ¸öÕ˺ŵıàºÅ³ÆÎª 0000¡£µ±ÄãÍÚµ½Ò»¸ö BTC£¬Òâζ×ÅÄã½â¾öÁËÊýѧÎÊÌ⣬Òò´Ë»á·¢ÐÐÒ»¶¨ÊýÁ¿µÄ±ÈÌØ±Ò×÷Ϊ½±Àø¡£ÕâÌṩÁËÒ»¸ö·¢±ÒµÄ¸ßÃ÷·½·¨£¬²¢ÇÒ¿ÉÒÔ¼¤Àø¸ü¶àÈËÈ¥ÍÚ¿ó¡£ÔÚÎÒÃǵÄÓ¦Óã¬ÈÃÎÒÃǰÑÍÚ¿ó½±ÀøÉèΪ 100 BTC¡£Ê×ÏÈ£¬ÔÚÊÓͼ¿ØÖÆÆ÷ÖÐÌí¼ÓËùÐèµÄ±äÁ¿£º

let firstAccount = 1065
let secondAccount = 0217
let bitcoinChain = Blockchain()
let reward = 100
var accounts: [String: Int] = ["0000": 10000000]
let invalidAlert = UIAlertController(title: "Invalid Transaction", message: "Please check the details of your transaction as we were unable to process this .", preferredStyle: . alert )

Ê×Ïȶ¨ÒåºÅÂëΪ 1065 ºÍ 0217 µÄÁ½¸öÕ˺š£È»ºóÌí¼ÓÒ»¸öÃûΪ bitcoinChain µÄ±äÁ¿×÷ΪÎÒÃǵÄÇø¿éÁ´£¬²¢½« reward ÉèΪ 100¡£ÎÒÃÇÐèÒªÒ»¸öÖ÷ÕÊ»§×÷ΪËùÓбÈÌØ±ÒµÄÀ´Ô´£º¼´´´ÊÀÕÊ»§ 0000¡£ÀïÃæÓÐ 1000 Íò¸ö±ÈÌØ±Ò¡£Äã¿ÉÒÔ°ÑÕâ¸öÕË»§ÏëÏó³ÉÒ»¸öÒøÐУ¬ËùÓÐÒò½±Àø²úÉúµÄ 100 ¸ö±ÈÌØ±Ò¶¼¾­´Ë·¢·Åµ½ºÏ·¨ÕË»§ÖС£ÎÒÃÇ»¹¶¨ÒåÁËÒ»¸öÌáÐѵ¯´°£¬Ã¿µ±½»Ò×ÎÞ·¨Íê³Éʱ¾Í»áµ¯³ö¡£

ÏÖÔÚ£¬ÈÃÎÒÃÇÀ´±àд¼¸¸öÔËÐÐʱÐèÒªµÄͨÓú¯Êý¡£ÄãÄܲ³öÊÇʲôº¯ÊýÂð?

1.µÚÒ»¸öº¯ÊýÊÇÓÃÀ´´¦Àí½»Ò׵ġ£ÎÒÃÇÐèҪȷ±£½»Ò×Ë«·½µÄÕË»§£¬Äܹ»½ÓÊÕ»ò¿Û³ýÕýÈ·µÄ½ð¶î£¬²¢½«ÕâЩÐÅÏ¢¼Ç¼µ½ÎÒÃǵÄÇø¿éÁ´ÖС£

2.ÏÂÒ»¸öº¯ÊýÊÇÔÚ¿ØÖÆÌ¨ÖдòÓ¡Õû¸ö¼Ç¼ ¡ª¡ª Ëü½«ÏÔʾÿ¸öÇø¿é¼°ÆäÖеÄÊý¾Ý¡£

3.×îºóÒ»¸öÊÇÓÃÓÚÑéÖ¤Çø¿éÁ´ÊÇ·ñÓÐЧµÄº¯Êý£¬Í¨¹ýУÑéÏÂÒ»¸öÇø¿éµÄ previousHash ºÍÉÏÒ»¸öÇø¿é hash ÊÇ·ñÆ¥Åä¡£ÓÉÓÚÎÒÃDz»»áÑÝʾÈκκڿͷ½·¨£¬Òò´ËÔÚÎÒÃǵÄʾÀý³ÌÐòÖУ¬Çø¿éÁ´ÊÇÓÀÔ¶ÓÐЧµÄ¡£

½»Ò׺¯Êý

ÏÂÃæÊÇÒ»¸öͨÓõĽ»Ò׺¯Êý£¬ÇëÔÚÎÒÃǶ¨ÒåµÄ±äÁ¿Ï·½ÊäÈëÒÔÏ´úÂ룺

func transaction(from: String, to: String, amount: Int, type: String) {
// 1
if accounts[from] == nil {
self.present(invalidAlert, animated: true, completion: nil)
return
} else if accounts[from]!-amount < 0 {
self.present(invalidAlert, animated: true, completion: nil)
return
} else {
accounts.updateValue(accounts[from]!-amount, forKey: from)
}
// 2
if accounts[to] == nil {
accounts.updateValue(amount, forKey: to)
} else {
accounts.updateValue(accounts[to]!+amount, forKey : to)
}
// 3
if type == "genesis" {
bitcoinChain.createGenesisBlock(data: "From: \ (from) ; To: \(to); Amount: \(amount)BTC")
} else if type == "normal" {
bitcoinChain.createBlock(data: "From: \(from); To : \(to); Amount: \(amount)BTC")
}
}

´úÂëÁ¿¿´ÆðÀ´ºÃÏñºÜ´ó£¬µ«Ö÷ÒªÊǶ¨ÒåÁËÿ¸ö½»Ò×ÐèÒª×ñÑ­µÄһЩ¹æÔò¡£Ò»¿ªÊ¼ÊǺ¯ÊýµÄËĸö²ÎÊý£º

to£¬from£¬amount£¬type¡£Ç°Èý¸ö²ÎÊý²»ÐèÒªÔÙ½âÊÍÁË£¬¶ø Type Ö÷ÒªÓÃÓÚ¶¨Òå½»Ò×µÄÀàÐÍ¡£×ܹ²ÓÐÁ½¸öÀàÐÍ£ºÕý³£ÀàÐÍ(normal) ºÍ´´ÊÀÀàÐÍ(genesis)¡£Õý³£ÀàÐ͵Ľ»Ò׻ᷢÉúÔÚÕË»§ 1065 ºÍ 2017 Ö®¼ä£¬¶ø´´ÊÀÀàÐͽ«»áÉæ¼°µ½ÕË»§ 0000¡£

1.µÚÒ»¸ö if-else Ìõ¼þÓï¾ä´¦Àíת³öÕË»§µÄÐÅÏ¢¡£Èç¹ûÕË»§²»´æÔÚ»òÕßÓà¶î²»×㣬½«»áÌáʾ½»Òײ»ºÏ·¨²¢·µ»Ø¡£

2.µÚ¶þ¸ö if-else Ìõ¼þÓï¾ä´¦ÀíתÈëÕË»§µÄÐÅÏ¢¡£Èç¹ûÕË»§²»´æÔÚ£¬Ôò´´½¨ÐÂÕË»§²¢×ªÈëÏàÓ¦µÄ±ÈÌØ±Ò¡£·´Ö®£¬ÔòÏò¸ÃÕË»§×ªÈëÕýÈ·ÊýÁ¿µÄ±ÈÌØ±Ò¡£

3.×îºóÒ»¸ö if-else Ìõ¼þÓï¾ä´¦Àí½»Ò×ÀàÐÍ¡£Èç¹ûÀàÐÍÊÇ´´ÊÀÀàÐÍ£¬ÔòÌí¼ÓÒ»¸ö´´ÊÀÇø¿é£¬·ñÔò´´½¨Ò»¸öеÄÇø¿é´æ´¢Êý¾Ý¡£

´òÓ¡º¯Êý

ΪÁËÈ·±£½»Ò×ÕýÈ·Ö´ÐУ¬ÔÚÿ¸ö½»Ò×½áÊøºó£¬ÎÒÃÇÏ£ÍûÄõ½ËùÓн»Ò×µÄÇåµ¥¡£ÒÔÏÂÊÇÎÒÃÇÔÚ½»Ò׺¯ÊýÏ·½µÄ´úÂ룬ÓÃÀ´´òÓ¡Ïà¹ØÐÅÏ¢£º

func chainState() {
for i in 0 ...bitcoinChain.chain.count-1 {
print("\tBlock: \ (bitcoinChain .chain [i]. index ! )\n\tHash: \(bitcoinChain.chain[i].hash!) \n\tPreviousHash: \(bitcoinChain.chain[i].previousHash!) \n\tData: \(bitcoinChain.chain[i].data! )")
}
redLabel.text = "Balance: \(accounts[String (describing : firstAccount) ]!) BTC"
blueLabel. text = "Balance: \(accounts [String (describing : secondAccount)]!) BTC"
print (accounts)
print (chainValidity())
}

ÕâÊÇÒ»¸ö¼òµ¥µÄÑ­»·Óï¾ä£¬±éÀú bitcoinChain ÖеÄËùÓÐÇø¿é£¬²¢´òÓ¡Çø¿éºÅÂ룬¹þÏ££¬Ç°ÖùþÏ££¬ÒÔ¼°´æ´¢µÄÊý¾Ý¡£Í¬Ê±ÎÒÃǸüÐÂÁ˽çÃæÖеıêÇ©(label)£¬ÕâÑù¾Í¿ÉÒÔÏÔʾÕË»§ÖÐÕýÈ·µÄ BTC ÊýÁ¿¡£×îºó£¬´òÓ¡ËùÓеÄÕË»§(Ó¦¸ÃÊÇ 3 ¸ö)£¬²¢Ð£ÑéÇø¿éÁ´µÄÓÐЧÐÔ¡£

ÏÖÔÚÄãÓ¦¸Ã»áÔÚº¯ÊýµÄ×îºóÒ»Ðз¢ÏÖÒ»¸ö´íÎó¡£ÕâÊÇÓÉÓÚÎÒÃÇ»¹Ã»ÓÐʵÏÖ chainValidity() º¯Êý£¬ÈÃÎÒÃÇÂíÉÏ¿ªÊ¼°É¡£

ÓÐЧÐÔº¯Êý

ÅжÏÒ»¸öÁ´ÊÇ·ñÓÐЧµÄ±ê×¼ÊÇ£ºÇ°ÖÃÇø¿éµÄ¹þÏ£Óëµ±Ç°Çø¿éËù±íʾµÄÊÇ·ñÆ¥Åä¡£ÎÒÃÇ¿ÉÒÔÔÙ´ÎÓÃÑ­»·Óï¾äÀ´±éÀúËùÓеÄÇø¿é£º

func chainValidity() -> String {
var isChainValid = true
for i in 1...bitcoinChain.chain.count-1 {
if bitcoinChain.chain[i].previousHash != bitcoinChain.chain[i-1].hash {
isChainValid = false
}
}
return "Chain is valid: \(isChainValid)\n"
}

ºÍ֮ǰһÑù£¬ÎÒÃDZéÀúÁË bitcoinChain ÖеÄËùÓÐÇø¿é£¬²¢¼ì²éÁËǰÖÃÇø¿éµÄ hash ÊÇ·ñÓëµ±Ç°Çø¿éµÄ previousHash Ò»Ö¡£

¾Í½´!ÎÒÃÇÒѾ­½«¶¨ÒåÁËËùÓÐÐèÒªµÄº¯Êý!ÄãµÄ ViewController.swift Ó¦¸ÃÈçÏÂͼһÑù£º

ÊÕβ¹¤×÷¾ÍÊÇÁ¬½Ó°´Å¥ºÍº¯ÊýÀ²¡£ÈÃÎÒÃÇÂíÉÏ¿ªÊ¼×îºóµÄ²¿·Ö°É!

ÈÃÒ»ÇйØÁªÆðÀ´

µ±ÎÒÃǵÄÓ¦ÓõÚÒ»´ÎÆô¶¯Ê±£¬ÐèÒª´´ÊÀÕË»§ 0000 ·¢ËÍ 50 BTC µ½ÎÒÃǵĵÚÒ»¸öÕË»§¡£ÔÙ´ÓµÚÒ»¸öÕË»§×ªÕË 10 BTC µ½µÚ¶þ¸öÕË»§£¬ÕâÖ»ÐèÒªÁÈÁÈÈýÐдúÂë¡£×îºó viewDidLoad ÖеĴúÂëÈçÏ£º

override func viewDidLoad() {
super.viewDidLoad()
transaction(from: "0000", to: "\(firstAccount)", amount: 50, type: "genesis")
transaction(from: "\(firstAccount)", to: "\(secondAccount)", amount: 10, type: "normal")
chainState ()
self.invalidAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
}

ÎÒÃÇʹÓÃÒѶ¨ÒåºÃµÄº¯ÊýתÕË£¬²¢µ÷Óà chainState() º¯Êý¡£×îºó£¬ÎÒÃÇ»¹ÔÚ invalidAlert ÖÐÌí¼ÓÁËÒ»¸ö±êÌâΪ OK µÄ UIAlertAction¡£

ÏÖÔÚÈÃÎÒÃÇÀ´ÊµÏÖʣϵÄËĸöº¯Êý£ºReMeNe()¡¢BrimeMeNe()¡¢ReSdEnter()ºÍBuLeScript()¡£

ÍÚ¿óº¯Êý

ÍÚ¿óº¯ÊýÌØ±ð¼òµ¥£¬Ö»ÐèÒªÈýÐдúÂë¡£Ìí¼ÓÒÔÏ´úÂ룺

@IBAction func redMine(_ sender: Any) {
transaction(from: "0000", to: "\(firstAccount)", amount : 100, type: "normal")
print ("New block mined by: \(firstAccount)")
chainState ()
}
@IBAction func blueMine (_ sender: Any) {
transaction (from: "0000", to: "\(secondAccount) ", amount : 100, type: "normal")
print ("New block mined by: \(secondAccount)")
chainState()
}

ÔÚµÚÒ»¸öÍÚ¿óº¯ÊýÖУ¬ÎÒÃÇʹÓý»Ò׺¯Êý´Ó´´ÊÀÕË»§·¢ËÍÁË 100 BTC µ½µÚÒ»¸öÕË»§¡£ÎÒÃÇ´òÓ¡ÁËÍÚ¿óµÄÇø¿é£¬È»ºó´òÓ¡ÁËÇø¿éÁ´µÄ״̬¡£Í¬ÑùµØ£¬ÔÚ blueMine º¯ÊýÖУ¬ÎÒÃÇת¸øÁ˵ڶþ¸öÕË»§ 100 BTC¡£

·¢Ëͺ¯Êý

·¢Ëͺ¯ÊýºÍÍÚ¿óº¯ÊýÂÔ΢ÏàËÆ£º

@IBAction func redSend(_ sender: Any) {
if redAmount.text == "" {
present (invalidAlert, animated: true, completion : nil)
} else {
transaction (from: "\(firstAccount)", to: "\ ( secondAccount )", amount: Int(redAmount.text!)!, type : "normal")
print ("\(redAmount.text!) BTC sent from \ ( firstAccount ) to \(secondAccount)")
chainState ()
redAmount.text = ""
}
}
@IBAction func blueSend(_ sender: Any) {
if blueAmount .text == "" {
present (invalidAlert, animated: true, completion : nil)
} else {
transaction (from : "\(secondAccount)", to: "\ (firstAccount )", amount: Int (blueAmount.text!) !, type : "normal")
print ("\(blueAmount.text!) BTC sent from \ (secondAccount) to \(firstAccount)")
chainState ()
blueAmount.text = ""
}
}

Ê×ÏÈ£¬ÎÒÃǼì²é redAmount »òÕß blueAmount µÄÎı¾ÖµÊÇ·ñΪ¿Õ¡£Èç¹ûΪ¿Õ£¬Ôòµ¯³öÎÞЧ½»Ò×µÄÌáʾ¿ò¡£Èç¹û²»Îª¿Õ£¬Ôò¼ÌÐøÏÂÒ»²½¡£ÎÒÃÇʹÓý»Ò׺¯Êý´ÓµÚÒ»¸öÕË»§×ªÕ˵½µÚ¶þ¸öÕË»§(»òÕß·´ÏòתÕË)£¬½ð¶îΪÊäÈëµÄÊýÁ¿¡£ÎÒÃÇ´òӡתÕ˽ð¶î£¬²¢µ÷Óà chainState() ·½·¨¡£×îºó£¬Çå¿ÕÎı¾¿ò¡£

¾Í½´£¬¹¤×÷Íê³É!Çë¼ì²éÄãµÄ´úÂëÊÇ·ñºÍͼÖÐÒ»Ö£º

ÏÖÔÚÔËÐÐÓ¦Óò¢²âÊÔһϡ£´Óǰ¶Ë¿´£¬Õâ¾ÍÏñÒ»¸öÕý³£µÄ½»Ò×Ó¦Ó㬵«ÊÇÔËÐÐÔÚÆÁÄ»±³ºóµÄ¿ÉÊÇÇø¿éÁ´°¡!Çë³¢ÊÔʹÓÃÓ¦Óý« BTC ´ÓÒ»¸öÕÊ»§×ªÒƵ½ÁíÒ»¸öÕÊ»§£¬ËæÒâ²âÊÔ£¬¾¡Çé°ÑÍæ°É!

½áÂÛ

ÔÚÕâ¸ö½Ì³ÌÖУ¬ÄãÒѾ­Ñ§»áÁËÈçºÎʹÓà Swift ´´½¨Çø¿éÁ´£¬²¢ÇÒ´´½¨ÁËÄã×Ô¼ºµÄ±ÈÌØ±Ò½»Ò×ϵͳ¡£Çë×¢Òâ£¬ÕæÕý¼ÓÃÜ»õ±ÒµÄºó¶Ë£¬ºÍÎÒÃÇÉÏÃæµÄʵÏÖÍêÈ«²»Ò»Ñù£¬ÒòΪËüÐèÒªÓÃÖÇÄܺÏԼʵÏÖ·Ö²¼Ê½£¬¶ø±¾Àý½öÓÃÓÚѧϰ¡£

   
2068 ´Îä¯ÀÀ       30
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì