恒星やIPFSとアプリケーションを構築する


一方EthereumはDAppsを書くための選択のプラットフォームであったarguably 本当に低いトランザクション手数料を持っていて、他のブロック(Ethereumを含む)より非常に速いです.
それで、私は実際に、それが星のブロックチェーンを使用しているHackerNewsまたはredditのようなフォーラムの分散版を構築するように見えるかについて疑問に思い始めました.ここで私がどのように働くかを思い描いた大きな絵があります.

我々がそれを実行する方法について見ましょう.
第一に、我々はcreate an account ステラTestnetについて何がtestnetですか?最も簡単な用語では、それはあなたが実際の手数料を発生させないテストのためのブロックチェーンです.この場合、テストのために10 Kの偽のルーメンでテストアカウントをロードします.
次に、我々は、ユーザーがアプリケーション上で自分のポストを提出できるようになる小さなJavasScriptクライアントを構築します.
我々は直接このポストを取ることができるとユーザーは、トランザクションのメモフィールドにそれを置くことによって我々のアプリのアカウントに送信してください.STERAのトランザクションは、限られたメモ形式のみを許可します-テキスト(UTF - 8文字列までの28バイト)、ID(符号なし64ビット整数)またはハッシュ(32進数形式の32進ハッシュ).それで、大量のテキストまたはJSONを保存することは問題外です.
IPFSに送る
IPFSが入っているのは、P 2 Pプロトコルとネットワークで、すべてのデバイス間で分散ファイルシステムにコンテンツを格納し共有するように設計されている(GitとBitTorrentの愛の子として考えてください).
そのデータを受け取り、IPFSのJSONオブジェクトに格納します.
import ipfsAPI from 'ipfs-api'

// I'm just using an IPFS gateway here for testing but in a real-world setting, we would run our own IPFS node so we can persist data
const ipfs = ipfsAPI({ host: 'ipfs.infura.io', port: 5001, protocol: 'https' });
const post = JSON.stringify({title: 'So exited!!!', content: 'This is my first post on the blockchain!', username: 'h4ck3r'})
const buffer = Buffer.from(post);

ipfs.files.add(buffer, { pin: false }, (err, ipfsHash) => {
  console.log(ipfsHash[0].path) // => QmV3C3HFE8824KWYTMq5fbZyF93GTMz5W7h3uBG1oVZCv8
});
今、我々はメモフィールドに送るのに十分小さいハッシュを持っています.もう一つの問題があるかもしれません.ipfsはファイルとオブジェクトのハッシュを表すMultihash multiformat を返します.接頭辞Qm アルゴリズム(SHA - 256)とIPFSによって使用される長さ(32バイト)に対応します.
それで、我々が我々のトランザクションのテキストフィールドにこれを加えることができないように見えます.
そこで、このIPFSハッシュを32進数ハッシュに変換する関数をHex形式で書く必要があります.
import bs58 from 'bs58'

this.getBytes32FromIpfsHash = (ipfsListing) => {
  // Decode the base58 string and then slice the first two bytes
  // which represent the function code and it's length, in this case:
  // function:0x12=sha2, size:0x20=256 bits
  return bs58.decode(ipfsListing).slice(2).toString('hex')
}
ブロックに追加
メモフィールドに格納する正しいハッシュを持っているので、実際にこのトランザクションを送信する方法を理解しなければなりません.つのオプションを使用するようにユーザーを促すことですMetaPay これは恒星のためのクロム拡張財布です.Metapayをインストールしたら、次のようにURLを設定できます.
<a ref='savePost' data-meta-pay
    href="https://stellar.meta.re/transaction?to=[address]&amount=1&memo=[txMemo]"
    target="_blank" >Save Post</a>
ここでまとめると、POST論理は次のようになります.
import StellarSdk from 'stellar-sdk'

// Add the post data to IPFS
this.submitPost = (post) => {
  const buffer = Buffer.from(post);
  ipfs.files.add(buffer, (err, ipfsHash) => {
    this.txMemo = this.getBytes32FromIpfsHash(ipfsHash[0].path)
    this.refs['savePost'].click() // This will open the MetaPay popup
    this.confirmPayment(this.txMemo) // Listen to see if the transaction went through
  });
}

// Check to see if the transaction went through
this.confirmPayment = (ipfsHash) => {
  const server = new StellarSdk.Server('https://horizon-testnet.stellar.org');

  server.transactions().forAccount('OUR_ACCOUNT_ID').cursor('now').stream({
    onmessage: (transaction) => {
      if(transaction.memo == ipfsHash) {
        // Yes, it made it on the blockchain!
        transaction.operations().then((ops) => {
          var payment = ops._embedded.records[0];
          if(parseInt(parseFloat(payment.amount)) < 1) { 
            console.error('Payment insufficient. Post not saved!');
          } else { 
            this.pinIpfsListing(ipfsHash); 
          }
        }).catch((error) => {
          error.target.close(); // Close stream
          console.error('Payment Error: ', error);
          alert('Error confirming payment. Try again later');
        });
      }
    },
    onerror: (error) => {
      error.target.close(); // Close stream
      console.error('Streaming Error: ', error);
    }
  });
}
これは、すべてのプリフィールフィールドでMetapayポップアップを開き、ユーザーがトランザクションを通過するかどうかを確認します.

IPFSでそれを持続する
// If successful, pin our post on the IPFS node
this.pinIpfsListing = (ipfsHash) => {
  ipfs.pin.add(ipfsHash)
}
我々がIPFSに我々のデータを加えたとき、我々はそれを暗証しませんでした.ポストをピン止めすることなく、我々のデータは永久にIPFSノードに保存されず、最終的にガベージコレクションされます.
したがって、小さなトランザクション料金は私たちがIPFSノードを実行するデータ/コストをピン止めするのを支払うのを助けて、データがすべてのユーザーに利用可能であることを確認します.
ブロックチェーンからお読みください
今すぐ他のユーザーがアプリケーションを訪問すると、我々はすべてのトランザクションは、このアプリのアカウントに投稿プル、メモフィールドをつかむ、ベース58にそれをエンコードし、IPFSからデータをプル
import StellarSdk from 'stellar-sdk'
import ipfsAPI from 'ipfs-api'

this.getIpfsHashFromBytes32 = (bytes32Hex) => {
  // Add our default ipfs values for first 2 bytes:
  // function:0x12=sha2, size:0x20=256 bits
  const hashHex = "1220" + bytes32Hex
  const hashBytes = Buffer.from(hashHex, 'hex');
  const hashStr = bs58.encode(hashBytes)
  return hashStr
}

const server = new StellarSdk.Server('https://horizon-testnet.stellar.org');
const ipfs = ipfsAPI({ host: 'ipfs.infura.io', port: 5001, protocol: 'https' });
let posts = [];

server.transactions()
  .forAccount('OUR_ACCOUNT_ID')
  .order('desc')
  .call()
  .then((page) => {
    page.records.forEach(record => {
      if (record.memo) {
        const ipfsListing = this.getIpfsHashFromBytes32(record.memo)
        ipfs.files.get(ipfsListing, function (err, files) {
          files.forEach((file) => {
            const post = file.content.toString('utf8')
            posts.push(post) // Show this to the user
          })
        })
      }
    });
});
地方分権
このアーキテクチャは、我々のデータが分散されていることを確認しますが、アプリ自体についてはどうですか?アプリがダウンした場合、ユーザーはそのアカウントのブロックチェーンから読み取ることができますし、対応するデータをIPFSからプル別のクライアントを書くことができます.
私たちは一歩一歩進んで、実際にクライアントコードをブロックチェーンに保存することもできましたmanageData アカウント操作.
このようなものは、アプリケーションのビルド/展開チェーンの一部である可能性がありますので、毎回新しいバージョンがリリースされ、それもブロックチェーンに追加されます
import fs from 'fs'

this.publishClient = () {
  const code = fs.readFileSync('my_project/client.js');

  ipfs.files.add(buffer, (err, ipfsHash) => {
    const server = new StellarSdk.Server('https://horizon-testnet.stellar.org');

    server.loadAccount('OUR_ACCOUNT_ID').then((base) => {
        const tx = new StellarSdk.TransactionBuilder(base);
        const data = {name: 'v1.0.0', value: ipfsHash[0].path};
        tx.addOperation(StellarSdk.Operation.manageData(data));
        var builtTx = tx.build();
        builtTx.sign(StellarSdk.Keypair.fromSecret('OUR_ACCOUNT_SECRET'));
        return server.submitTransaction(builtTx);
    });
  });
}
何かを念頭に置いておくが、各データエントリは、アカウントに保持するために必要な最小のバランスを増加させる.それで、我々は最後のバージョンまたはクライアントCodeBaseのバージョンの最後のカップルをアカウントに維持するだけでよいかもしれません.しかし、それは我々のデモアプリケーションを多かれ少なかれ分散化するために十分である必要があります.
結論
これは面白い思考実験だったが、このデモのアプリはまだ、我々はいくつかの恒星プラットフォームが可能であることによって制限されているので、コメント、upvotesなどを管理する方法を持っていない.
より高度な何かをビルドするには、EthereumやNeoのような本当のDAPPプラットフォームでビルドする必要があります.
しかし、Facebookのデータとユーザーのプライバシーの最近の論争で、それは確かに分散されている社会的なアプリを構築する方法について考える時間です.
このようなプロジェクトには面白い仕事がたくさんありますDatawallet , Blockstack , Akasha そして、今後数年間でフォローするのが面白いでしょう.
この投稿は当初公表されたmy blog . あなたがこのポストが好きであるならば、それをソーシャルメディアと共有してください!