protected async UniTask HandshakeAsync(int bits) { // in the very first message we must mine a hashcash token // and send that as a hello // the server won't accept connections otherwise string applicationName = Application.productName; HashCash token = await UniTask.RunOnThreadPool(() => HashCash.Mine(applicationName, bits)); byte[] hello = new byte[1000]; int length = HashCashEncoding.Encode(hello, 0, token); var data = new ArraySegment <byte>(hello, 0, length); // send a greeting and see if the server replies await SendAsync(data); var stream = new MemoryStream(); try { await ReceiveAsync(stream); } catch (Exception e) { throw new InvalidDataException("Unable to establish connection, no Handshake message received.", e); } }
// calculate the hash of a hashcash token private byte[] Hash(HashAlgorithm hashAlgorithm, byte[] buffer) { int length = HashCashEncoding.Encode(buffer, 0, this); return(hashAlgorithm.ComputeHash(buffer, 0, length)); }