利用IPFS構建短視頻區塊鏈應用開發經歷(八)

本系列文章是針對 https://blog.csdn.net/weixin_43668031/article/details/83962959 內容的實現所編寫的。開發經歷包括思考過程、重構和推翻重來。

已經完成了對最快的ipfs網關進行檢測,接下去需要本地新建一個ipfs節點和一個eth節點。
eth節點可以使用全節點方式,使用bin文件啓動一個全節點進程,去同步日誌數據,達到數據完整性的目的,當然在瀏覽器端這樣做肯定不方便,因此我調用web3接口,並且檢測瀏覽器有沒有加載MetaMask插件,如果加載了插件就是用插件提供的eth鏈路,如果沒有安裝插件,是用公開的ethrpcjson服務,當然這一點,連接怎麼樣的eth鏈路用戶是可以自己選擇的。
我事先定義了一些文件,諸如前文中的gateways.conf,這裏我多定義了2個靜態文件config.js和ABI,
https://github.com/bill080307/douyinWithEth/blob/8c489f3f9945e42d3650a00c7cabd477c1864589/public/config.js
https://github.com/bill080307/douyinWithEth/blob/8c489f3f9945e42d3650a00c7cabd477c1864589/public/videoShare_abi.js
config.js 文件裏的數據我還沒有想好是否真正使用js格式,或者使用json格式的配置文件更適合呢?有可能未來會來回變動。

        let web3js;
        //檢查是否開啓的插件
        if (typeof web3 !== 'undefined') {
          //使用插件的ethAPI
          web3js = new Web3(web3.currentProvider);
        } else {
          //使用外置的ethAPI
          web3js = new Web3(new Web3.providers.HttpProvider(config["network"][0]["httpApi"]));
        }

如果瀏覽器加載插件,檢查web3這個變量就可以了,因爲加載插件後在瀏覽器對象windows.web3, web3js 是web3類的一個實例。
在這裏插入圖片描述

        //定義合約
        const videoShare = new web3js.eth.Contract(videoShareAbi, config["network"][0]["contractAddress"]);
        this.$store.commit('setVideoShare', videoShare);
        //檢測是否登陸
        web3js.eth.getAccounts((error, result) => {
          if (result.length > 0) {
            this.$store.commit('setUserAccount', result[0]);
            this.userAccount.address=result[0];
            //獲取用戶信息
            videoShare.methods.getUserInfo(this.userAccount.address).call().then((res) => {
              console.log(res)
              if(res.nickname!==""){
                this.userAccount.nickname=res.nickname;
              } else {
                this.userAccount.nickname=addressab(this.userAccount.address);
              }
              console.log(res);
            })
          }
        })

變量videoShare是一個合約實例,並儲存在全局變量中,在eth網絡這邊,也有幾種狀態:
1.未連接到eth網絡中
2.僅僅能獲取數據,連接到了eth網絡,但是未登錄,有可能是通過外部公共jsonrpc連入網絡的,也有可能是沒有對賬號解鎖,或者沒有新建賬號過,讀取不到用戶。
3.已經有賬號了,而且已經解鎖狀態了,能獲取到賬號地址。
這幾種狀態都有不同的特徵,不同的權限,這裏需要注意一下,後面會用得到的。

我定義了一些助手函數,比如addressab,我覺得eth地址太長了,中間可以用…去縮短一些,這樣看上去美觀一點。在標示用戶的時候可以使用暱稱,如果用戶沒有設置暱稱可以用這個地址縮寫來表示。

複製編譯好的ipfs.js文件到public目錄,然後在index.html引入。
創建一個ipfs節點:app.vue

        const ipfsNode = new window.Ipfs({
          // TODO fix issue with persistance
          repo: '/ipfs-' + Math.random(),
          config: {
            Addresses: {
              Swarm: [
                '/dns4/ws-star.discovery.libp2p.io/tcp/443/wss/p2p-websocket-star/'
              ]
            }
          },
          EXPERIMENTAL: {
            pubsub: true
          }
        });

其中repo: '/ipfs-' + Math.random(),每次都需要新開一個空間,否則會有權限錯誤,
'/dns4/ws-star.discovery.libp2p.io/tcp/443/wss/p2p-websocket-star/'是一個libp2p的連接節點,通過他可以連接到其他ipfs節點。
擴展屬性裏我加了EXPERIMENTAL: {pubsub: true}初期暫時還用不到,計劃在以下場景裏使用:
1 觀看一個視頻時,可以統計有多少人和你一起在看。
2 觀看直播(視頻)時,發送實時彈幕

接下去就是一個檢測,每10秒,輸出一下我當前的狀態

          ipfsNode.once('ready', () => {
            console.log("ipfs node ready.");
            //每隔10秒輸出一下連上的ipfs節點的數量
            setInterval(() => {
                  ipfsNode.swarm.peers((err, peerInfos) => {
                      if (err) {
                          throw err
                      }
                      if (peerInfos.length > 0) {
                        console.log(peerInfos.length+" ipfs node Connect.");
                      }
                  })
              }, 10000)
          })

在這裏插入圖片描述
這是控制檯,啓動節點了,並一直在打印有多少個節點與我建立了連接。可以看到節點數量穩定在35-36個左右,我相信未來會有更多的節點連入,當ipfs的網絡更加健壯。
在這裏插入圖片描述
這是網絡的信息,可以看到我連接了一個libp2p節點,並通過他我連接到了更多的節點。正在發現並連接到更多的節點。

挖坑:
我一開始採用了nodejs裏的IPFS,通過npm install ipfs --save 來完成安裝,但是沒有跑通。由於我對nodejs並不熟悉,不想再這個地方花太多時間,這裏採用了調用別人編譯好的ipfs.js足足達到了可怕的2.4M,未來我一定要打好基礎,重新使用npm的方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章