Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
私有测试网络8 }% K  u$ f/ ?0 ?9 v
. Q& V% F6 y! G  B" A
    NEOLux提供了一些方便的方法,可以用于将你的游戏连接到官方的测试网或者是主网。+ B) V% e- C' L  z! ]8 s" V8 J

/ @! D: e, l8 o( m: t7 g7 V" z/ C    但在本教程中,我们会搭建自己的私有网络。这个过车是非常简单的,一旦你克服了最初的障碍(我会引导你),你会发现这比使用测试网络更加简单。例如,尽管填写用于测试的GAS或者Tokens的申请表格可能不是世界上最困难的任务,但我发现就这样一点点小摩擦,往往会扼杀我继续的热情和动力。5 s7 B3 G: B/ t1 r! ]+ F0 M
% b) l# e# N3 x: W9 L# q$ a
    你也可以在本地运行你自己的私有网络,不过在本教程中,我们将设置自己的服务器。这会使得团队工作或者构建工作这类事情更加简单直接。我将使用DigitalOcean。因为根据我的经验,他们具有良好的性价比。
' @0 f. x8 U5 U* l- Q
8 B9 E) H1 F! j" y    免责声明:我不是一个后端/服务器开发者,我猜“中等”水平的人应该会喜欢使用命令行工具。对于那些知道自己在做什么的人来说,这些内容应该很容易。如果你了解Linux和Docker的话,可以直接从DockerHub安装NEOPrivateNet并使用DockerCompose运行NEOSCAN。对于其他那些或多或少是我这种水平的人来说,接下来的内容应该还是相当简单直接的。
9 l( _4 o% y) a3 W" j: x
( f+ z% `( t. y    如果你还没有DigitalOcean账户的话,就去创建一个。然后使用以下选项创建一个Droplet。
* _0 l" h8 B$ h0 `8 @" h" m. g
- ~0 M* R% m) w9 b+ S% A    使用16.X或者18.X版本的Ubuntu* b3 r3 _* h, J5 {" L

/ S/ h3 a; e4 d8 h) x' @    使用中配应该就足够了–你可以在配置中自行尝试,并在评论中告诉我你的试验的结果1 e& e$ d1 ~, [: K4 G$ f' g* l" A
6 L% D' Z5 p+ K, S, N" [, n
    SSH登入到你新建的Droplet并安装docker。如果你按照DigitalOcean提供的指南进行操作的话,这个过程将非常简单:https://www.digitalocean.com/com ... ker-on-ubuntu-18-04
: h" V& X$ ^& d
3 V  ^* I3 T* Q1 F    注意:在执行最开始的一步,向系统添加官方Docker库的GPG键这步操作时,我遇到了点小问题。我只是简单地跑了两次命令,然后一切都很顺利。& X- O1 \) E! Q2 G( P

! h6 E4 Z8 O9 t5 `0 r. `    然后安装docker组件。同样地,安装说明非常的简单。只需要确保你看的是针对Linux系统的说明就行。
' p# S6 g0 T& o3 E1 x8 H9 E& T, X" L, Z+ k
    安装私有网络和NEOSCAN
8 p1 [0 b* Y# Y# t. V
) V$ l% z/ i2 r: `    运行和安装我们自己的私有网络,这是最为困难的一步,好在CityofZion的人帮我们很好的做到了这一点。你可以点击这个链接查看他们的全部说明指导。同样地,SSH登录到你的Droplet,基本上我们只需要输入几个命令就行:
: B  s0 O* Z% w6 L7 j7 n& S. k: J
. g3 J# i" k! ?% Z1 t1 |* `8 D6 }    首先,从hub上下载docker镜像:
4 V/ F2 I9 n# R+ Q. ?; B" c. d# I* u6 v1 ^
    dockerpullcityofzion/neo-privatenet
; i4 t% F5 M, r* s8 ?# a: {& s5 D% z' o2 q' q3 O% [
    …下载NEOSCAN…7 Y) d# V7 }; t3 W$ z; ~: U& o- O0 U

/ p6 N7 O$ \9 e0 X* @" ~8 ?    wgethttps://raw.githubusercontent.co ... /docker-compose.yml
+ S; i# `- h( E- i% E
5 p) [7 q9 ^& l    …并运行privnet…" p! G7 ?3 }7 M- ?* Q) \) }3 b

. N* U, ?4 N4 p' w4 m    docker-compose-fdocker-compose-neoscan.ymlup4 ?3 J7 \8 b$ z. ?& F  ~; ?

+ S8 K" `# R6 R# ]    让它运行起来,然后转到http:your-droplet-ip-address:4000查看NEOSCAN的运行情况:
+ w8 q$ @4 y# k, T  d3 [
# S% c0 q/ y9 W2 Q! B9 Z    回到Unity7 x7 {2 Z$ v. x$ B, Q9 `
; b! }  E9 U! D) |$ H' W: a  r
    我不想在本教程中深入探讨自己的开发风格,不过我要做的一件事就是将UniRx插件导入Unity中。UniRx是对.NETReactiveExtensions的重新实现,它针对Unity做了优化处理,而且能很好地兼容iOSIL2CPP。不必过于复杂的实现,它可以简化一些管理NEO和UI的代码。
5 ~+ O- s+ R8 S. T5 w  `% E6 X9 D; d0 D3 ^
    在资产(Assets)–>脚本(Scripts)下创建另一个名为NEOManager的脚本,并复制+粘贴以下代码:  a: Q( V+ g& D, c: f+ M; W
5 ^) F, a" \1 n! t7 p) x8 J. u
    usingSystem.Collections;
5 m! R& e$ G' x5 g. `8 T8 {
1 N+ l6 b- q5 [9 c2 O, {    usingUnityEngine;; v% G( g4 c5 x1 g9 ~  {

' m$ ~! Z5 q" V" }6 ?    usingSystem;: Z/ o: u1 W6 m$ L; m* s
! V7 r  {+ n1 n5 o
    usingUniRx;$ |* M. m4 S3 H. {$ D  O1 R/ M, e
) P8 o. I* B) E9 E8 S( E
    usingNeo.Lux.Core;
6 V1 d$ a' W& a  U. p0 U# o
0 I2 E5 m0 b2 C' F" O/ l0 B    usingNeo.Lux.Cryptography;
2 g2 x; d. i( C$ ]: t; M
' T$ s) w4 y5 d( k* L    usingUnityEngine.UI;
& s* ?6 N* g( `  o. h8 Y  J! a* ^( ~4 e7 E
    publicclassNEOManager:MonoBehaviour/ v8 e' m9 H0 p+ _" ?' E

5 ^  X/ @6 A; f8 |. x5 m    {* t! e$ `  b; K# u; o' ^5 M( [  l6 }

+ w5 _4 t' o1 m- i9 d    publicNeoAPIAPI;* u: H2 Y9 i1 R. E7 j1 z

2 p9 p8 t) C1 e, ?' S    [SerializeField]privatestringRpcIP;5 c/ {3 Z: a) Z
9 w* P+ _# i: M' r" |
    publicconststringAssetSymbol="GAS";6 B' ~6 F/ \. J+ `
! D9 d! I- Y- ~" N% O
    [HideInInspector]
7 \1 \5 j& b8 t$ u. b, A5 c" `0 S. y  \' L* s2 E- Z' b3 t, y- W
    publicKeyPairReactivePropertyPlayerKeyPair=newKeyPairReactiveProperty();) V% o% A! i6 I
* R# h9 h6 ], x' D3 Y
    [SerializeField]privateTextaddressText;
! V4 b6 _8 k) J4 p+ }
9 O1 ^) L" a! L    [SerializeField]privateTextbalanceText;6 C+ W* m% t9 t) n! F
( Y4 b1 _9 E! j0 }
    publicDecimalGASBalance;: q. k1 N, W# F
, }3 S* ]! z* b/ i* C7 @
    privatevoidOnEnable()
; z, f; l" A- R! K. D. [) E% S7 c: }# }7 O+ W8 m( H
    {
( ~" H, p9 v9 |, Z$ U- R& t7 j1 \+ O/ |  g( G
    PlayerKeyPair.Value=KeyPair.FromWIF("KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr");
  `1 V2 t2 j. y2 ~$ U5 {& S, g$ y1 g( C+ i/ I
    #ifUNITY_EDITOR" Q2 [% e' Q& {; {' a& h, a" }

$ I/ T$ c; q  O' d+ g/ S" a5 F    //this.API=newLocalRPCNode(30333,"http://localhost");
5 U" k7 |( e' i" N: {, F& c/ d0 R* R
    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);7 `  V' x+ C8 j' E0 P
# E' R2 m5 Y; n3 m) N! O+ T
    #else" x+ I- M, \2 ]* A

7 r6 j' t$ O- T    //this.API=NeoRPC.ForTestNet();! _2 x9 S: ?# b, p+ R

% o2 ]9 C! `. Z  o9 x+ E! r9 h    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);: R* ^% M- P0 F( q$ L6 ^3 P

2 i5 D4 t0 C1 ^' N7 g/ n. v    #endif9 ?  u- n; u- x1 t
+ [4 ]2 o) X! T
    this.PlayerKeyPair.DistinctUntilChanged().Where(kp=>kp!=null).Subscribe(keyPair=>
( p: J0 Y1 \* j' q+ s' E7 e! ~& C& c
    {/ Y. ]$ h' b1 U

$ j  b5 b) v, p) ~, ~/ V( [' _    this.addressText.text="Address:"+keyPair.address;
2 ^) N; v. \" \) |) J3 R* }9 e6 P" t0 t" U  }( _- F4 k. n; T1 x
    this.balanceText.text="Balance:Pleasewait,syncingbalance...";
( Y6 l; P7 c5 X, q. _, K6 n7 O' T& r; [( [
    StartCoroutine(SyncBalance());4 ~1 ~& b( \% U

- L2 j% G' B8 Q! q    }).AddTo(this);
% A, }" m, O2 b3 c: A2 W7 A
, f+ a) J0 x! J; p6 W+ v  t( a    }
$ `+ c' d  d# Z* `, R: x0 A9 ~0 h* B5 `4 W
    privateIEnumeratorSyncBalance()' q0 L" [$ P( j/ \0 d, ?' R! M

3 z1 p% L8 Y2 w% L2 }" I4 P2 i5 G# z    {6 z) x. S2 {* y1 \. ^: l; \
0 O* V9 x: h) k. |
    yieldreturnnull;
& C) \0 ]& u$ x$ b0 L% N, b$ q% i; W" B- W
    varbalances=this.API.GetAssetBalancesOf(this.PlayerKeyPair.Value);
* W! |, Y; q2 p' R" g
# N# T, ?0 v) L, O" ?6 S) r    this.GASBalance=balances.ContainsKey(AssetSymbol)?balances[AssetSymbol]:0;. f7 n" C+ O% i+ s5 a) D

# v, s6 C4 U1 S7 |' z# v1 z    this.balanceText.text="Balance:"+GASBalance.Value.ToString()+""+AssetSymbol;8 t+ a! F4 N  L3 g& p* C- C

( ^- Q. {: O9 t    }
1 y- r: ~( k. s: u- S7 ^
1 ?9 P7 R: P+ z2 R4 m, ]( R$ T    }
- p* `8 e. H: M4 H# K$ m
9 C. {1 H. @0 H$ b; m    [Serializable]
+ |* E( h4 w* N: m* T. |* I" Y5 N2 O, V4 x3 X% ?
    publicclassKeyPairReactiveProperty:ReactiveProperty. ]. f" z4 J6 q2 A

, G: |# }; {8 o& C0 X    {
( W# m5 V# r( |$ G4 a
& U) M# C$ j6 ?3 m    publicKeyPairReactiveProperty(){}/ h- s2 Z$ c1 O3 L. J
- t' z* B) h8 m4 m% m
    publicKeyPairReactiveProperty(KeyPairinitialValue):base(initialValue){}: h3 }) A. j3 Z# z$ Q  q  }: e
* t7 F  L3 s4 `! d; p9 ]! q- A) z
    }: S  H7 Y( C# c7 C7 X* n$ J
% U- {4 j# E2 b# I
    保存脚本然后返回主场景。创建一个空的游戏对象(GameObject),将其命名为NEO,然后创建一个该NEO对象的空的游戏子对象(childGameObject),并将其命名为NEOManager,并将NEOManager脚本添加到这个NEO对象中。在检查器(inspector)中的RpcIP字段旁边输入你的Droplet的IP地址。, `4 y" r$ u0 ~$ g/ o; z

4 E( o3 ~! a0 }- h# l2 L    接下来,我们将创建一些UI元素并将它们连接到检查器中,这样在连接到主网的时候,我们就可以看到余额的更新。8 ~7 d' ~% D  |; o( I$ q' }
. x, u. M8 p, V. w
    创建UI画布并向其中添加两个子文本元素,然后单击并将它们的引用拖动到NEOManager的“(AddressText)”和“(BalanceText)”字段。
2 u, {; n1 h. W# o, {  d
% x; r; W' z: T% l  m% Z: g5 N0 t    单击播放(Play)按钮然后查看地址和余额的更新情况。/ z) G9 c: Y( ~- y

7 q  @' J% |) I' P' q; t    我们当前使用的是在安装私有网络时自动生成的测试账号。在下一部分中,我们会进行一些设置,以便我们的玩家可以输入他们自己的私钥然后开始与NEO区块链进行交互。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

往事随风760 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1