[#4 Crypto Zombies]ゾンビバトルシステム
9013 ワード
✍🏻 エンティティの概念
関数コントローラ
アクセス制御者 を呼び出すこともできます. ステータスコントローラ 両方とも外部から呼び出されると、ガスが全く消費されない場合、他の関数で内部呼び出されると、ガスが消費されます.
カスタムコントロール これらの制御者がどのように影響するかを決定するために、関数で論理を構成できます これらのコントローラは、次のように1つの関数で使用できます.
汚れ汚れ汚れはエーテルを受け取ることができる特殊な関数タイプです!paymentは、イーサを受信できる特殊な関数タイプです. イーサネットのお金、データ、契約コード自体がイーサネット上に存在するため、関数を実行しながら契約に支払うことができます. これにより、関数を実行するために契約に一定の金額を支払う構造を作成できます.
ここで起こったことは、
注意:関数が
💸 オブジェクト
ATMを送信すると、ATMのイーサアカウントはイーサに格納され、そこに閉じ込められます.したがって、契約からイーサを抽出する関数を作成する必要があります.
契約からイーサを抽出する関数は、次のように記述できます.
伝達関数の使用 そして たとえば、ある人がプロジェクトに追加料金を支払った場合、イーサは または買い手と売り手との契約において、売り手の住所を これにより、誰にも制御されない分散市場を創造することができます!
🪅 イーサネットでの乱れの作成
😂 Soledityでは、乱水を安全に生成できない……!
keccak 256による整数の生成(無効...)
keccak 256を使用して整数を生成する方法solidityで整数を作成する最良の方法はkeccak 256ハッシュ関数を使用することである. 乱数は以下のように生成できる
その後、
keccakが使用できない理由
この方法は不誠実なノードの攻撃を受けやすい.
Ethernet認証プロセス
イーサー坊では、contractの関数を実行すると、
その後、ネットワーク内のノードは複数のトランザクションを収集し、計算が非常に複雑な数学的問題
その後、これらのトランザクション・グループは、それらの
あるノードがPoWを解放すると、他のノードはそのPoWの解放を停止し、そのノードが送信したトランザクション・リストが有効であることを確認します.
有効な場合は、ブロックを受け入れ、次のブロックの解凍を開始します.
これは私たちの構造関数を脆弱にします.
処理可能なトランザクション
コイン投げの試合を使うと仮定します.正面が現れるとお金が2倍になり、反対側が現れると、誰もが失います.前後ビューを決定する際には,上に見た乱関数を用いると仮定する.(random>=50はフロントビュー、random<50はバックビュー).
ノードを実行している場合は、共有せずに
その後、私が勝ったことを確認するために、コイン関数を実行することができます.
もし私が負けたら、解凍中の次のブロックにトランザクションを含まないことを選択してください. 私は無限に繰り返して、私が最終的にコインに勝って、次のブロックを解いて、私はそこから利益を得ることができます. では、エーテル坊では、どのようにして安全に卵子を作るのでしょうか.
ブロックチェーンのすべての内容はすべての参加者に公開されます.これは解決しにくい問題であり、解決方法はいろいろあります.StackOverflow
1つの方法は、
Oracleを使用してブロック・チェーンの外に安全な数値を作成するチェーンで使用
関数コントローラ
アクセス制御者
private
:調整中の他の関数からのみ呼び出すinternal
:privateと同様ですが、その契約を引き継ぐ契約からexternal
:場外通話のみpublic
:内部および外部からのコールview
:この関数を実行してもデータは保存/変更されませんpure
:この関数は、ブロックチェーンにデータを格納せず、ブロックチェーンからデータを読み込まないカスタムコントロール
onlyOwner
とaboveLevel
は同じです!function test() external view onlyOwner anotherModifier { /* ... */ }
Payables Controls(ファンクションControls)汚れ汚れ汚れはエーテルを受け取ることができる特殊な関数タイプです!
contract OnlineStore {
function buySomething() external payable {
// 함수 실행에 0.001이더가 보내졌는지 확실히 하기 위해 확인
require(msg.value == 0.001 ether);
// 보내졌다면, 함수를 호출한 자에게 디지털 아이템을 전달하기 위한 내용 구성
transferThing(msg.sender);
}
}
ここで、msg.value
は、Contract Loaderがどれだけのデータを送信したかを決定する方法であり、ether
はデフォルトで含まれる単位である.ここで起こったことは、
web3.js
(DAPPのJavaScriptフロントエンド)で次の関数を実行する人がいる場合に発生します.// `OnlineStore`는 이더리움 상의 컨트랙트를 가리킨다고 가정한다.
OnlineStore.buySomething({from: web3.eth.defaultAccount, value: web3.utils.toWei(0.001)})
value
フィールドを参照して、JavaScript関数が呼び出されたときに、そのフィールドを通じてどれだけether
が送信されるかを決定します.注意:関数が
payable
と表示されず、試写画像に示すようにイーサを送信すると、関数はトランザクションを拒否します.💸 オブジェクト
ATMを送信すると、ATMのイーサアカウントはイーサに格納され、そこに閉じ込められます.したがって、契約からイーサを抽出する関数を作成する必要があります.
契約からイーサを抽出する関数は、次のように記述できます.
contract GetPaid is Ownable {
function withdraw() external onlyOwner {
owner.transfer(this.balance);
}
}
💡 Ownable
とimport
のオファーを使用したと仮定します.伝達関数の使用
owner
イーサは、関数を使用して特定のアドレスに送信することができる.onlyOwner
は、見積書に保存されているすべてのtransfer
を返します.もし100人のユーザーが私の契約のために1イーサを支払ったら、this.balance
100はもっと高くなります.잔액
は、関数を使用して特定のイーサネットアドレスにお金を送信することができる.this.balance
を返す関数を作成することもできます.uint itemFee = 0.001 ether;
msg.sender.transfer(msg.value - itemFee);
transfer
に保存し、誰かが売り手の品物を購入した場合、買い手から受け取った費用を彼に渡すこともできる.msg.sender
🪅 イーサネットでの乱れの作成
😂 Soledityでは、乱水を安全に生成できない……!
keccak 256による整数の生成(無効...)
keccak 256を使用して整数を生成する方法
// Generate a random number between 1 and 100:
uint randNonce = 0;
uint random = uint(keccak256(now, msg.sender, randNonce)) % 100;
randNonce++;
uint random2 = uint(keccak256(now, msg.sender, randNonce)) % 100;
この例では、storage
のタイムスタンプ値、seller.transfer(msg.value)
のインクリメントnow
が受信されます(同じ入力で、同じハッシュ関数を複数回実行することはできません).その後、
msg.sender
を使用してこれらの入力を任意のハッシュ値に変換し、変換されたハッシュ値をnonce
に変換し、keccak
を使用して最後の2桁の数字のみを受信する.これにより、uint
間の完全な整数が得られる.keccakが使用できない理由
この方法は不誠実なノードの攻撃を受けやすい.
Ethernet認証プロセス
イーサー坊では、contractの関数を実行すると、
% 100
通知ネットワークのノード0과 99
またはtransaction
ノードとして実行されます.その後、ネットワーク内のノードは複数のトランザクションを収集し、計算が非常に複雑な数学的問題
하나
を先に解いてみます.その後、これらのトランザクション・グループは、それらの
여러
(PoW)とともにネットワーク上に配置される작업 증명
.あるノードがPoWを解放すると、他のノードはそのPoWの解放を停止し、そのノードが送信したトランザクション・リストが有効であることを確認します.
有効な場合は、ブロックを受け入れ、次のブロックの解凍を開始します.
処理可能なトランザクション
コイン投げの試合を使うと仮定します.正面が現れるとお金が2倍になり、反対側が現れると、誰もが失います.前後ビューを決定する際には,上に見た乱関数を用いると仮定する.(random>=50はフロントビュー、random<50はバックビュー).
ノードを実行している場合は、共有せずに
작업 증명
トランザクションを通知するしかありません.(1つ以上のノードに実行を通知するだけ)その後、私が勝ったことを確認するために、コイン関数を実行することができます.
ブロックチェーンのすべての内容はすべての参加者に公開されます.これは解決しにくい問題であり、解決方法はいろいろあります.StackOverflow
1つの方法は、
_블록_
を使用して、イーサネットブロックチェーンの外部の構造関数にアクセスすることである.(内部で作成するのではなく、外部乱関数をインポート!)나의 노드
:イーサネット外部からデータを受信するセキュリティ方法の1つOracleを使用してブロック・チェーンの外に安全な数値を作成するチェーンで使用
Reference
この問題について([#4 Crypto Zombies]ゾンビバトルシステム), 我々は、より多くの情報をここで見つけました https://velog.io/@dandev_sw/4-Crypto-Zombies-좀비-전투-시스템テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol