Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
私有测试网络! }. h; P6 N' Q. T* o
- T$ `* w+ `9 ?2 p+ o
    NEOLux提供了一些方便的方法,可以用于将你的游戏连接到官方的测试网或者是主网。
% L$ Q# g+ ^8 v( {) X* d$ b8 {  g; c, j
    但在本教程中,我们会搭建自己的私有网络。这个过车是非常简单的,一旦你克服了最初的障碍(我会引导你),你会发现这比使用测试网络更加简单。例如,尽管填写用于测试的GAS或者Tokens的申请表格可能不是世界上最困难的任务,但我发现就这样一点点小摩擦,往往会扼杀我继续的热情和动力。
7 E8 Q- @9 j: a1 Z* s1 O$ @  t. B' H7 q
    你也可以在本地运行你自己的私有网络,不过在本教程中,我们将设置自己的服务器。这会使得团队工作或者构建工作这类事情更加简单直接。我将使用DigitalOcean。因为根据我的经验,他们具有良好的性价比。
' y( W0 p- R4 J% m4 E  K0 j' R" j, {1 N7 e: Z  H
    免责声明:我不是一个后端/服务器开发者,我猜“中等”水平的人应该会喜欢使用命令行工具。对于那些知道自己在做什么的人来说,这些内容应该很容易。如果你了解Linux和Docker的话,可以直接从DockerHub安装NEOPrivateNet并使用DockerCompose运行NEOSCAN。对于其他那些或多或少是我这种水平的人来说,接下来的内容应该还是相当简单直接的。1 c2 l' H# j4 `

, ~3 r, S( ]- M4 _9 D6 g. x    如果你还没有DigitalOcean账户的话,就去创建一个。然后使用以下选项创建一个Droplet。
$ t3 E4 `4 n- N  p3 j. i3 n( B" f% D: r& \
    使用16.X或者18.X版本的Ubuntu4 X: Y, O; Q; }; K! q

2 z9 D, ?$ `" Q. l* ?) Y    使用中配应该就足够了–你可以在配置中自行尝试,并在评论中告诉我你的试验的结果' N% g! O' B( ~+ _7 V

) T7 T7 ]* ?* J( q& f: P) B9 K& R, J    SSH登入到你新建的Droplet并安装docker。如果你按照DigitalOcean提供的指南进行操作的话,这个过程将非常简单:https://www.digitalocean.com/com ... ker-on-ubuntu-18-04: n! P" B) a3 L; q" K1 X7 a* k
1 S/ W" I, Q: K2 \. F: G
    注意:在执行最开始的一步,向系统添加官方Docker库的GPG键这步操作时,我遇到了点小问题。我只是简单地跑了两次命令,然后一切都很顺利。
  h/ B) j- l$ E$ Q2 D
$ l/ H; i0 O+ [* S    然后安装docker组件。同样地,安装说明非常的简单。只需要确保你看的是针对Linux系统的说明就行。( L7 t0 |$ p8 K9 L2 ^
& A. }2 ]2 _, |
    安装私有网络和NEOSCAN/ d" G% A; Y$ E  ^
/ V  ?8 b, A- W9 D, |& h
    运行和安装我们自己的私有网络,这是最为困难的一步,好在CityofZion的人帮我们很好的做到了这一点。你可以点击这个链接查看他们的全部说明指导。同样地,SSH登录到你的Droplet,基本上我们只需要输入几个命令就行:
4 Z' {9 ?6 ?$ ~' l; i$ M" b# R/ I/ ]& Q
    首先,从hub上下载docker镜像:- e# `0 u- F+ ]' `+ e7 }

0 g$ s: ]$ p: q8 R9 d. Y    dockerpullcityofzion/neo-privatenet
- K7 O" l( l; G: V1 J% l8 i
9 V& t1 |: g% X' C) k    …下载NEOSCAN…9 y  K! u+ b5 v6 D( ^

5 O) F9 K( \3 J8 o2 h+ f) G    wgethttps://raw.githubusercontent.co ... /docker-compose.yml  b. A% B$ y  n9 o& _5 U9 i: Z
4 L4 H" Z' O% W+ `9 N
    …并运行privnet…: M. P4 g1 X3 T% `3 {5 M) W
0 I6 H7 a9 ?" L
    docker-compose-fdocker-compose-neoscan.ymlup8 K# p) P2 R7 X* s7 G

; R5 `/ {! T8 n: s! |2 X2 N    让它运行起来,然后转到http:your-droplet-ip-address:4000查看NEOSCAN的运行情况:0 G" d/ u9 E) f0 R
, B0 l3 x) [% y" \
    回到Unity
! B, K% W, v$ f) U( k, y% j& d( |% C' f
    我不想在本教程中深入探讨自己的开发风格,不过我要做的一件事就是将UniRx插件导入Unity中。UniRx是对.NETReactiveExtensions的重新实现,它针对Unity做了优化处理,而且能很好地兼容iOSIL2CPP。不必过于复杂的实现,它可以简化一些管理NEO和UI的代码。
2 m2 B" S' V* f: g& e
4 X7 i4 C/ @* w5 A0 t7 d1 O5 b    在资产(Assets)–>脚本(Scripts)下创建另一个名为NEOManager的脚本,并复制+粘贴以下代码:
1 x; d7 a0 G7 ^9 [% k
7 h' k& C+ Q& f# ^0 F) p7 `    usingSystem.Collections;
5 o; A, L  W& Z! i. e4 ~- c* x# a% v7 H- ^; \
    usingUnityEngine;
) |) s# w1 v  k  d: u  M- ^
: h6 u1 U  ]+ \$ h8 I    usingSystem;
& ?, g7 \) g' e% y8 k) ~- H: `" i6 w- o
    usingUniRx;+ }$ ~3 p6 }) |  g9 E
, w9 \; x: h# D: R9 W
    usingNeo.Lux.Core;, S' A; D' k/ N2 v, V

! N: M4 L1 G- h! d5 g% h5 M    usingNeo.Lux.Cryptography;
! K/ J; Y2 S$ O1 R6 j7 z/ W0 U" N) n: a9 c7 `0 J1 U
    usingUnityEngine.UI;
; X3 Y8 H- c6 C- T4 N% w4 p; A) J' D. [" H9 N7 d8 L$ c
    publicclassNEOManager:MonoBehaviour; z2 ~- y5 i1 x4 x$ ^+ D( |7 E
* X1 {  ]# {! u) F7 y$ N
    {
& m% U) [/ l" k/ n6 _
2 I& n! o# p7 ]4 Z" u; t    publicNeoAPIAPI;" R; g; e5 X0 F6 y
4 l7 `. X+ x- R' t
    [SerializeField]privatestringRpcIP;
( L3 }# D- l" ^: E; i3 h
. V% P6 F% W$ o! b5 u+ {; d    publicconststringAssetSymbol="GAS";
7 r1 W, Z/ o/ V4 E* |0 @, a* R" H, ]" W( E2 V: i3 ]' x6 }7 a5 e0 y
    [HideInInspector]
! n: ]& e  h  ?9 v, \+ \- l7 ?
. {5 j  M) Y2 x, o5 W! T& |5 V  q    publicKeyPairReactivePropertyPlayerKeyPair=newKeyPairReactiveProperty();2 Q% D4 I" n% I: F
* Y2 i; c) |; t- Y! a7 W4 ^$ s
    [SerializeField]privateTextaddressText;
; @6 W# F" U6 T/ s; b( \" q3 I# u, n1 ^, ^! j$ B8 [
    [SerializeField]privateTextbalanceText;, A$ Z, n$ K6 P
( [9 \: _" Z  b8 i+ x3 i% k
    publicDecimalGASBalance;# W8 H. T* Z+ m) W
& Z- ]: r1 N; l/ n0 ~
    privatevoidOnEnable()
2 {  |9 H' Z, c, K; b% M8 W7 y4 F1 H- Q- v2 J0 ^' S0 s5 c& L0 A' M, Z
    {
/ d% y2 [3 u3 U7 K; {6 y8 Y
# e4 p+ j8 j% T/ w$ J3 ~' O    PlayerKeyPair.Value=KeyPair.FromWIF("KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr");$ `& }6 n& o) k' |2 E$ p( P3 e* {$ _

% C- N- W! l2 w* H. L8 M( L0 m3 s    #ifUNITY_EDITOR5 u0 @) g8 V% w
8 p  T+ M9 A5 I( `, i4 B6 f$ \
    //this.API=newLocalRPCNode(30333,"http://localhost");
6 B# j( g# @# x$ x' Z, x& N/ p3 S+ E/ s
    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);
' I) Z$ J% O1 @9 {, [7 F: J- D/ _. l0 f7 z
    #else
. W& M# ]5 l, n% m- y% P8 x- |( A  G& X0 h' d4 Z; M; ~
    //this.API=NeoRPC.ForTestNet();
; K6 H6 h/ a/ U" [7 T! M2 R# x: ?7 w+ B8 b* u; S3 J
    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);! d1 a* Y5 L/ ?) v" D
/ v  l$ [* }; Z$ x! ~1 q4 d
    #endif/ D1 M0 n8 ~/ S  a1 B+ n! ?
- R: K- q' Q3 U
    this.PlayerKeyPair.DistinctUntilChanged().Where(kp=>kp!=null).Subscribe(keyPair=>
6 e% l1 F9 O3 M/ I; R
% _% M4 T: K8 N    {
" J( J" v8 i/ S% E" `% {. s- c
( R1 R! E3 r2 B' w- `3 j/ Y    this.addressText.text="Address:"+keyPair.address;4 X3 Q2 B# N0 R9 N
/ {, ]3 X/ t5 e+ D  {7 }
    this.balanceText.text="Balance:Pleasewait,syncingbalance...";
8 Q) C' Z" T. K9 Y4 ^/ A8 M- m" \" J1 B8 B5 r; Z/ j
    StartCoroutine(SyncBalance());6 y6 h& w0 N3 P7 v$ z  @. s; K' U

2 @3 S9 \9 N6 {+ S: A    }).AddTo(this);
4 `% b9 N4 t* ^* X7 N# R$ s8 d/ b. ~2 m* M
    }
" l0 L* Y  s/ t2 O3 A' }7 O6 x* B4 N1 u& x3 p7 I
    privateIEnumeratorSyncBalance()$ T/ z. I( T( M
  S4 ~' n* y% H- S3 B- c' y
    {
# O5 Q. r% S7 y$ s9 }
3 n0 |8 e: z' u4 S6 ^$ C! N; W    yieldreturnnull;
2 w* b! k' q9 W7 [0 b
' ?7 T7 r' y- i0 G$ E  b) S    varbalances=this.API.GetAssetBalancesOf(this.PlayerKeyPair.Value);
$ {& d) v* C2 g' e6 W2 Y9 v
- a5 d& o7 P* S6 i( \+ [    this.GASBalance=balances.ContainsKey(AssetSymbol)?balances[AssetSymbol]:0;, A7 J" G/ t. P
2 m% J" |& G4 _4 B6 u
    this.balanceText.text="Balance:"+GASBalance.Value.ToString()+""+AssetSymbol;
1 }* L) I7 ?" U/ Z% j0 O) g% c
& p' W4 s' j; N    }( ^. R; Y- M4 F1 f

' x. c2 U( k' S0 w. s3 d: m    }8 T) j& ~7 u% f+ Z7 D9 l& V
0 c' i8 y3 {) F5 [
    [Serializable]
3 F. G. X% H5 a5 {! c+ D: b' F- O( W
# x" Y( Z/ f' e5 c0 x$ ?    publicclassKeyPairReactiveProperty:ReactiveProperty
% ^/ ]' K5 p1 K  n! c
1 N. N* {1 a( o1 G  G1 }    {# ?# }  l4 B8 H: S  O% v# q% o! R$ H* d
. \9 N* L& s! \6 B
    publicKeyPairReactiveProperty(){}1 w% Y( B& U3 h. f
: C' S2 M1 g; E5 f: U. v3 Z- |
    publicKeyPairReactiveProperty(KeyPairinitialValue):base(initialValue){}
$ t& [! V7 M  X: E& M( x% z$ w  w! T9 E( c2 @
    }& s% U9 Q8 T# Q) y
% ]  T, Z& T" i' @
    保存脚本然后返回主场景。创建一个空的游戏对象(GameObject),将其命名为NEO,然后创建一个该NEO对象的空的游戏子对象(childGameObject),并将其命名为NEOManager,并将NEOManager脚本添加到这个NEO对象中。在检查器(inspector)中的RpcIP字段旁边输入你的Droplet的IP地址。" j2 m1 A, w& v* M  @3 \# y1 t
2 c0 x7 e( d% P, O2 e% q
    接下来,我们将创建一些UI元素并将它们连接到检查器中,这样在连接到主网的时候,我们就可以看到余额的更新。
( l; E  u$ ^$ c; e% ^9 m2 V9 c2 P, z9 L7 w# Z+ ?
    创建UI画布并向其中添加两个子文本元素,然后单击并将它们的引用拖动到NEOManager的“(AddressText)”和“(BalanceText)”字段。
1 [6 m# b" O. X" w  ]: p: `
5 E) m+ T$ A4 P! w2 @5 U* w    单击播放(Play)按钮然后查看地址和余额的更新情况。8 W0 b$ }3 [2 L8 S! H' {
- E& G3 z9 J# I
    我们当前使用的是在安装私有网络时自动生成的测试账号。在下一部分中,我们会进行一些设置,以便我们的玩家可以输入他们自己的私钥然后开始与NEO区块链进行交互。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

往事随风760 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1