ãã®èšäºã§ã¯ãIPFSã䜿çšãã2ãæã®å®éšã®çµæã«ã€ããŠèª¬æããŸãã ãããã®å®éšã®äž»ãªçµæã¯ãã¡ã¿ããŒã¿ïŒã¢ã«ãã åããã©ãã¯ãªã¹ããã«ããŒïŒã§å§ãŸãããªãŒãã£ãªãã¡ã€ã«ã§çŽæ¥çµããåæ£IPFSãããã¯ãŒã¯ã§å
¬éãããæ
å ±ã®ã¿ã«åºã¥ããŠé³æ¥œã©ã€ãã©ãªãäœæã§ããæŠå¿µå®èšŒã¹ããªãŒãã³ã°ãªãŒãã£ãªãã¬ãŒã€ãŒã®äœæã§ããã
ãããã£ãŠããã¹ã¯ãããé»åã¢ããªã±ãŒã·ã§ã³ã§ããããããã¬ãŒã€ãŒã¯éäžãªãœãŒã¹ã«äŸåããŸããã
IPFS
ä»çµã¿
äžèŠãããšããããã®ãã¯ãããžãŒã¯BitTorrentãDCãgitããããã¯ãã§ãŒã³ã®ã¯ãã¹ã«äŒŒãŠããŸãã 2çªç®ã¯ãIPFSãäžèšã®ãããã³ã«ã®ããããã®ãªããžã§ã¯ããä¿åããã³é
åžã§ããããšãæããã«ããŠããŸãã
ãŸããIPFSã¯ãããŒã¿ã亀æããã³ã³ãã¥ãŒã¿ãŒã®ãã¢ããŒãã¢ãããã¯ãŒã¯ã§ãã ãã®åœ¢æã®ããã«ãããŸããŸãªãããã¯ãŒã¯æè¡ã®çµã¿åããã䜿çšãããåå¥ã®libp2pãããžã§ã¯ãã®äžéšãšããŠéçºãããŠããŸãã åã³ã³ãã¥ãŒã¿ãŒã«ã¯ç¹å¥ãªãã£ãã·ã¥ãããããã°ããã®éããŠãŒã¶ãŒãå
¬éãŸãã¯ããŠã³ããŒãããããŒã¿ãä¿åãããŸãã IPFSãã£ãã·ã¥ã®æ
å ±ã¯ãããã¯ã«ä¿åãããããã©ã«ãã§ã¯åºå®ãããŠããŸããã ååãªã¹ããŒã¹ããªããªããšãããŒã«ã«ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãé·æéã¢ã¯ã»ã¹ãããŠããªããããã¯ãã¯ãªãŒã³ã¢ããããŸãã åºå®/åºå®è§£é€ã¡ãœããã¯ããã£ãã·ã¥å
ã®æ
å ±ãåºå®/åºå®è§£é€ããŸãã
ãããã¯ããšã«ããã®ã³ã³ãã³ãã®äžæã®æå·åãã£ã³ã¬ãŒããªã³ããèšç®ãããIPFSã¹ããŒã¹ã§ãã®ã³ã³ãã³ããžã®ãªã³ã¯ãšããŠæ©èœããŸãã ãããã¯ãçµåããŠããŒã¯ã«ããªãŒãªããžã§ã¯ããäœæããããšãã§ãããã®ããŒãã«ã¯ç¬èªã®ãã£ã³ã¬ãŒããªã³ãããããäžäœããŒã/ãããã¯ã®ãã£ã³ã¬ãŒããªã³ãã«åºã¥ããŠèšç®ãããŸãã ããããæãèå³æ·±ãããšãå§ãŸããŸãã
IPLD-DAG
IPFSã¯ãIPLDïŒInterPlanetary Linked DataïŒãšåŒã°ããå€æ°ã®å°èŠæš¡ãªãããã³ã«ã©ããããžã§ã¯ãã§æ§æãããŠããŸãã æ¬è³ªãæ£ãã説æã§ãããã©ããã¯ããããŸããã®ã§ãèå³ã®ãã人ã®ããã«ä»æ§ãžã®ãªã³ã¯ãæ®ããŸãã
ã€ãŸããåã®æ®µèœã§èª¬æããã¢ãŒããã¯ãã£ã¯éåžžã«æè»ã§ããããããããã¯ãã§ãŒã³ãunixã©ã€ã¯ãªãã¡ã€ã«ã·ã¹ãã ãgitãªããžããªãªã©ãããè€éãªæ§é ãåäœæããããã«äœ¿çšã§ããŸãã ãã®ããã«ãé©åãªã€ã³ã¿ãŒãã§ãŒã¹/ãã©ã°ã€ã³ã䜿çšãããŸãã
ãããŸã§ã®ãšãããéåžžã®JSONãªããžã§ã¯ããIPFSã«å
¬éã§ããdag
ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ã䜿çšããŠããŸããã
const obj = { simple: 'object' } const dagParams = { format: 'dag-cbor', hashAlg: 'sha3-512' } const cid = await ipfs.dag.put(obj, dagParams)
æåãããšãã³ã³ãã³ãèå¥åïŒCIDïŒãªããžã§ã¯ããè¿ããããã®äžã«å
¬éãããæ
å ±ã®äžæã®ãã£ã³ã¬ãŒããªã³ããšããããããŸããŸãªåœ¢åŒã«å€æããã¡ãœãããæ ŒçŽãããŸãã ããã«ãããããŒã¹æååãååŸã§ããŸãã
const cidString = cid.toBaseEncodedString() console.log(cidString)
ãã®è¡ã¯ã get
ã¡ãœããã䜿çšããŠããŒã¿ãååŸããããã«äœ¿çšã§ããŸãã åæã«ã䜿çšãããããŒã¿åœ¢åŒãšæå·åã¢ã«ãŽãªãºã ã«é¢ããæ
å ±ãè¡ã«å«ãŸããŠãããããè¿œå ã®ãã©ã¡ãŒã¿ãŒã¯å¿
èŠãããŸããã
const obj = await ipfs.dag.get(cidString) console.log(obj.value)
ãã£ãšãã£ãšã 2çªç®ã®ãªããžã§ã¯ããå
¬éã§ããŸãããã£ãŒã«ãã®1ã€ã¯æåã®ãªããžã§ã¯ããåç
§ããŸãã
const obj2 = { complex: 'object', link: { '/' : cidString
obj2ãåãæ»ãããšãããšãç¹å¥ãªãã©ã¡ãŒã¿ãŒãå察ãæå®ããªãéãããã¹ãŠã®å
éšãªã³ã¯ã解決ãããŸãã
const obj2 = await ipfs.dag.get(cid2String) console.log(obj2.value)
åã
ã®ãã£ãŒã«ãã®å€ãèŠæ±ã§ããŸãããã®ããã«ã¯ãCIDãã£ãŒã«ãã«/_
field_nameãšãã圢åŒã®æ¥å°ŸèŸãè¿œå ããå¿
èŠããããŸãã
const result = await ipfs.dag.get(cid2String+"/complex") console.log(result.value)
ãããã£ãŠãä»ã®ãªããžã§ã¯ããžã®ãªã³ã¯ãå«ããªããžã§ã¯ãå
šäœãããããã1ã€ã®å€§ããªãªããžã§ã¯ãã§ãããã®ããã«ãæ©ããããšãã§ããŸãã ãªã³ã¯ã¯ã³ã³ãã³ãã®æå·åããã·ã¥ã§ããããããªããžã§ã¯ãã«ã¯ããèªäœãžã®ãªã³ã¯ãå«ããããšã¯ã§ããŸããã
IPLDã®æŠå¿µã¯ãä»ã®DAGãªããžã§ã¯ãã ãã§ãªããä»ã®IPLDæ§é ãåç
§ã§ããããšãæå³ããŸãã ãããã£ãŠããªããžã§ã¯ãã®1ã€ã®ãã£ãŒã«ãã¯gitã³ããããåç
§ã§ãããã1ã€ã®ãã£ãŒã«ãã¯ãããã³ã€ã³ãã©ã³ã¶ã¯ã·ã§ã³ãåç
§ã§ããŸãã
ãã/ãµã
pubsub
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãèšç»ãããæ©èœã®å®è£
ã«ãããŠåºæ¬çãªåœ¹å²ãæãããŸããã ããã䜿çšãããšãç¹å¥ãªåç·ããŒã§çµåãããp2p-roomsã«ãµãã¹ã¯ã©ã€ãããã¡ãã»ãŒãžãéä¿¡ããŠèŠç¥ãã¬äººãåä¿¡ã§ããŸãã
const topic = ' ' const receiveMsg = (msg) => {
æåã®pubsubããŒã¹ã®ã¢ããªã®1ã€ã¯ãircã«äŒŒãp2pãã£ããè»éã§ããïŒãããããªãã ãŸã åäœããŠããŸãïŒã ãã£ã³ãã«ã賌èªããã¡ãã»ãŒãžãåä¿¡ãããšãã¹ããŒãªãŒã¯åå è
éã«ä¿åãããåŸã
ã«ãå¿ããããŠãããŸããŸãã ã€ã³ã¿ãŒãããå
šäœã®ãã®ãããªvypressã
IPFSã®goããŒãžã§ã³ãšjsããŒãžã§ã³ã®äž¡æ¹ã§ãpubsubã€ã³ã¿ãŒãã§ã€ã¹ã¯ãŸã å®éšçãªæè¡ãšèŠãªãããŠãããããç¹å¥ãªãã©ã¡ãŒã¿ãŒã«ãã£ãŠæå¹ã«ãªããŸãã
ã¢ã€ãã¢
ãªãŒãã£ãªæ奜家ã®ç掻ã®ããæç¹ã§ãç§ã¯é·ãéGoogle Musicã ãã§é³æ¥œãèŽããŠããŸããã ãããŠãé»è©±ã ãã§ãªãããã§ã«ãã¹ã¯ãããäžã§ãã ããã€ãã®çç±ããããŸãããäž»ãªçç±ã¯ãåãæ¥æµãšæ¯èŒããŠãã»ãšãã©ã®æ¥åžžã®ç¶æ³ã§ãèãããããšãèããéã®ã¯ãªãã¯æ°ã倧å¹
ã«å°ãªãããšã§ãã 2çªç®ã®çç±ã¯ãå©çšå¯èœãªé³æ¥œã©ã€ãã©ãªã®ãµã€ãºã§ãã ãããŸãã«ãæ¢ããŠãããã®ãèŠã€ãããŸããïŒå€ãã®å Žåãå°åã®å¶éã«é©åããŠããŸãïŒã ããããããã¯ãã¬ã³ãã«å¯Ÿããå©ç¹ã§ã¯ãªããä»ã®ã¹ããªãŒãã³ã°ãµãŒãã¹ã«ãšã£ãŠã¯å©ç¹ã§ãã
åæ£ããŒã¿ãœãŒã¹ã®ã¿ã«åºã¥ãã䜿ãåæã®è¯ãã¢ããªã±ãŒã·ã§ã³ãäœæã§ãããã©ãããäžæè°ã«ãªããŸããã æéãçµã€ã«ã€ããŠããã®ã¿ã¹ã¯ãå®è¡å¯èœã«ãªã2ã€ã®äž»ãªæ¡ä»¶ãçå®ãããŸããã
- åæ£ãããã¯ãŒã¯å
ã®ããŒã¿ã®å€èŠ³ãçŽæ¥ç£èŠããæ©èœã
- ãããã¯ãŒã¯åå è
ãå
¬éããããŒã¿ã¯æšæºåããå¿
èŠããããŸãã
BitTorrentãšã³ã·ã¹ãã ã§ã¯ã誰ããäœããããŠã³ããŒããããå Žåãã»ãšãã©ã®å Žåãæåã«torrentãã£ã¬ã¯ããªïŒéåžžã®ãã¡ã€ã³ã®äžã®éåžžã®IPã®èåŸã«ããéåžžã®ãµãŒããŒã«ããéåžžã®ãµã€ãïŒã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã æåã®æ¡ä»¶ã¯ãã¢ããªã±ãŒã·ã§ã³ãéäžåãªãœãŒã¹ã䜿çšããã«ããŒã«ã«ããŒã¿ããŒã¹ãèªåçã«äœæã§ããããã«ããããã«å¿
èŠã§ãã
2çªç®ã®æ¡ä»¶ãæãéèŠã§ãã ãã®å®è£
ã«ã¯ãåæ£ãããã¯ãŒã¯ã®åå è
ã«ãã£ãŠå
¬éãããæ
å ±ããäºåã«ç¥ãããŠããæ®ãã®ã¢ãã«/ã¹ããŒã ã«åŸã£ãŠäœæãããå¿
èŠããããŸãã ããã«ãããåæ£ããŒã¿ã¹ããŒã¹ãæ€çŽ¢ããã³ãã£ã«ã¿ãªã³ã°ã·ã¹ãã ã§äœ¿çšã§ããããã«ãªãããã®æå¹æ§ãåäžããŸãã
å€æããããã«ãIPFSã䜿çšãããšããããã®äž¡æ¹ã®æ¡ä»¶ãéåžžã«å¹æçã«æäŸã§ããŸãã
å®è£
ä»æ¥ããã°ã©ã¢ãã©ã³ãã¯ãåå§çãªãã¬ãŒã€ãŒé³æ¥œã©ã€ãã©ãªã§ãã ã»ãšãã©ãã¹ãŠã®æ©èœããããŸãïŒ
- IPFSã§ã¢ã«ãã ãå
¬éãã
- çºèŠãããã¢ã«ãã ã®ãªã¹ã
- ã¢ã«ãã ãåçããæ©äŒ
åºçç©ããå§ããŸãããã åã®ç« ã§ãåæ£ãããã¯ãŒã¯å
ã®æ
å ±ãäœããã®æ¹æ³ã§æšæºåããæ¹æ³ã«ã€ããŠèª¬æããŸããã ãGramophoneãã§ã¯ãã¢ã«ãã ã®jsonã¹ããŒã ã«ãã£ãŠãã®ã¿ã¹ã¯ãéæãããŸãã
const albumSchema = { type: "object", properties: { title: { type: "string" }, artist: { type: "string" }, cover: { type: "string" }, tracks: { type: "array" items: { type: "object", properties: { title: { type: "string" }, artist: { type: "string" }, hash: { type: "string" } } } } } }
ãã®ã¹ããŒã ã«åŸã£ãŠãç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ããã§ãã¯ãããŠããå
¬éãããŸãã éåžžã®å
¥åãã©ãŒã ããããæ
åœããŸãã
æåã¯ãå
¬éã¯ãã¡ã€ã«ã·ã¹ãã ããçŽæ¥è¡ããããšæ³å®ãããŠããŸããã ããŒã¿ã®æšæºåã¯ãç¹å¥ãª.meta
ãã¡ã€ã«ã䜿çšããŠ.meta
ãŸãããã®ãã¡ã€ã«ã«ã¯ãã€ã³ã¹ã¿ã³ã¹ã«å¿
èŠãªãã¹ãŠã®ããããã£ãšé¢ä¿ãèšè¿°ãããŸãã ããããå°ãå®éšããŠãã¢ããªã±ãŒã·ã§ã³èªäœã®ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠãããè¡ããšããã䟿å©ã§ãèŠèŠçã§ãå¹ççã«ãªããšããçµè«ã«éããŸããã
éèŠãªè©³çŽ°-æ·»ä»ãã¡ã€ã«ã¯ipfs.files.add()
ã䜿çšããŠipfs.files.add()
å
¬éãããŸãã è¿ãããCIDã¯ã察å¿ããå
¥åã«åå¥ã®è¡ãšããŠæ¿å
¥ãããŸãã ãã¡ã€ã«ãæå
ã«ãªãå Žåã§ãå
¥åã¯æ®ãããŸããããã®CIDã¯æ¢ç¥ã§ãã
ãã©ãŒã ã«å
¥åãããADD ALBUMããæŒããšãæçµçãªJSONããŒã¿ãæåã«ã¹ããŒã ã«æºæ ããŠãããã©ããããã§ãã¯ããã次ã«DAGã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠå
¬éãããŸãããã®åŸãåä¿¡ããCIDã¯ç¹å¥ãªpubsubã«ãŒã ã®ãããã¡ãŒãšããŠéä¿¡ãããŸã
const isValid = validateAlbumObj(albumObj)
æãããªè§£æ±ºçã¯ãã¢ããªã±ãŒã·ã§ã³å
ã§ãããã¯ãŒã¯ãåé¢ããå Žåãã«ãŒã ããŒãšããŠãã¢ã«ãã ãããé³æ¥œã¢ã«ãã ãããŸãã¯æ¥µç«¯ãªå Žåã«ã¯ããã¹ãã©ã³ããªã©ã䜿çšããããšã§ãã ãããããã®åŸããã£ãšè³¢ãã¢ã€ãã¢ãæãæµ®ãã³ãŸãã-ã¢ã«ãã ã®json-schemeã®CIDæååãããŒãšããŠäœ¿çšããããšã æçµçã«ãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã³ããŒãçã«çµ±åããã®ã¯ããŒã¿ã¹ããŒãã§ãã ããã«ãåä¿¡ãããã¹ãŠã®ã¡ãã»ãŒãžã«ãã®ã¹ããŒã ã®æ€èšŒæžã¿ã€ã³ã¹ã¿ã³ã¹ãå«ãŸããããšãæåŸ
ã§ããã®ã¯ãã®éšå±ããã§ãã
const handleReceivedMessage = async (message) => { try { const { data, from } = message
ã芧ã®ãšãããåãå°çããªããžã§ã¯ãã¯ã¹ããŒã ãžã®æºæ ããã§ãã¯ãããŸããããã¯ãããŒãç¥ã£ãŠãããããã¯ãŒã¯åå è
ã«èª°ãå¹²æžãããæå³çã«éšå±ã«ããµãå§ããããã§ãã åæã«ãããŒã®äžææ§ã«ãããå¶çºçãªå¹²æžã®å¯èœæ§ãæå°éã«æããããŸãã äžæ¹ãä»ã®ã¢ããªã±ãŒã·ã§ã³ãGramophoneãšåãã¹ããŒã ã®äœ¿çšãéå§ãããšããããã¯åãããŒã¿ã¹ããŒã¹ã圢æããŠäœ¿çšãå§ããŸããããã¯ãã©ã¹ã«ãªãå¯èœæ§ããããŸãã
æ¬åŒ§ã®äžã«ã¯ããªããžã§ã¯ããããŒã¿ããŒã¹ã«ä¿åãããªã©ãã¢ããªã±ãŒã·ã§ã³åºæã®ãã®ãããã€ããããŸããã
ããã³ã³ãã¥ãŒã¿ãŒã§ã¢ã«ãã ãå
¬éããå¥ã®ã³ã³ãã¥ãŒã¿ãŒã§ã¢ã«ãã ãååŸããããã»ã¹ã¯ããããªã§èŠãããšãã§ããŸã ã é床ã¯ã»ãŒç¬æã§ãããå€ãã®èŠå ã«äŸåããŸãã ã³ã³ãã¥ãŒã¿ãŒãåãã矀ããã«ãªã£ãŠããªãããã転éãå®äºã§ããªãå ŽåããããŸããã
äžèšã®ãã¹ãŠã@metabin/gate
ãšåŒã°ããnpmã¢ãžã¥ãŒã«ãšããŠèª¬æããŸããã 詳现ãé ããéçºè
ã¯ipfsããŒããšjsonã¹ããŒã ãæž¡ãã ãã«ããŸãã
const gate = await openGate( ipfsNode,
çµè«
IPFSã¯ãåæ£æ
å ±äº€æã®ããã®æãå
é²çãªæè¡ã®1ã€ã§ãã äž¡æ¹ã®ããŒãžã§ã³ïŒããã³goããã³javascriptïŒãã¢ã«ãã¡æ®µéã«ãããšããäºå®ã«ããããããããããã¯OpenBazaarãd.tubeãªã©ã®æ¯èŒç人æ°ã®ããã¢ããªã±ãŒã·ã§ã³ã§æ¢ã«äœ¿çšãããŠããŸãã ãã1ã€ã¯ãäž»ã«ãã¡ã€ã«ã¹ãã¬ãŒãžãšããŠã®ã¿äœ¿çšããããšã§ãã
ããã¯ãIPFSãäž»ã«BitTorrentã®äžçš®ãšããŠèããããŠããããšãèãããšç解ã§ããŸãã IPLDã®æŠå¿µãšå¯Ÿå¿ããã€ã³ã¿ãŒãã§ã€ã¹ã®æ©èœã泚ç®ãããããšã¯ãã£ãã«ãããŸããã ç§ã®æèŠã§ã¯ãããã¯ãããã³ã«ã©ãã®æãææãªéçºã§ãããIPFSãä»ããŠéåžžã®ããŒã¿ãªããžã§ã¯ããé
åžããããšãå¯èœã«ããŸãã
ãããŠã files
ã dag
ãããã³pubsub
ã€ã³ã¿ãŒãã§ãŒã¹ãç°¡åãªæ¹æ³ã§çµã¿åãããããšã«ãããéçºè
ã¯èªåã®ã¢ããªã±ãŒã·ã§ã³çšã®ç¡æã®èªå·±çµç¹åããŒã¿ãœãŒã¹ãååŸããŸãã Electronãè¿œå ããŠãããªãé
åçãªæè¡ã¹ã¿ãã¯ãååŸããŸãã
- ãµãŒããŒãå¿
èŠãšããŸãã
- ãã¡ã€ã³åã¯å¿
èŠãããŸãã
- ããŒã¿ã®é
åžé床ã¯åå è
ã®æ°ãšè³ªã«ãã£ãŠã®ã¿å¶éãããŸã
- è€éããšããŒã¿æ§é ã¯æ³ååã«ãã£ãŠã®ã¿å¶éãããŸã
- ã¯ãã¹ãã©ãŠã¶ã®ãµããŒããæ°ã«ããå¿
èŠã¯ãããŸãã
- é«ãæ€é²æµæ
ãã¡ããããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ããã®ãããªèªåŸæ§ãå¿
èŠãšããããã§ã¯ãããŸãããã³ã³ãã³ãã®å¶åŸ¡ã倱ãããšã«ãªããŸãã ããããã¹ãŠãéåžžã«å®éšçãªåéã§ãããšããäºå®ã¯èšããŸã§ããããŸããã ãã®ãããªãããã¯ãŒã¯ãã©ã®ããã«ã¹ã±ãŒãªã³ã°ããããçç£æ§ã«ã©ã®ããã«åœ±é¿ãããããã®ããã»ã¹ã«åœ±é¿ãäžããããšãã§ãããã©ãã-å€ãã®è³ªåãããããã以äžã«å®åŒåãããŠããŸããã
ããã«ããããããã奜å¥å¿ããããæ©äŒãšå±æãéãããŠããŸãã
åç
§è³æ