3

私はプライベート イーサリアム ブロックチェーンで遊んでおり、いくつかのスマート コントラクトの実装に興味があります。ただし、これはブロックチェーンの新しい実装であるため、情報は非常に限られています。

例として、個人に関する情報を保持するコントラクトが必要だとします。ユーザーごとに新しい契約を作成するのと、同じ契約ですべてのユーザーに関する情報を保持するのとではどちらが効率的ですか?

疑似コードでは、2 つのオプションは次のようになります。

オプション 1 (個人ごとに新しい契約をインスタンス化する):

contract = // contract code

ethereum.newContract(contract, userInfo);

オプション 2 (1 つの契約ですべてのユーザーの情報を保持する):

contract = {
  var users = [];

  // other contract code
}

ethereum.newContract(contract, userInfo);

この場合の「効率」を定量化する方法は次のとおりです。

  1. 新しいコントラクトがインスタンス化されるたびに、コントラクトのブロックをマイニングし、ユーザーがコントラクトに対して行ったすべてのトランザクションをマイニングする必要があります。ただし、コントラクトを 1 つだけインスタンス化する場合は、コントラクトの展開を 1 回のみマイニングし、その後のトランザクションをマイニングしますが...
  2. すべてのユーザーのすべての情報を1 つのコントラクトに保存するオプションを使用する場合、コントラクト データの "差分" (すべてのユーザーの "配列") のみがブロックとして保存されるか、データ セット全体が 1 つのコントラクトに保存されます。ブロックごと?または...
  3. 「ユーザーごとのコントラクト」のオプションを使用する場合、コントラクト定義全体を複数回保存すると「スペースを浪費」しますか?

私の質問が明確であったことを願っていますが、そうでない場合はお知らせください。この質問は「トレードオフ」の 1 つだと思います。

(Re: タグ -- 私は Ethereum の golang 実装と、それと対話するための JavaScript API を使用しています。)

4

2 に答える 2

3
  1. はい。ただし、ユーザーを追加するたびに、既存のコントラクトに新しいレコードを追加するためのトランザクションを送信する必要があります。

  2. ブロックはトランザクションで構成されます。ユーザーを追加するたびに、対応する関数呼び出しのトランザクションを作成する必要があります。ただし、これを行う必要があるのは 1 回だけで、データが将来のブロックに重複してコピーされることはありません。

  3. はい。

あなたの質問が構造化されている方法から、トランザクションとブロックの違いについてもう一度読む必要があるようです。

于 2015-12-25T18:21:37.530 に答える
0

ユーザー オブジェクトが大きすぎない場合は、すべてのユーザーに対して 1 つのコントラクトで十分です。

上記のコードから、map配列よりも効率的にユーザー レコードを取得できる を使用することをお勧めします。名と姓など、任意の文字列でレコードをキー入力します。

mapping(string => user_struct) public users;
于 2017-12-13T20:17:17.163 に答える