mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-07-16 00:51:57 +00:00
Compare commits
22 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
33172f5850 | ||
|
6519e0ebd7 | ||
|
8341249aa6 | ||
|
4eed2700b0 | ||
|
d10166cdcb | ||
|
9faba46061 | ||
|
ad3fd30cf3 | ||
|
744061b7d2 | ||
|
aa80c86b0a | ||
|
0d53d93149 | ||
|
12e15ef236 | ||
|
d92bad28a0 | ||
|
a997237a2d | ||
|
bcc669028e | ||
|
896fe7ab0e | ||
|
e78f035a1c | ||
|
d32e52fb11 | ||
|
5393b25b22 | ||
|
665f7c6d66 | ||
|
03e02dfba9 | ||
|
019f84885d | ||
|
ceaae4c53f |
16
.aegir.js
Normal file
16
.aegir.js
Normal file
@@ -0,0 +1,16 @@
|
||||
'use strict'
|
||||
|
||||
const path = require('path')
|
||||
|
||||
module.exports = {
|
||||
webpack: {
|
||||
resolve: {
|
||||
alias: {
|
||||
'node-forge': path.resolve(
|
||||
path.dirname(require.resolve('libp2p-crypto')),
|
||||
'../vendor/forge.bundle.js'
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -6,7 +6,7 @@ libp2p-swarm JavaScript implementation
|
||||
[](http://webchat.freenode.net/?channels=%23ipfs)
|
||||
[](https://travis-ci.org/diasdavid/js-libp2p-swarm)
|
||||
[](https://coveralls.io/github/diasdavid/js-libp2p-swarm?branch=master)
|
||||
[](https://david-dm.org/ipfs/js-libp2p-swarm)
|
||||
[](https://david-dm.org/diasdavid/js-libp2p-swarm)
|
||||
[](https://github.com/feross/standard)
|
||||
|
||||
> libp2p swarm implementation in JavaScript.
|
||||
@@ -102,6 +102,13 @@ dial uses the best transport (whatever works first, in the future we can have so
|
||||
- `protocol`
|
||||
- `callback`
|
||||
|
||||
### `swarm.hangUp(pi, callback)`
|
||||
|
||||
hangUp the muxedConn we have with the peer
|
||||
|
||||
- `pi` - peer info project
|
||||
- `callback`
|
||||
|
||||
### `swarm.listen(callback)`
|
||||
|
||||
Start listening on all added transports that are available on the current `peerInfo`.
|
||||
|
21
package.json
21
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "libp2p-swarm",
|
||||
"version": "0.18.1",
|
||||
"version": "0.19.4",
|
||||
"description": "libp2p swarm implementation in JavaScript",
|
||||
"main": "lib/index.js",
|
||||
"jsnext:main": "src/index.js",
|
||||
@@ -45,9 +45,9 @@
|
||||
"istanbul": "^0.4.3",
|
||||
"libp2p-multiplex": "^0.2.1",
|
||||
"libp2p-spdy": "^0.6.1",
|
||||
"libp2p-tcp": "^0.6.0",
|
||||
"libp2p-webrtc-star": "^0.1.4",
|
||||
"libp2p-websockets": "^0.6.0",
|
||||
"libp2p-tcp": "^0.6.1",
|
||||
"libp2p-webrtc-star": "^0.2.0",
|
||||
"libp2p-websockets": "^0.6.1",
|
||||
"pre-commit": "^1.1.2",
|
||||
"stream-pair": "^1.0.3",
|
||||
"webrtcsupport": "^2.2.0"
|
||||
@@ -60,20 +60,11 @@
|
||||
"lodash.contains": "^2.4.3",
|
||||
"multiaddr": "^2.0.0",
|
||||
"multistream-select": "^0.9.0",
|
||||
"peer-id": "^0.6.7",
|
||||
"peer-info": "^0.6.2",
|
||||
"peer-id": "^0.7.0",
|
||||
"peer-info": "^0.7.0",
|
||||
"protocol-buffers-stream": "^1.3.1",
|
||||
"run-parallel": "^1.1.6"
|
||||
},
|
||||
"aegir": {
|
||||
"webpack": {
|
||||
"resolve": {
|
||||
"alias": {
|
||||
"node-forge": "../vendor/forge.bundle.js"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"contributors": [
|
||||
"David Dias <daviddias.p@gmail.com>",
|
||||
"David Dias <mail@daviddias.me>",
|
||||
|
@@ -137,7 +137,7 @@ module.exports = function dial (swarm) {
|
||||
|
||||
swarm.emit('peer-mux-established', pi)
|
||||
|
||||
muxedConn.on('close', () => {
|
||||
muxedConn.once('close', () => {
|
||||
delete swarm.muxedConns[pi.id.toB58String()]
|
||||
swarm.emit('peer-mux-closed', pi)
|
||||
})
|
||||
|
@@ -59,10 +59,15 @@ exports.exec = (rawConn, muxer, peerInfo, callback) => {
|
||||
|
||||
const obsMultiaddr = rawConn.getObservedAddrs()[0]
|
||||
|
||||
let publicKey = new Buffer(0)
|
||||
if (peerInfo.id.pubKey) {
|
||||
publicKey = peerInfo.id.pubKey.bytes
|
||||
}
|
||||
|
||||
pbs.identify({
|
||||
protocolVersion: 'na',
|
||||
agentVersion: 'na',
|
||||
publicKey: peerInfo.id.pubKey,
|
||||
publicKey: publicKey,
|
||||
listenAddrs: peerInfo.multiaddrs.map((mh) => mh.buffer),
|
||||
observedAddr: obsMultiaddr ? obsMultiaddr.buffer : new Buffer('')
|
||||
})
|
||||
@@ -88,10 +93,15 @@ exports.handler = (peerInfo, swarm) => {
|
||||
const conn = swarm.muxedConns[peerId.toB58String()].conn
|
||||
const obsMultiaddr = conn.getObservedAddrs()[0]
|
||||
|
||||
let publicKey = new Buffer(0)
|
||||
if (peerInfo.id.pubKey) {
|
||||
publicKey = peerInfo.id.pubKey.bytes
|
||||
}
|
||||
|
||||
pbs.identify({
|
||||
protocolVersion: 'na',
|
||||
agentVersion: 'na',
|
||||
publicKey: peerInfo.id.pubKey,
|
||||
publicKey: publicKey,
|
||||
listenAddrs: peerInfo.multiaddrs.map((ma) => ma.buffer),
|
||||
observedAddr: obsMultiaddr ? obsMultiaddr.buffer : new Buffer('')
|
||||
})
|
||||
|
14
src/index.js
14
src/index.js
@@ -103,6 +103,20 @@ function Swarm (peerInfo) {
|
||||
}
|
||||
}
|
||||
|
||||
this.hangUp = (peerInfo, callback) => {
|
||||
const key = peerInfo.id.toB58String()
|
||||
if (this.muxedConns[key]) {
|
||||
const muxer = this.muxedConns[key].muxer
|
||||
muxer.end()
|
||||
muxer.once('close', () => {
|
||||
delete this.muxedConns[key]
|
||||
callback()
|
||||
})
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
|
||||
this.close = (callback) => {
|
||||
Object.keys(this.muxedConns).forEach((key) => {
|
||||
this.muxedConns[key].muxer.end()
|
||||
|
@@ -54,6 +54,7 @@ module.exports = function (swarm) {
|
||||
function next (multiaddr) {
|
||||
const conn = t.dial(multiaddr, {ready: () => {
|
||||
pt.wrapStream(conn)
|
||||
pt.getObservedAddrs = conn.getObservedAddrs.bind(conn)
|
||||
const cb = callback
|
||||
callback = noop // this is done to avoid connection drops as connect errors
|
||||
cb(null, pt)
|
||||
|
@@ -213,10 +213,30 @@ describe('high level API - with everything mixed all together!', function () {
|
||||
})
|
||||
})
|
||||
|
||||
it('hangUp', (done) => {
|
||||
let count = 0
|
||||
const ready = () => ++count === 3 ? done() : null
|
||||
|
||||
swarmB.once('peer-mux-closed', (peerInfo) => {
|
||||
expect(Object.keys(swarmB.muxedConns).length).to.equal(0)
|
||||
ready()
|
||||
})
|
||||
|
||||
swarmA.once('peer-mux-closed', (peerInfo) => {
|
||||
expect(Object.keys(swarmA.muxedConns).length).to.equal(1)
|
||||
ready()
|
||||
})
|
||||
|
||||
swarmA.hangUp(peerB, (err) => {
|
||||
expect(err).to.not.exist
|
||||
ready()
|
||||
})
|
||||
})
|
||||
|
||||
it('close a muxer emits event', (done) => {
|
||||
parallel([
|
||||
(cb) => swarmC.close(cb),
|
||||
(cb) => swarmA.once('peer-mux-closed', () => cb())
|
||||
(cb) => swarmA.once('peer-mux-closed', (peerInfo) => cb())
|
||||
], done)
|
||||
})
|
||||
})
|
||||
|
@@ -17,9 +17,11 @@ describe('high level API (swarm with spdy + webrtc-star)', function () {
|
||||
|
||||
let swarm1
|
||||
let peer1
|
||||
let wstar1
|
||||
|
||||
let swarm2
|
||||
let peer2
|
||||
let wstar2
|
||||
|
||||
before(() => {
|
||||
const id1 = peerId.create()
|
||||
@@ -37,12 +39,14 @@ describe('high level API (swarm with spdy + webrtc-star)', function () {
|
||||
})
|
||||
|
||||
it('add WebRTCStar transport to swarm 1', () => {
|
||||
swarm1.transport.add('wstar', new WebRTCStar())
|
||||
wstar1 = new WebRTCStar()
|
||||
swarm1.transport.add('wstar', wstar1)
|
||||
expect(Object.keys(swarm1.transports).length).to.equal(1)
|
||||
})
|
||||
|
||||
it('add WebRTCStar transport to swarm 2', () => {
|
||||
swarm2.transport.add('wstar', new WebRTCStar())
|
||||
wstar2 = new WebRTCStar()
|
||||
swarm2.transport.add('wstar', wstar2)
|
||||
expect(Object.keys(swarm2.transports).length).to.equal(1)
|
||||
})
|
||||
|
||||
@@ -76,7 +80,7 @@ describe('high level API (swarm with spdy + webrtc-star)', function () {
|
||||
conn.pipe(bl((err, data) => {
|
||||
expect(err).to.not.exist
|
||||
expect(data.toString()).to.equal(text)
|
||||
// expect(Object.keys(swarm2.muxedConns).length).to.equal(1)
|
||||
expect(Object.keys(swarm2.muxedConns).length).to.equal(1)
|
||||
done()
|
||||
}))
|
||||
|
||||
@@ -85,6 +89,37 @@ describe('high level API (swarm with spdy + webrtc-star)', function () {
|
||||
})
|
||||
})
|
||||
|
||||
it('create a third node and check that discovery works', (done) => {
|
||||
wstar1.discovery.on('peer', (peerInfo) => {
|
||||
expect(Object.keys(swarm1.muxedConns).length).to.equal(1)
|
||||
swarm1.dial(peerInfo, () => {
|
||||
expect(Object.keys(swarm1.muxedConns).length).to.equal(2)
|
||||
})
|
||||
})
|
||||
wstar2.discovery.on('peer', (peerInfo) => {
|
||||
swarm2.dial(peerInfo)
|
||||
})
|
||||
|
||||
const id3 = peerId.create()
|
||||
const peer3 = new PeerInfo(id3)
|
||||
const mh3 = multiaddr('/libp2p-webrtc-star/ip4/127.0.0.1/tcp/15555/ws/ipfs/' + id3.toB58String())
|
||||
peer3.multiaddr.add(mh3)
|
||||
|
||||
const swarm3 = new Swarm(peer3)
|
||||
const wstar3 = new WebRTCStar()
|
||||
swarm3.transport.add('wstar', wstar3)
|
||||
swarm3.connection.addStreamMuxer(spdy)
|
||||
swarm3.connection.reuse()
|
||||
swarm3.listen(() => {
|
||||
setTimeout(() => {
|
||||
expect(Object.keys(swarm1.muxedConns).length).to.equal(2)
|
||||
expect(Object.keys(swarm2.muxedConns).length).to.equal(2)
|
||||
expect(Object.keys(swarm3.muxedConns).length).to.equal(2)
|
||||
swarm3.close(done)
|
||||
}, 8000)
|
||||
})
|
||||
})
|
||||
|
||||
it('close', (done) => {
|
||||
parallel([
|
||||
swarm1.close,
|
||||
|
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"id": "1220dddcb7b540358368df92bf537a60f20663130ca09ef9eec40b9a4ed15b3572a7",
|
||||
"privKey": "080012a609308204a202010002820101008b6959ff2e965869d2d450ced6135e641c92ceaa216877c566de2cab9a9d6e62f8a859efa8f71c8e67d1722cddb5afc4d382001d423e9839f382e543723500566e3e71fe08c004765f848aacda8df2478dcfdafc0fa377cc6beda9e5c5a9b456ccb0fccde94ade50fd58a057d79e805344fa57ee75e28cce37bda4f68fd890f21a99598e68bb02ebb36864a8503403a5d01eba9873def7cf19c10a6cb9d0eaff55e714a0855fe0323feec9ce1a1d5787a9908ac4171becb75450c06e7d5f747954ac8b9ee58d259bf931ceb7366b454c7bc82c18490c8407866969858a6c13e11b721780806f2116ad771caf6a3674c77ba0176a4c4c5fefdaa93fcae5dc03d5020301000102820100056fea6ea5667fb440e0bef6122b573718563171393455d78117912e702d4bacd87dd8641c76e6ca370a58259fd00236eef8d7004d211bd6c6c488248543c3eb9b091c7107ee553e38a376b51f21021e004de70085ab9e747e911a5b37c6529e40057716a0cea6b509ec76f476185c70e2f3d092204ee1a6f94d902d7d96b8b069c7ccda1253c5c1fc41b9367a006791c1ba5d8e52352b338a56ebc0eee01941c66ec86a007664f543f58578a66d0bd6b12b33fde2e73189962629742827efb9e57df608116da25e0444ba7df6893273a652ec3d7c7b2d97e92c51465518a6132f78865b08403b41a2e3ee615793a4725227d26c028be3234d648c5b1b87235102818100cd39918e5d588e7b761868006df8952f8a1ad6e4a88cfb0cf0fc887e4cfc0631e45c95706ecb9c04c57b39d4117020a06e5b8aa21d8286cd8849ad01e491ff8590c872293f7db1ffd03731c98eac74e1387f26eeff5d835beb7e997f523caf633481432b1ff00e23c3d48d942820aed5fef125057c21b59c632c385c8dd411cb02818100ade7546eb30fead900724b289037449497547cac34bc69a85d675a48b40a29ec52a30cee4c392e93f25c2ecec6cdd6c77b1e0c7168dd75dc35044fafbda69ba11d3eb04ad5f708ad860cc3eb8c9640826be434cb7816f524b7bd4bf3f42e460f933d2a8330182998f5189dcd573839870f7f9d7a599777871827854316810cdf0281806c75dc636d19fc536b9a827c97a224d6371af02f7094f1a969434dafd267efae368e67bc401203a6d1e7ca2c35fb1883314fd7f8cdb7ca1e9dc4b256a9c22f551bab940a10b0117ead403e63d3af7925fe81d4c5c2d85d301b49913e24ec45951c8ea43d0a68085106923330f5f42ff291064916990007c75af267e7225dcdf90281804d19c2d5518e3d10f8a1b3b0c83fb8a8286fccd68c8afc4d291c296b12676f2ed77472c73404262271d16cef403502846e9163f2e40b4bb5d5cb9388d70c86f36783e3a54a37bc2132cd760f78c524d4ae00ff673656f758d01d9d0f0bb3785c6f6b2eedfae4bb8c951dd4d8b552b82ea9306b21539753e7114e7446ca336d0102818029cc3310268d0217f2392e16b02edf46d1e4f76feff61656831ab9a2161ba9c107f2d3a6f4661f0e6ac29c0632475b5b13fefb442e1ed5773c139612ba04277fcdf6d58fb392d5de90d352e9bbfffeb04604f68ef4bea3cd4b87764366db9344b66a45c2b2a68a33b1e4cba073519a4021599c0763a25a5390062141d781409d",
|
||||
"pubKey": "080012a60230820122300d06092a864886f70d01010105000382010f003082010a02820101008b6959ff2e965869d2d450ced6135e641c92ceaa216877c566de2cab9a9d6e62f8a859efa8f71c8e67d1722cddb5afc4d382001d423e9839f382e543723500566e3e71fe08c004765f848aacda8df2478dcfdafc0fa377cc6beda9e5c5a9b456ccb0fccde94ade50fd58a057d79e805344fa57ee75e28cce37bda4f68fd890f21a99598e68bb02ebb36864a8503403a5d01eba9873def7cf19c10a6cb9d0eaff55e714a0855fe0323feec9ce1a1d5787a9908ac4171becb75450c06e7d5f747954ac8b9ee58d259bf931ceb7366b454c7bc82c18490c8407866969858a6c13e11b721780806f2116ad771caf6a3674c77ba0176a4c4c5fefdaa93fcae5dc03d50203010001"
|
||||
"id": "QmYmfUS4A3E64BzU8DsCmCWpPhcXWU2KTKNRGtdtN4oCgU",
|
||||
"privKey": "CAASqAkwggSkAgEAAoIBAQCYtGLh+ow9WEJMn50voPGa6MsqSgJx8pNXGtk5kMSktWxfYHrejLZJjN0+br2CwpFMtf9JW6dAIpxb3qViBCFXjzEK8JuYaXM2sHC6sapyCxeZUbZJtGAXNWQW3qV7m8s8cJTOu2s1euT/G6uf/mIVFIzCkQDx+Ejh5Aie+BTAEf1WbLmcoDDxVESe22gpTxtMG8WTocMV34BxKn8d8vhcZZsi8LLkjg172QwQr3Q68jKgdja3K1YYm6fnso6H3+H06IHgPFAvVhycBbmlyR3bL/hFBl6+ElwBxeIrlM/oAY93KCs622SLYWFHb+J2q7WofSbUSscp3gWj7c8KJqHvAgMBAAECggEBAJZi4BcpBj/L0c9gSg8D86zZomvNY0cQ3GYmPNPibKbBPS9Y9uiBr2wT3DeGHADQ2QOxIO7/4mDZNR+Mz1cONj/i9yuM9c9N2nd7oClcmz2hCualgF5p01BH9oBHWLW5IpgtT3+hN939X9SVTZpNjg6wpEdhQosKN8yvJIZaTyUvh/ZMRIJvbnbLg13gIF7Lpyn1rtFovQg0dET0C8zhTCDPacJIOLp8BIBMknPfOl0SrvOMZjufzVZLvbt0YraXhLK8EWe87ffTMoBlIktWpEKdPBOCuFf4E4WRXJ78tcbvNtx3f5zGi+ZVbKcLA1axu+OqbjHCG6yrlywcVBoTuxECgYEA56yDBaM0VFD1CqsqwYIWmAyYBjV7dkM+ogMb+mfQn+ja6QSt+U/APXB3dP+EDvysh5AZR0wpUrmz14xC1yB1/XAKIfMLQZB8DdUkuj5UcsKjkzLJkIFYGOXIutU7IHTma7s/0fLxwp8SvkEL+6nHuZskf77yjDAvWLZeSD/CYWsCgYEAqL0mKeyyhBBFvNJyE3CyyhDfzgf+NrvrNJcx73nAzLDE44BPc/3lHYn2AJJhasNnjJfRiFzW90PNgCjZLLXqeHkX4xixoibvRtb31WHR2UyxXe/KQZwBy11mPzStnI4Y83C2A8OXsx4xAPq69nX9foSFD6cuLkWUGeb8f7Jxbo0CgYB25mfcJdW+jEom7pAj/kLgSF5hmWNC3+IuPhBG5K8C0vw+6ULsmEyee7EjX9wD4RQfAwqmN+VhaqNtNbQ8OpGzv6PDprwZKzEv3DtcRo8K0vAmpMMkIe334T6y/Kq6zqRPmCt58gi4DPIOqM2gnJM/o+sIkRRkdHpoOjiLNgXp/wKBgQCNrGpLjwl/am4zEHppKhljIPHX+cwORo8/06ZAi/g9pDlbThLnr4fb2kaqyjxyuGfLmnh5xoFSkCINdb6KFJ8t0XYl3UjffVMvJjRle0EG8qaE2Vz24zZ6egvsC52ssX3vf3XDCUjoQfQg/2NUpVJWFIvnzZUvkom7ib38tWUZzQKBgDe0+OqdJEIdajkwCMEYbmZDYqkbw4pgmwSqCwK7HeCi8dvACW5OCCutnN0L57eEltyWy0XP2XmRlfsD0atkKBq3KgNfSawx6/t/K3OtZa8VAtg2M0PbCZljW/8Bz6xlxiyPXFTRgr9zr4yM1homMmPA39hURmXNNedXUh3IMkH7",
|
||||
"pubKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYtGLh+ow9WEJMn50voPGa6MsqSgJx8pNXGtk5kMSktWxfYHrejLZJjN0+br2CwpFMtf9JW6dAIpxb3qViBCFXjzEK8JuYaXM2sHC6sapyCxeZUbZJtGAXNWQW3qV7m8s8cJTOu2s1euT/G6uf/mIVFIzCkQDx+Ejh5Aie+BTAEf1WbLmcoDDxVESe22gpTxtMG8WTocMV34BxKn8d8vhcZZsi8LLkjg172QwQr3Q68jKgdja3K1YYm6fnso6H3+H06IHgPFAvVhycBbmlyR3bL/hFBl6+ElwBxeIrlM/oAY93KCs622SLYWFHb+J2q7WofSbUSscp3gWj7c8KJqHvAgMBAAE="
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"id": "12209cc55e7a4dd253eb4867307a21dde36c49ff044c7ffac7adbecc339dc949e32b",
|
||||
"privKey": "080012a709308204a3020100028201010081365503703172a249b6d98d833c8ff875d8d7e8bec3f76fdca94f24ca0f73c84b5b2748381071deeabbb64309c9edd3c084f0fce0351d3fa131151fa9bb0d4bfd03b856f21f483a8162e657e0487a7b4c3045c0e86291007ae175bf46872c9794043271d0a5940ba76126e1b448cfcaf84150b7a56da997cad75e996176d2750526be99907edf35f4bae8490df2f96b4b337f11c18f7ec3d428209682fdf420e5cb11d59ba3aace98ead99bfa39e403bbc343aed643f04c1b0af9d9fbf6a815dc1ddaf58de655d49eaea58020634e6e3bdd21684e157b07b54162c509bed7ae74e04da7a188f59adc982da4e3ed1d525a3c2d23f6c7535d154bdb9b2e97426f02030100010282010039cd19489976b5461ddd9b026ff3b69fb9f00fddc1009efebe624ad23545a650b24d0b8c85efed5080070aa8808781495974deecf04b325355834464cea3ab7613b0075575a842c25140f1b3dbd3f05e999d7a86aa2df599965ea732b295238087293d7ba68f7b639f3399961bf4fa675c98b34803cbc3b2f07d5987198f72e354b46f1f485c0f4f7b0418a28627462f12989edbac437d953b4870e50b07b00401e380e0189b9ceed55bca893ad7ae3014e49a2163b2a6d81a678d92f5d417147ed5c0af9160bfc3f4213214e6c60c8a1d579191d74c0e79399d2fa335e8dd75b173b4b4d51fc19aca2d388b591293ec21b965fc9a31059f179a80349ad7c17902818100fc381f94a2559b256b3a267102c4ac5ea2cd8747b8806133dddc7f35c539a8ee7db5dfb1f97435946395daff7a1548009263fd4b4ff1569947612a4cb68bb4159436cd06e53c907f6cd5965648a6dee116afafe3eb643fbdd98293c9fa04dfb16ea6dc1565ecdf76d390cc21100fd6b1215dd6d314b3598c6a86a8932a1b489b0281810083262d308b0a2c72bc614c61ef465430762389e24d098bb404abdfda22d5b90193ca996aeb20a043a0b4a3794e871dca9a5575b78e37557c38fc3bca789f61b4def2e87a32a3097f99504b70c66dee5de1140f5455701548a70f8fa4a04058244b2289b183496305bed2b3cf7383bed00c04005b57b87b6f1560324788de78bd028181008ed3594ed9fe9034c85bcd9901704e0be93569fdfb44f7c65f4495e4e52299bf3400e203eeb7180047c47c975f92dd8b355ad9fce3f04e91ce11ffda21254b7d4cc91ba163febff4e8b4aac581aebd57c97903a9958ad76db2d676ca5182a109e1172c5a11b5e97568a8fe6f5aa11d7a80e29adc3d44b2d90919e82c2e13f531028180596fee7f5d4279df60f26599a008711f7f616b05a60dad74fd7e8cb100f28931372d8204750691e4acb2a38cf56d9576765b7364d31a8f34a0d3fa9e703618f6b4d8288c34fe145b2d1da1e4ed9d4862433d5fdade4d0a66ba6f15416a7b96e06150d35ff82d52d737340fa5989c2ec3487e6e13dcb5958fc29f108ad21f0d6d02818034615146ff8564037844255d5f6f324efa20f13f22ad0a1279060548e7b31a9be32794e6be3b92eb6b006d6dde82abe3b81c8dc55eb07e41d0b0fca2a2a6a6896170a128cac2041533825d176f0adcdd582c387f8bcdd4cd319764012714116c96f7735954d063f4280a98ae38faac2ae79fed7929a8d9d3c96c16410e5fc2ce",
|
||||
"pubKey": "080012a60230820122300d06092a864886f70d01010105000382010f003082010a028201010081365503703172a249b6d98d833c8ff875d8d7e8bec3f76fdca94f24ca0f73c84b5b2748381071deeabbb64309c9edd3c084f0fce0351d3fa131151fa9bb0d4bfd03b856f21f483a8162e657e0487a7b4c3045c0e86291007ae175bf46872c9794043271d0a5940ba76126e1b448cfcaf84150b7a56da997cad75e996176d2750526be99907edf35f4bae8490df2f96b4b337f11c18f7ec3d428209682fdf420e5cb11d59ba3aace98ead99bfa39e403bbc343aed643f04c1b0af9d9fbf6a815dc1ddaf58de655d49eaea58020634e6e3bdd21684e157b07b54162c509bed7ae74e04da7a188f59adc982da4e3ed1d525a3c2d23f6c7535d154bdb9b2e97426f0203010001"
|
||||
"id": "QmQAbW9j3wQ8JDFmg8JRid82EpZabuCngVDmhqzCmJwqt6",
|
||||
"privKey": "CAASpgkwggSiAgEAAoIBAQCAQjiCzMF+PQaDUuNa7avUsj2xnNTQcUrs4yHz/L+JI/AY2ij0iXsBSE0chK1KtBu24gZzWs3/BDyNl28E0Sd41QpK6oTVMHjUfLovO+h7G78bqpI83vk5CEOKt29VihQs282fivbQb5ALYwzBIW2lsIoWwrQq1btsNA5NXJ43OAcPZ9SybBUg49f5gWf/kmh/J6e1rvwyVjQc7cmmpzcQUc+XNL7db6T3ArokXZMyBK6oQCOaJc1bqwgHwYSI3parjds9k8Z6fXA2ub3Va//1EgjQ50lRZH03PGYS42HR1QSSz1eLjMmdrbJrZZj7IbXgqAO6gT6wlGLr5xMQudabAgMBAAECggEAQ9NBESJ4fGqHJDFUG8St5pevelqGTAhtZ+IhFWamXz6K/Il5uP9u9dmnNZqQDX47XbYfVSdC4kX6Q6I+SlzUs9htTfrA7gBpFW00BEB5C4k7wcSs+tWrE9bj6NpiXOjdDG/cSC9zn/wvP2ZM22DzG/jEvY6POku2hlzs50pAPNB7bBaKysA/e52J0Tu/Wf/+sZyp2MiYQJmIkfbYeDF2rqm5y04S6Z31O3SMQIETNcBK8T+L2jwx+Q0msB8toam7hRf1KjxD0yZe+Vff9tPfwjgEoWF+O27g3+rjDq/QqUfzOPMgvAFgELBMpv6CCM8/3l9gUu+7itBxDq65sDCoCQKBgQC6FTLTQA3ux3WV0/7MKXJIHgYZ4b8lIbiiWuO/6t2ZnwvLfTbiU5br/8bcRPL5ygFuIdzkx8VHcbkOmld/VE7qaRZoJb94JVvC6N+5MQxr+pzbWQSNcE+cKJgy1RADea8nad698ifls/39kZGCc6Srt2TqxTBuoZ3c9jEMs3N2pwKBgQCwcxNSw7Wkq302lKc/7QdtfegrwlLjRClLYaW9ESQeErayRY8pxLgl/XKap1HPyc0aQ+78W6w+DAxvcToGBsLak0ujJjzP7b8G6fo+cexuIr8NiGL4LVzpZfQjkfQU4DDwsOdedeKzGelIdstMMtAZDFG9eNPe99XeJBnYfIDS7QKBgH8xFjiHQ/6+n4T2DueGPPNGcm0mfPzoe8ed0KbR5v6mU+2XfPheon5VqpvNFTff9/JLey11z0byWMe+f6gs/HQFuKcfhiydfIdRnfp7qD32Y1kbE52J8yCOLtowAG4fsrWCDBpRdyvvR+EWqxs76IbnKDfA6UX1em4aaZSA5J9pAoGAE8aB5ue6Rt9VZDWa3QZCq9nNmIHp6kCsZB9ohN0T8C7mvOog1myOuutB2eVgvOoAC66LbUsU7ctJ5X+KIjzFv9t8Qae6bw9VNoAopLD974YDZY/gj7H91Maxav8jnOdXdNJOy/5oTuxbgdyWgk67leMUkiiljjq2hHQFVYb2pS0CgYBam0ZJ5Trds1LijE2eoYPyiJdhWEsHYFDzoV17cyjhbSrmlWJBNKQfw6q6UtnxSNFMvsPOZv53d3B8iIDnZ/UHFvw1et+yQk/QrxTfXurqn8lJcMCfKzm3ORKibgJPMmtcPbLoxuEKXMXx18iwoCsMnapijJ0Qj5HofluiupSfxg==",
|
||||
"pubKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCAQjiCzMF+PQaDUuNa7avUsj2xnNTQcUrs4yHz/L+JI/AY2ij0iXsBSE0chK1KtBu24gZzWs3/BDyNl28E0Sd41QpK6oTVMHjUfLovO+h7G78bqpI83vk5CEOKt29VihQs282fivbQb5ALYwzBIW2lsIoWwrQq1btsNA5NXJ43OAcPZ9SybBUg49f5gWf/kmh/J6e1rvwyVjQc7cmmpzcQUc+XNL7db6T3ArokXZMyBK6oQCOaJc1bqwgHwYSI3parjds9k8Z6fXA2ub3Va//1EgjQ50lRZH03PGYS42HR1QSSz1eLjMmdrbJrZZj7IbXgqAO6gT6wlGLr5xMQudabAgMBAAE="
|
||||
}
|
||||
|
Reference in New Issue
Block a user