Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
私有测试网络& j. U1 k' Q& \7 B' O

: V$ n1 i+ B4 h1 N4 I7 }( n' r    NEOLux提供了一些方便的方法,可以用于将你的游戏连接到官方的测试网或者是主网。% J. Y- j) |; M2 j9 ?( u
1 j; N: p7 P, s! f. b' N( _
    但在本教程中,我们会搭建自己的私有网络。这个过车是非常简单的,一旦你克服了最初的障碍(我会引导你),你会发现这比使用测试网络更加简单。例如,尽管填写用于测试的GAS或者Tokens的申请表格可能不是世界上最困难的任务,但我发现就这样一点点小摩擦,往往会扼杀我继续的热情和动力。
& G, W1 j3 P* H  v! N8 e" ~6 j# {* m& E3 ^  a) q' R
    你也可以在本地运行你自己的私有网络,不过在本教程中,我们将设置自己的服务器。这会使得团队工作或者构建工作这类事情更加简单直接。我将使用DigitalOcean。因为根据我的经验,他们具有良好的性价比。$ E* x4 v+ ~1 U5 v, z

" Q5 Y8 r7 g9 h" Y6 B+ O; [& O    免责声明:我不是一个后端/服务器开发者,我猜“中等”水平的人应该会喜欢使用命令行工具。对于那些知道自己在做什么的人来说,这些内容应该很容易。如果你了解Linux和Docker的话,可以直接从DockerHub安装NEOPrivateNet并使用DockerCompose运行NEOSCAN。对于其他那些或多或少是我这种水平的人来说,接下来的内容应该还是相当简单直接的。
  G& X) `% _$ r9 ]+ r
7 ?1 v+ ^5 G% n6 \) t! s! e/ B    如果你还没有DigitalOcean账户的话,就去创建一个。然后使用以下选项创建一个Droplet。8 D. f! m6 z' m: S( L! N- W

# Z0 `4 r, x# ]" m. O    使用16.X或者18.X版本的Ubuntu
3 ^, ]" s! U' T" x% r3 N! I  U1 R  c; z( Z  g' L7 S
    使用中配应该就足够了–你可以在配置中自行尝试,并在评论中告诉我你的试验的结果
6 n6 S' t1 w% V
  J5 z3 Z& A) C+ q7 v    SSH登入到你新建的Droplet并安装docker。如果你按照DigitalOcean提供的指南进行操作的话,这个过程将非常简单:https://www.digitalocean.com/com ... ker-on-ubuntu-18-04
$ G4 T( O2 p9 Y% p, V
3 u! n) m+ A  l0 _    注意:在执行最开始的一步,向系统添加官方Docker库的GPG键这步操作时,我遇到了点小问题。我只是简单地跑了两次命令,然后一切都很顺利。: G0 M3 g/ T7 B0 J

. u7 g( Q" G, K/ {# O    然后安装docker组件。同样地,安装说明非常的简单。只需要确保你看的是针对Linux系统的说明就行。
, i# y7 z5 q% }( ]5 e8 Z+ t1 _6 G7 q
1 ?9 V' G, X, l: W9 ?+ w3 Z. \    安装私有网络和NEOSCAN
$ |4 w* ~0 j) N! C$ `( D) D" a7 M1 \7 {( p
    运行和安装我们自己的私有网络,这是最为困难的一步,好在CityofZion的人帮我们很好的做到了这一点。你可以点击这个链接查看他们的全部说明指导。同样地,SSH登录到你的Droplet,基本上我们只需要输入几个命令就行:
% L6 f1 K# l/ G3 D/ b, l  U. O
; P$ q& t$ Z& l    首先,从hub上下载docker镜像:
& B6 B/ j$ Q% ^1 L
& u* }- o- J$ @$ {  e$ _    dockerpullcityofzion/neo-privatenet$ ~- e6 }& c3 v% k, E
! z7 ^' B1 v8 z4 h5 w0 t! E# T- t9 k
    …下载NEOSCAN…9 S3 \/ J7 G( A6 r: @
4 |9 W7 q. }3 ?# o8 {
    wgethttps://raw.githubusercontent.co ... /docker-compose.yml
2 k( D. B$ ]# M
" B  H/ Z  ~. U% j    …并运行privnet…
' o& \6 H* v& M% o2 c+ O, f& ?* Q% D
    docker-compose-fdocker-compose-neoscan.ymlup$ z8 o9 i/ M! x- N
( `5 G/ H  h" ?/ s! `
    让它运行起来,然后转到http:your-droplet-ip-address:4000查看NEOSCAN的运行情况:
8 C; z9 T# P3 y. `- A$ \. \3 {$ U9 d& w" k: W4 L1 M8 U
    回到Unity7 Y8 O6 A# y7 _$ L$ F/ ?
# ?$ b* u$ v) q; q8 Y
    我不想在本教程中深入探讨自己的开发风格,不过我要做的一件事就是将UniRx插件导入Unity中。UniRx是对.NETReactiveExtensions的重新实现,它针对Unity做了优化处理,而且能很好地兼容iOSIL2CPP。不必过于复杂的实现,它可以简化一些管理NEO和UI的代码。+ J3 k. L3 `; h$ [, |
/ b- u* [. m: R# w
    在资产(Assets)–>脚本(Scripts)下创建另一个名为NEOManager的脚本,并复制+粘贴以下代码:0 L0 G/ g4 X4 K8 |6 K

) E5 k; Z* T; S5 x, H; B/ N    usingSystem.Collections;) Z& X. G# i# ?4 C$ J
. Z; p0 Z% ?" Q
    usingUnityEngine;
* u0 R4 [, R5 a! l9 l, O! [' m0 t
' T% S) O8 \  Y. d7 m. D. a% Z    usingSystem;
: j* d, j' f3 E- E; Y7 I9 @! h+ c' n- Y! X' k8 i4 Q7 f
    usingUniRx;- ?! `4 w0 [; }! G
4 K0 P; P2 L. v, f5 y8 Q  Z  c
    usingNeo.Lux.Core;
/ A- {5 B- Z, ^8 H( n$ \6 {! `
) m, O- H2 V! P1 z* A4 V3 f$ `; g$ G) U( d    usingNeo.Lux.Cryptography;; X6 J" a" d, H$ O0 {$ T, Z
. b/ u+ }0 x6 N1 {
    usingUnityEngine.UI;
: v( `* U2 Q: Z0 V% i
% R9 K5 I( J" x; |& j3 y; w    publicclassNEOManager:MonoBehaviour( i7 {% h! [( C

0 z5 L3 Q0 z) ]6 w    {
# x2 e8 c1 t2 |1 n5 l& O( S
8 A: F/ V- n! ?; {8 `; u3 i    publicNeoAPIAPI;
. J5 T+ D5 `6 q- E% _& p+ r+ C6 Z) h- S
    [SerializeField]privatestringRpcIP;
+ R" W* Y. y5 {. s3 O
4 S  `/ S6 T% G8 @5 L" Y$ h& J    publicconststringAssetSymbol="GAS";6 Z) P2 d' X0 j* s4 K$ j7 o! L

' H5 ~7 p3 Z8 O( Z    [HideInInspector]' S: a; m3 F$ }) w, r2 g8 T
& k7 h3 \9 Y: P
    publicKeyPairReactivePropertyPlayerKeyPair=newKeyPairReactiveProperty();8 s% D; D/ x( X9 |7 |0 D

9 W3 k: ~2 H# G4 n2 ?    [SerializeField]privateTextaddressText;4 Q$ @5 ^$ x' d: o
: h+ u! J1 f$ s# `
    [SerializeField]privateTextbalanceText;
4 z) {; F( ~( T- }- T/ y* E: @) [& v
    publicDecimalGASBalance;- _1 e( K5 M* u; l9 \  t4 Z

+ l: y# Q  P3 C/ v7 u, Z% L    privatevoidOnEnable()7 x( ]9 ~3 s1 ~- \4 ^# Z# `" D
* R5 L( e# ]6 L& p( p, ^, `
    {
3 O8 l- E9 s! O$ y4 R4 F+ X6 D- _3 e5 K( [3 G
    PlayerKeyPair.Value=KeyPair.FromWIF("KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr");6 }2 s9 c: z: q, f0 }6 I# z- C. {& S
0 [: O4 Z. R  N5 h$ \* A
    #ifUNITY_EDITOR/ _0 t, H$ G" F6 g# V
( y' `7 Q! I$ h' A9 c! B
    //this.API=newLocalRPCNode(30333,"http://localhost");7 m7 t5 \) ]  `# s, S4 ~
6 i9 A. X, @  k; ?. @
    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);# i+ p9 j; D8 ?1 }- l

7 x3 w4 N5 O" {  Q, v, U3 K: ]    #else
& Q0 w6 r; |/ o
: h0 x2 O# ^  ~    //this.API=NeoRPC.ForTestNet();3 P1 Z6 ], H. s; o5 }+ O! q2 n5 L+ h

6 n0 x: r5 w) V    this.API=newCustomRPC(30333,4000,"http://"+RpcIP);
9 B4 ~1 @. L) S4 M  d  T( p% a3 L/ [: B1 i* k$ W
    #endif
3 N, T7 O  p0 w. e/ K7 Y: r: H6 ~
    this.PlayerKeyPair.DistinctUntilChanged().Where(kp=>kp!=null).Subscribe(keyPair=>3 L0 u% [0 a$ p8 p

2 d* |, N7 w" D) }& U6 G& E% v+ m    {
0 t% q$ `! J- l8 L" ?4 c( R% R" A* r& T  B" d( S4 y  K
    this.addressText.text="Address:"+keyPair.address;
8 u. L+ v4 W# H, q" c' E6 P8 d  U/ w
    this.balanceText.text="Balance:Pleasewait,syncingbalance...";9 f" b# t, P6 m0 }9 d3 [) L
" B# w" k8 U9 b) j4 h
    StartCoroutine(SyncBalance());
. R6 n  K. g; i' j- L* ~) I% d4 Z' c- X( K0 \9 z/ ^0 C1 Z
    }).AddTo(this);
8 n7 ~2 c4 N0 A5 H7 `8 e6 d9 v6 ]
1 G' |0 }$ p+ U( U% X9 S    }
6 V8 M1 p3 `& u/ t% N3 T* b5 h
; q7 R4 r  f+ ^- y  _8 n4 ?. {, ]    privateIEnumeratorSyncBalance()+ H* _0 A1 |# M5 }; l# w
$ P2 _! X8 o6 J( {# _
    {! v8 {: b/ A" }" r- p  r2 h
1 H$ J: f, d. \: H/ A+ Z; ^8 B, v
    yieldreturnnull;
3 Y- N$ T. l2 U! t. s4 }' }: u* e, L' x9 F" G
    varbalances=this.API.GetAssetBalancesOf(this.PlayerKeyPair.Value);& }4 Z8 L& ~6 D

, W: s8 T" k& K/ f7 C- d8 }6 L% E    this.GASBalance=balances.ContainsKey(AssetSymbol)?balances[AssetSymbol]:0;
, u8 p+ ^5 W6 h! E; n) `8 X. ?" M/ N# m! ^3 u
    this.balanceText.text="Balance:"+GASBalance.Value.ToString()+""+AssetSymbol;
% B) T0 Q7 ?+ v& T) v! z; }$ C. k3 s6 \* R) R6 A. v9 _
    }. C0 h! C) S* Y5 I) d

9 C! b3 z0 ^: ?3 {" ^/ p    }
* u  D" p# ]; _. e- H2 f8 N$ j7 m+ O' N  j+ x6 q+ Y. f8 N
    [Serializable], o. k% ^1 [, a1 r  {* I: Z
* k; i7 c1 X2 r) M5 H. m! L
    publicclassKeyPairReactiveProperty:ReactiveProperty
" u9 X4 ~% ]. ~5 f1 J
: u/ Q! m' k: W' n    {
7 X0 @* y7 l8 H3 S- W  @) C6 d5 \+ X5 ]3 |. m, x& T
    publicKeyPairReactiveProperty(){}
. l/ P! p9 q  D
  A# E2 d  ^5 x# Z# s0 f9 F    publicKeyPairReactiveProperty(KeyPairinitialValue):base(initialValue){}
4 H' g6 _) P1 P; w% ]4 x2 v$ x& Z# T! X. H0 ^
    }
& y/ ~2 u" V8 F" a2 d" |# A' o5 n3 I( G- i, Y
    保存脚本然后返回主场景。创建一个空的游戏对象(GameObject),将其命名为NEO,然后创建一个该NEO对象的空的游戏子对象(childGameObject),并将其命名为NEOManager,并将NEOManager脚本添加到这个NEO对象中。在检查器(inspector)中的RpcIP字段旁边输入你的Droplet的IP地址。$ R6 L/ D( M6 }# j

8 P" O7 ?: d$ i1 Y0 C# w  M    接下来,我们将创建一些UI元素并将它们连接到检查器中,这样在连接到主网的时候,我们就可以看到余额的更新。
7 E0 {, V+ {6 A/ B- T  z2 R. `, X2 k1 n2 Q
    创建UI画布并向其中添加两个子文本元素,然后单击并将它们的引用拖动到NEOManager的“(AddressText)”和“(BalanceText)”字段。
$ h6 h. B- W* i) h8 o) @+ s1 ~% }6 V, d/ z) }2 s% }4 Z
    单击播放(Play)按钮然后查看地址和余额的更新情况。
/ ?# y8 ~" ^: l9 g6 b1 _3 i$ M* j& X4 _. c6 j- {
    我们当前使用的是在安装私有网络时自动生成的测试账号。在下一部分中,我们会进行一些设置,以便我们的玩家可以输入他们自己的私钥然后开始与NEO区块链进行交互。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

往事随风760 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1