Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
私有测试网络9 W7 q& Y' [# B& a

# Y$ ]# H( ?8 H1 Y8 {9 o# S- X& z    NEOLux提供了一些方便的方法,可以用于将你的游戏连接到官方的测试网或者是主网。
0 \8 }$ `' R5 t1 r& s- S& q' j# H5 R: y2 E3 d5 Y
    但在本教程中,我们会搭建自己的私有网络。这个过车是非常简单的,一旦你克服了最初的障碍(我会引导你),你会发现这比使用测试网络更加简单。例如,尽管填写用于测试的GAS或者Tokens的申请表格可能不是世界上最困难的任务,但我发现就这样一点点小摩擦,往往会扼杀我继续的热情和动力。
$ }) N' @/ [$ F& M& o2 ~( m
$ p: o. e6 B5 Y    你也可以在本地运行你自己的私有网络,不过在本教程中,我们将设置自己的服务器。这会使得团队工作或者构建工作这类事情更加简单直接。我将使用DigitalOcean。因为根据我的经验,他们具有良好的性价比。& F. i) @! s0 V

" w- a& J5 K. q    免责声明:我不是一个后端/服务器开发者,我猜“中等”水平的人应该会喜欢使用命令行工具。对于那些知道自己在做什么的人来说,这些内容应该很容易。如果你了解Linux和Docker的话,可以直接从DockerHub安装NEOPrivateNet并使用DockerCompose运行NEOSCAN。对于其他那些或多或少是我这种水平的人来说,接下来的内容应该还是相当简单直接的。
- n7 b9 z% b7 k# j) i8 i2 b8 U- s. N2 \: M! c$ w6 ~
    如果你还没有DigitalOcean账户的话,就去创建一个。然后使用以下选项创建一个Droplet。
; [0 w; l5 |9 ]! c5 P- s
8 `' A) l4 ^; r% \) `    使用16.X或者18.X版本的Ubuntu
, y' D) y1 X( C
$ q& n! x9 L& I4 Y* f7 g    使用中配应该就足够了–你可以在配置中自行尝试,并在评论中告诉我你的试验的结果
! t$ v2 e3 ?! i; U. X0 _6 m2 F  h8 X& W+ S0 c
    SSH登入到你新建的Droplet并安装docker。如果你按照DigitalOcean提供的指南进行操作的话,这个过程将非常简单:https://www.digitalocean.com/com ... ker-on-ubuntu-18-04
( ~+ E- ]* g% ~7 T4 S2 t+ X/ X4 z: X9 L& I3 i- C; Z
    注意:在执行最开始的一步,向系统添加官方Docker库的GPG键这步操作时,我遇到了点小问题。我只是简单地跑了两次命令,然后一切都很顺利。8 t1 K, u. ~- J* M( L3 E

( P9 w9 L1 U% u+ y; B1 S- {) Z, S    然后安装docker组件。同样地,安装说明非常的简单。只需要确保你看的是针对Linux系统的说明就行。+ l! d5 Z; }" _( }$ f: h6 s

$ \9 }8 a5 w6 X. ~' I    安装私有网络和NEOSCAN
1 f8 r2 n7 u' K: q) R# Q. }
& _" z$ ]6 _; x% l- N1 t6 f. j    运行和安装我们自己的私有网络,这是最为困难的一步,好在CityofZion的人帮我们很好的做到了这一点。你可以点击这个链接查看他们的全部说明指导。同样地,SSH登录到你的Droplet,基本上我们只需要输入几个命令就行:  S& k* G6 `  D; l+ a

/ g" j( q: ?2 h  X- s    首先,从hub上下载docker镜像:
" d9 N7 w/ ]9 [/ L" K; G# x. u& e& l
    dockerpullcityofzion/neo-privatenet
; L' R: U/ @2 n- f# U3 U' h1 N" j" ~
( p( u; X$ {0 v8 }; @3 R( w0 o    …下载NEOSCAN…# }* ~1 x. u! U* b" u
7 ~4 L- j6 L& L6 R0 s( L6 o% s; k" {* }
    wgethttps://raw.githubusercontent.co ... /docker-compose.yml
8 M5 y1 B( k1 o0 ?
5 O1 ]+ m/ f! d+ Q    …并运行privnet…, W9 c# u2 Q8 o

: u4 C1 C: U6 p. B/ E) ~    docker-compose-fdocker-compose-neoscan.ymlup; R5 f- S: Z, a& N

+ o; s, I/ ?" I( l8 ?, Y$ `    让它运行起来,然后转到http:your-droplet-ip-address:4000查看NEOSCAN的运行情况:. x2 N7 u8 N3 @. J+ B3 A
3 ?( W: k3 i* J* |+ J
    回到Unity: [" z9 Y# |; X/ f; X

% d9 ]! R% `; X3 {    我不想在本教程中深入探讨自己的开发风格,不过我要做的一件事就是将UniRx插件导入Unity中。UniRx是对.NETReactiveExtensions的重新实现,它针对Unity做了优化处理,而且能很好地兼容iOSIL2CPP。不必过于复杂的实现,它可以简化一些管理NEO和UI的代码。
2 G+ F2 s  T6 K. A# N1 t: ]$ R0 Y9 W5 M1 X
    在资产(Assets)–>脚本(Scripts)下创建另一个名为NEOManager的脚本,并复制+粘贴以下代码:
1 B; W+ [5 U$ i$ N* h  c6 a
( x) j8 ]6 l# b2 M- }2 Q% C    usingSystem.Collections;( Y3 M; o$ q4 }; ?4 c/ p

/ `4 l' {$ T# a: s. L) C$ T    usingUnityEngine;
- j4 \8 y- t4 T- L" G- L7 n% E( q# L  R/ _
    usingSystem;3 l/ ~9 s4 S( Q9 ?! B
' [, }) A9 \1 o) t
    usingUniRx;) x0 L4 `! i" S8 h
- w: ^' I) p/ [8 i0 a6 R  p
    usingNeo.Lux.Core;
7 T5 ^$ F/ B' u+ H, m3 M6 B
/ l) f. Y. `8 Y0 h/ b9 [    usingNeo.Lux.Cryptography;
1 Q' f1 _1 _5 k2 D8 x) Z6 G+ N1 M8 f* r) l3 [# V9 S& C" H
    usingUnityEngine.UI;" q2 Z. ~1 ]7 ]% Y' l: ^

$ V9 m9 ]4 Q5 {9 J0 s    publicclassNEOManager:MonoBehaviour" L+ b7 _4 E* N+ Z
& J; }3 S: z4 K) _) m" V8 u
    {/ H; E" g% J; Y, V9 S
  [3 ^0 T- l7 i8 z( d8 c
    publicNeoAPIAPI;/ v# W& z2 ]  I0 e3 v

1 K$ U4 p1 f0 A+ E1 X( u    [SerializeField]privatestringRpcIP;
; t8 j" z6 z7 h$ I# K
& ?& q6 ?" j# |( r7 p    publicconststringAssetSymbol="GAS";2 ]' U8 W! A$ O6 Q2 C0 j

; T+ s# Z) `: s/ Y    [HideInInspector]$ b2 r, }1 I! `) S( f
  O  a: i% P& e( @5 S" g5 `
    publicKeyPairReactivePropertyPlayerKeyPair=newKeyPairReactiveProperty();
3 ^7 L7 ^3 b8 T! F: u! H
8 i' I9 B# o9 k' s4 \, ^    [SerializeField]privateTextaddressText;5 [/ q( t8 S7 f# i
8 \* }/ x& [* M+ p/ Q7 t! F2 {
    [SerializeField]privateTextbalanceText;
- T$ {, ?* l* V' S6 U& N  [9 S; |
    publicDecimalGASBalance;# M  U* r( P) J
6 C  t: d) w: J/ Q  @# P  j- T
    privatevoidOnEnable()+ e7 v5 J, O1 h% Q" }9 ?4 {; @
; L& L' `+ J1 ~: u$ o
    {
# A" [# K% \0 o, v+ L" V; O
( N9 V! s+ R: g. [( W    PlayerKeyPair.Value=KeyPair.FromWIF("KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr");
7 z0 c% C& j6 j3 G$ Q* h
  r; F7 u( M, V& j$ j4 F    #ifUNITY_EDITOR) K, s6 b9 P- _3 L/ ]
0 F4 ]7 T: `" i& F" E9 g
    //this.API=newLocalRPCNode(30333,"http://localhost");: \! w* p! q- O5 ~
1 ]$ k# o& {- Z3 u7 H
    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);! k7 Z9 |  G7 d( e2 F  V
6 i# u" }9 W2 H: M' i& \
    #else$ s; c/ e: V0 y6 D/ ?

2 R  o8 B1 A' h3 P7 r    //this.API=NeoRPC.ForTestNet();
! K" D. Z7 x. I* _3 Y6 S, x% y2 h9 W
    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);
8 ?8 |) a0 G. _! i5 r! K* h; Z+ d8 g- D
    #endif" ^+ I$ ?/ ]5 Z( x8 `

3 m2 V+ m* a: B4 V& w4 [    this.PlayerKeyPair.DistinctUntilChanged().Where(kp=>kp!=null).Subscribe(keyPair=>7 b2 r; l  W# R* N& h& i# {

: y; O! f2 P" d. C    {
6 @1 \8 ]) i! T; L8 p4 |4 ~( X! `5 ]5 Z4 \0 t
    this.addressText.text="Address:"+keyPair.address;& O2 P0 c2 i* B$ e1 d# C+ B
9 v+ i- J+ `* W
    this.balanceText.text="Balance:Pleasewait,syncingbalance...";
3 U9 a+ e) |4 \7 K" M+ f6 l" o
* B: W3 Y: ~1 z/ w  @2 I  D    StartCoroutine(SyncBalance());$ z4 k' H1 A& w+ F5 P2 s
+ V% Z2 D" d+ P! U5 X3 u' }$ Q
    }).AddTo(this);. e/ M# F2 L) z' c9 R' p; t" n
' c& k6 S$ e- @. _. q$ R
    }
* J5 Z* g( T9 C, [' G' |  Z; V5 U9 C" b0 l# V
    privateIEnumeratorSyncBalance()
% L3 t/ D. N% ?  b  p9 T, l4 }
, R) c, S( U  d; X- q% f    {
* B& J- S' n' K8 V* s- M, J
9 V2 _7 G  M) n& u% T    yieldreturnnull;
5 T) _  g+ Y2 A' k, j
; P# P, M  G9 W6 K    varbalances=this.API.GetAssetBalancesOf(this.PlayerKeyPair.Value);
, I/ c; g1 _+ O) w0 Z# x: V+ J: {4 R/ T1 U5 l8 A9 P/ c
    this.GASBalance=balances.ContainsKey(AssetSymbol)?balances[AssetSymbol]:0;( r4 m, p& w* Y

5 Q( `; o( _* q$ f5 L    this.balanceText.text="Balance:"+GASBalance.Value.ToString()+""+AssetSymbol;/ s" O% K$ t: _3 Z2 t

& {) T$ [0 l3 r. h+ E' q    }
8 e* z) z1 u! r. v) A+ o
* L' t+ z# t3 h7 k# |2 }    }6 O% k  B" h6 {  y% |4 L' Z" f

4 ~6 K/ t+ V- T2 H' K    [Serializable]3 ]! i0 a1 P3 t5 Q- S* H3 `; o7 D

% n. ?2 F1 \1 q/ Z( }0 o    publicclassKeyPairReactiveProperty:ReactiveProperty
4 E% ?7 w1 S/ }# @/ ~' `2 [9 ]; p
    {0 I% \: [: \9 h
1 l! H/ f" S' Z* J
    publicKeyPairReactiveProperty(){}
/ z' ~6 J" ?9 ]2 C4 m* @2 }% k/ ]! Q; J
    publicKeyPairReactiveProperty(KeyPairinitialValue):base(initialValue){}
1 X) p/ h$ S: b% D
, q& h! |+ x; f; u6 `) z6 L    }
9 M% e8 L  P. Q. q0 [2 s# G; S; x1 Y. y% j
    保存脚本然后返回主场景。创建一个空的游戏对象(GameObject),将其命名为NEO,然后创建一个该NEO对象的空的游戏子对象(childGameObject),并将其命名为NEOManager,并将NEOManager脚本添加到这个NEO对象中。在检查器(inspector)中的RpcIP字段旁边输入你的Droplet的IP地址。' n& [- o! Q: H0 T$ {

4 @% B3 \2 s- c( ]. u: P    接下来,我们将创建一些UI元素并将它们连接到检查器中,这样在连接到主网的时候,我们就可以看到余额的更新。: @6 L; }5 N: T0 v4 A- s+ E) [1 e
# N! X+ Y, y7 d, y
    创建UI画布并向其中添加两个子文本元素,然后单击并将它们的引用拖动到NEOManager的“(AddressText)”和“(BalanceText)”字段。; D; W! c  C  `( H
0 |1 k7 G) \. q
    单击播放(Play)按钮然后查看地址和余额的更新情况。0 w8 t. ~1 b& c+ V  w0 u
, L1 I& f5 B" `# H  V) R/ ~/ C
    我们当前使用的是在安装私有网络时自动生成的测试账号。在下一部分中,我们会进行一些设置,以便我们的玩家可以输入他们自己的私钥然后开始与NEO区块链进行交互。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

往事随风760 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1