From ad8dea4fbf6bffe30b415350cf378f65c198029a Mon Sep 17 00:00:00 2001 From: otsmr Date: Fri, 18 Jul 2025 21:59:11 +0200 Subject: [PATCH] fixes combine list array --- .github/workflows/release_github.yml | 2 +- lib/src/services/api/media_upload.dart | 4 +++- lib/src/utils/pow.dart | 19 +++++++++++++++++++ test/unit_test.dart | 24 +++++++++++++++++++++++- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 lib/src/utils/pow.dart diff --git a/.github/workflows/release_github.yml b/.github/workflows/release_github.yml index 43e5836..03a0e67 100644 --- a/.github/workflows/release_github.yml +++ b/.github/workflows/release_github.yml @@ -36,7 +36,7 @@ jobs: echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> ./android/key.properties echo "keyPassword=${{ secrets.STORE_PASSWORD }}" >> ./android/key.properties echo "keyAlias=androidreleasekey" >> key.properties - echo "storeFile=./android/app/keystore.jks" >> ./android/key.properties + echo "storeFile=./keystore.jks" >> ./android/key.properties - name: Create keystore file env: diff --git a/lib/src/services/api/media_upload.dart b/lib/src/services/api/media_upload.dart index 1285929..5b2293b 100644 --- a/lib/src/services/api/media_upload.dart +++ b/lib/src/services/api/media_upload.dart @@ -824,7 +824,9 @@ Future getMediaBaseFilePath(String type) async { /// combines two utf8 list Uint8List combineUint8Lists(Uint8List list1, Uint8List list2) { final combinedLength = 4 + list1.length + list2.length; - final combinedList = Uint8List(combinedLength) + final combinedList = Uint8List(combinedLength); + ByteData.sublistView(combinedList).setInt32(0, list1.length); + combinedList ..setRange(4, 4 + list1.length, list1) ..setRange(4 + list1.length, combinedLength, list2); return combinedList; diff --git a/lib/src/utils/pow.dart b/lib/src/utils/pow.dart new file mode 100644 index 0000000..67d2ebe --- /dev/null +++ b/lib/src/utils/pow.dart @@ -0,0 +1,19 @@ +import 'package:cryptography_plus/cryptography_plus.dart'; +import 'package:drift/drift.dart'; + +bool isValid(int difficulty, List digest) { + final bits = digest.map((i) => i.toRadixString(2).padLeft(8, '0')).join(); + return bits.startsWith('0' * difficulty); +} + +Future calculatePoW(Uint8List prefix, int difficulty) async { + var i = 0; + while (true) { + i++; + final s = '$prefix$i'; + final digest = (await Sha256().hash(s.codeUnits)).bytes; + if (isValid(difficulty, digest)) { + return i; + } + } +} diff --git a/test/unit_test.dart b/test/unit_test.dart index bff97e1..b37a39f 100644 --- a/test/unit_test.dart +++ b/test/unit_test.dart @@ -1,13 +1,35 @@ +import 'dart:typed_data'; + import 'package:flutter_test/flutter_test.dart'; +import 'package:twonly/src/services/api/media_upload.dart'; +import 'package:twonly/src/utils/pow.dart'; import 'package:twonly/src/views/components/animate_icon.dart'; void main() { - group('isEmoji', () { + group('testing utils', () { test('test isEmoji function', () { expect(isEmoji('Hallo'), false); expect(isEmoji('😂'), true); expect(isEmoji('😂😂'), false); expect(isEmoji('Hallo 😂'), false); }); + + test('test proof-of-work simple', () async { + expect(await calculatePoW(Uint8List.fromList([41, 41, 41, 41]), 6), 33); + }); + + test('test utils', () async { + final list1 = Uint8List.fromList([41, 41, 41, 41, 41, 41, 41]); + final list2 = Uint8List.fromList([42, 42, 42]); + final combined = combineUint8Lists(list1, list2); + final lists = extractUint8Lists(combined); + expect(list1, lists[0]); + expect(list2, lists[1]); + }); + + test('encode hex', () async { + final list1 = Uint8List.fromList([41, 41, 41, 41, 41, 41, 41]); + expect(list1, hexToUint8List(uint8ListToHex(list1))); + }); }); }