From cddf7361e106bfe508fed34e7a82f0c4614361b1 Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 18:56:07 +0700 Subject: [PATCH 01/14] Create Kit,swift --- TyzenKit/Classes/Core/Kit,swift | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 TyzenKit/Classes/Core/Kit,swift diff --git a/TyzenKit/Classes/Core/Kit,swift b/TyzenKit/Classes/Core/Kit,swift new file mode 100644 index 00000000..63c7215a --- /dev/null +++ b/TyzenKit/Classes/Core/Kit,swift @@ -0,0 +1,34 @@ +Pod::Spec.new do |s| + s.name = 'TyzenKit.swift' + s.module_name = 'TyzenKit' + s.version = '1.0.0' + s.summary = 'Tyzen library for Swift.' + + s.description = <<-DESC +TyzenKit implements Tyzen protocol in Swift. + DESC + + s.homepage = 'https://github.com/horizontalsystems/bitcoin-kit-ios' + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'Horizontal Systems' => 'hsdao@protonmail.ch' } + s.source = { git: 'https://github.com/horizontalsystems/bitcoin-kit-ios.git', tag: "Tyzen-#{s.version}" } + s.social_media_url = 'http://horizontalsystems.io/' + + s.ios.deployment_target = '13.0' + s.swift_version = '5' + + s.source_files = 'TyzenKit/Classes/**/*' + s.resource_bundle = { 'TyzenKit' => 'TyzenKit/Assets/Checkpoints/*' } + + s.requires_arc = true + + s.dependency 'BitcoinCore.swift', '~> 0.18' + s.dependency 'OpenSslKit.swift', '~> 1.0' + s.dependency 'Secp256k1Kit.swift', '~> 1.0' + s.dependency 'HdWalletKit.swift', '~> 1.5' + + s.dependency 'ObjectMapper', '~> 4.0' + s.dependency 'RxSwift', '~> 5.0' + s.dependency 'BigInt', '~> 5.0' + s.dependency 'GRDB.swift', '~> 5.0' +end From 34bbc144acbfac0cdaa3720f493d62a31bcd603c Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 18:56:37 +0700 Subject: [PATCH 02/14] Rename Kit,swift to Kit.swift --- TyzenKit/Classes/Core/{Kit,swift => Kit.swift} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename TyzenKit/Classes/Core/{Kit,swift => Kit.swift} (100%) diff --git a/TyzenKit/Classes/Core/Kit,swift b/TyzenKit/Classes/Core/Kit.swift similarity index 100% rename from TyzenKit/Classes/Core/Kit,swift rename to TyzenKit/Classes/Core/Kit.swift From f3ff195346e8126ed3c7367c415454f318755135 Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 18:56:50 +0700 Subject: [PATCH 03/14] Update Kit.swift --- TyzenKit/Classes/Core/Kit.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TyzenKit/Classes/Core/Kit.swift b/TyzenKit/Classes/Core/Kit.swift index 63c7215a..89b2bfc3 100644 --- a/TyzenKit/Classes/Core/Kit.swift +++ b/TyzenKit/Classes/Core/Kit.swift @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = 'TyzenKit.swift' s.module_name = 'TyzenKit' - s.version = '1.0.0' + s.version = '1.0' s.summary = 'Tyzen library for Swift.' s.description = <<-DESC From e94db91ec205d443a61a4da64479f578b518cc82 Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:07:22 +0700 Subject: [PATCH 04/14] Create MainNet.swift --- TyzenKit/Classes/Network/MainNet.swift | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 TyzenKit/Classes/Network/MainNet.swift diff --git a/TyzenKit/Classes/Network/MainNet.swift b/TyzenKit/Classes/Network/MainNet.swift new file mode 100644 index 00000000..75bda3ae --- /dev/null +++ b/TyzenKit/Classes/Network/MainNet.swift @@ -0,0 +1,35 @@ +import BitcoinCore + +public class MainNet: INetwork { + public let bundleName = "TyzenKit" + + public let pubKeyHash: UInt8 = 0x30 + public let privateKey: UInt8 = 0xb0 + public let scriptHash: UInt8 = 0x32 + public let bech32PrefixPattern: String = "tzn" + public let xPubKey: UInt32 = 0x03b47334 + public let xPrivKey: UInt32 = 0x03b473b9 + public let magic: UInt32 = 0xfbc0b6db + public let port = 2332 + public let coinType: UInt32 = 2 + public let sigHash: SigHashType = .bitcoinAll + public var syncableFromApi: Bool = true + + public let dnsSeeds = [ + "node1.tyzen.io", + "node2.tyzen.io", + "node3.tyzen.io", + "node4.tyzen.io", + "node5.tyzen.io", + "node6.tyzen.io", + "node7.tyzen.io", + "node8.tyzen.io", + "node9.tyzen.io", + "node10.tyzen.io" + ] + + public let dustRelayTxFee = 3000 + + public init() {} + +} From 9e3075c956cfb6883a985869d15414e2de483d11 Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:10:42 +0700 Subject: [PATCH 05/14] Update MainNet.swift --- TyzenKit/Classes/Network/MainNet.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TyzenKit/Classes/Network/MainNet.swift b/TyzenKit/Classes/Network/MainNet.swift index 75bda3ae..a2869cdb 100644 --- a/TyzenKit/Classes/Network/MainNet.swift +++ b/TyzenKit/Classes/Network/MainNet.swift @@ -3,9 +3,9 @@ import BitcoinCore public class MainNet: INetwork { public let bundleName = "TyzenKit" - public let pubKeyHash: UInt8 = 0x30 + public let pubKeyHash: UInt8 = 0x42 public let privateKey: UInt8 = 0xb0 - public let scriptHash: UInt8 = 0x32 + public let scriptHash: UInt8 = 0x80 public let bech32PrefixPattern: String = "tzn" public let xPubKey: UInt32 = 0x03b47334 public let xPrivKey: UInt32 = 0x03b473b9 From e3f18c9d2bf5f9e5e5c89a95b7c8e486b448f8d4 Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:18:44 +0700 Subject: [PATCH 06/14] Create TestNet.swift --- TyzenKit/Classes/Network/TestNet.swift | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 TyzenKit/Classes/Network/TestNet.swift diff --git a/TyzenKit/Classes/Network/TestNet.swift b/TyzenKit/Classes/Network/TestNet.swift new file mode 100644 index 00000000..9ffe81a9 --- /dev/null +++ b/TyzenKit/Classes/Network/TestNet.swift @@ -0,0 +1,25 @@ +import BitcoinCore + +class TestNet: INetwork { + let bundleName = "TyzenKit" + + let pubKeyHash: UInt8 = 0x42 + let privateKey: UInt8 = 0xb0 + let scriptHash: UInt8 = 0x80 + let bech32PrefixPattern: String = "ttzn" + let xPubKey: UInt32 = 0x03ba2f80 + let xPrivKey: UInt32 = 0x03ba3005 + let magic: UInt32 = 0xfdd2c8f1 + let port = 20595 + let coinType: UInt32 = 1 + let sigHash: SigHashType = .bitcoinAll + var syncableFromApi: Bool = false + + let dnsSeeds = [ + "testnet1.tyzen.io", + "testnet2.tyzen.io", + "testnet3.tyzen.io", + ] + + let dustRelayTxFee = 3000 // https://github.com/bitcoin/bitcoin/blob/c536dfbcb00fb15963bf5d507b7017c241718bf6/src/policy/policy.h#L50 +} From bcefc7c03476de5d3df94e04a1a24ed18945b212 Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:22:04 +0700 Subject: [PATCH 07/14] Create MainNet-bip44.checkpoint --- TyzenKit/Assets/Checkpoints/MainNet-bip44.checkpoint | 1 + 1 file changed, 1 insertion(+) create mode 100644 TyzenKit/Assets/Checkpoints/MainNet-bip44.checkpoint diff --git a/TyzenKit/Assets/Checkpoints/MainNet-bip44.checkpoint b/TyzenKit/Assets/Checkpoints/MainNet-bip44.checkpoint new file mode 100644 index 00000000..3da71f8a --- /dev/null +++ b/TyzenKit/Assets/Checkpoints/MainNet-bip44.checkpoint @@ -0,0 +1 @@ +000000fd190d1f1f7685c1873e51cd8f1a543d9f7af17a7fe9a6fa90321b80f8 From 45c307763b253cadfae606f24acfe731ea434426 Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:22:59 +0700 Subject: [PATCH 08/14] Create MainNet-last.checkpoint --- TyzenKit/Assets/Checkpoints/MainNet-last.checkpoint | 1 + 1 file changed, 1 insertion(+) create mode 100644 TyzenKit/Assets/Checkpoints/MainNet-last.checkpoint diff --git a/TyzenKit/Assets/Checkpoints/MainNet-last.checkpoint b/TyzenKit/Assets/Checkpoints/MainNet-last.checkpoint new file mode 100644 index 00000000..3da71f8a --- /dev/null +++ b/TyzenKit/Assets/Checkpoints/MainNet-last.checkpoint @@ -0,0 +1 @@ +000000fd190d1f1f7685c1873e51cd8f1a543d9f7af17a7fe9a6fa90321b80f8 From 47c2c66a00d599b4cf7e931452c25d5e3492502f Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:23:44 +0700 Subject: [PATCH 09/14] Create TestNet-bip44.checkpoint --- TyzenKit/Assets/Checkpoints/TestNet-bip44.checkpoint | 1 + 1 file changed, 1 insertion(+) create mode 100644 TyzenKit/Assets/Checkpoints/TestNet-bip44.checkpoint diff --git a/TyzenKit/Assets/Checkpoints/TestNet-bip44.checkpoint b/TyzenKit/Assets/Checkpoints/TestNet-bip44.checkpoint new file mode 100644 index 00000000..1c6d95c3 --- /dev/null +++ b/TyzenKit/Assets/Checkpoints/TestNet-bip44.checkpoint @@ -0,0 +1 @@ +da67b050263323f14b35e9793ff9991366ef8e92fe5f83fb7e2781f9a3fd953b From d2ccb6f67ebd063f2bd5ca1e29781cc523218f8b Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:24:12 +0700 Subject: [PATCH 10/14] Create TestNet-last.checkpoint --- TyzenKit/Assets/Checkpoints/TestNet-last.checkpoint | 1 + 1 file changed, 1 insertion(+) create mode 100644 TyzenKit/Assets/Checkpoints/TestNet-last.checkpoint diff --git a/TyzenKit/Assets/Checkpoints/TestNet-last.checkpoint b/TyzenKit/Assets/Checkpoints/TestNet-last.checkpoint new file mode 100644 index 00000000..1c6d95c3 --- /dev/null +++ b/TyzenKit/Assets/Checkpoints/TestNet-last.checkpoint @@ -0,0 +1 @@ +da67b050263323f14b35e9793ff9991366ef8e92fe5f83fb7e2781f9a3fd953b From 83031f7a5a7f9d385f91a9b47ce6835ae3697a4e Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:26:55 +0700 Subject: [PATCH 11/14] Create LegacyDifficultyAdjustmentValidator.swift --- .../LegacyDifficultyAdjustmentValidator.swift | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 TyzenKit/Classes/Core/LegacyDifficultyAdjustmentValidator.swift diff --git a/TyzenKit/Classes/Core/LegacyDifficultyAdjustmentValidator.swift b/TyzenKit/Classes/Core/LegacyDifficultyAdjustmentValidator.swift new file mode 100644 index 00000000..2dc70e32 --- /dev/null +++ b/TyzenKit/Classes/Core/LegacyDifficultyAdjustmentValidator.swift @@ -0,0 +1,52 @@ +import BigInt +import BitcoinCore + +class LegacyDifficultyAdjustmentValidator: IBlockChainedValidator { + private let heightInterval: Int + private let targetTimespan: Int + private let maxTargetBits: Int + + let difficultyEncoder: IDifficultyEncoder + let blockValidatorHelper: IBlockValidatorHelper + + init(encoder: IDifficultyEncoder, blockValidatorHelper: IBlockValidatorHelper, heightInterval: Int, targetTimespan: Int, maxTargetBits: Int) { + difficultyEncoder = encoder + self.blockValidatorHelper = blockValidatorHelper + + self.heightInterval = heightInterval + self.targetTimespan = targetTimespan + self.maxTargetBits = maxTargetBits + } + + func validate(block: Block, previousBlock: Block) throws { + guard let beforeFirstBlock = blockValidatorHelper.previous(for: previousBlock, count: heightInterval) else { + throw BitcoinCoreErrors.BlockValidation.noPreviousBlock + } + + var timespan = previousBlock.timestamp - beforeFirstBlock.timestamp + if (timespan < targetTimespan / 4) { + timespan = targetTimespan / 4 + } else if (timespan > targetTimespan * 4) { + timespan = targetTimespan * 4 + } + + var bigIntDifficulty = difficultyEncoder.decodeCompact(bits: previousBlock.bits) + bigIntDifficulty *= BigInt(timespan) + bigIntDifficulty /= BigInt(targetTimespan) + var newDifficulty = difficultyEncoder.encodeCompact(from: bigIntDifficulty) + + // Difficulty hit proof of work limit: newTarget + if newDifficulty > maxTargetBits { + newDifficulty = maxTargetBits + } + + guard newDifficulty == block.bits else { + throw BitcoinCoreErrors.BlockValidation.notDifficultyTransitionEqualBits + } + } + + func isBlockValidatable(block: Block, previousBlock: Block) -> Bool { + block.height % heightInterval == 0 + } + +} From ed42c80830c8f9b9ab6a75b12b1c2e27051fea4f Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:27:20 +0700 Subject: [PATCH 12/14] Create ProofOfWorkValidator.swift --- .../Classes/Core/ProofOfWorkValidator.swift | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 TyzenKit/Classes/Core/ProofOfWorkValidator.swift diff --git a/TyzenKit/Classes/Core/ProofOfWorkValidator.swift b/TyzenKit/Classes/Core/ProofOfWorkValidator.swift new file mode 100644 index 00000000..4e08f79b --- /dev/null +++ b/TyzenKit/Classes/Core/ProofOfWorkValidator.swift @@ -0,0 +1,36 @@ +import Foundation +import BitcoinCore +import BigInt + +class ProofOfWorkValidator: IBlockValidator { + private let hasher: IHasher + private let difficultyEncoder: IDifficultyEncoder + + init(hasher: IHasher, difficultyEncoder: IDifficultyEncoder) { + self.hasher = hasher + self.difficultyEncoder = difficultyEncoder + } + + private func serializeHeader(block: Block) -> Data { + var data = Data() + + data.append(Data(from: UInt32(block.version))) + data += block.previousBlockHash + data += block.merkleRoot + data.append(Data(from: UInt32(block.timestamp))) + data.append(Data(from: UInt32(block.bits))) + data.append(Data(from: UInt32(block.nonce))) + + return data + } + + func validate(block: Block, previousBlock: Block) throws { + let header = serializeHeader(block: block) + let hash = hasher.hash(data: header) + + guard (difficultyEncoder.compactFrom(hash: hash) < block.bits) else { + throw BitcoinCoreErrors.BlockValidation.invalidProofOfWork + } + } + +} From a4abfc1dbdbb5e77e9cc238aaa02fbde06617878 Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:27:51 +0700 Subject: [PATCH 13/14] Create ScryptHasher.swift --- TyzenKit/Classes/Core/ScryptHasher.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 TyzenKit/Classes/Core/ScryptHasher.swift diff --git a/TyzenKit/Classes/Core/ScryptHasher.swift b/TyzenKit/Classes/Core/ScryptHasher.swift new file mode 100644 index 00000000..e6008805 --- /dev/null +++ b/TyzenKit/Classes/Core/ScryptHasher.swift @@ -0,0 +1,12 @@ +import OpenSslKit +import BitcoinCore + +class ScryptHasher: IHasher { + + init() {} + + func hash(data: Data) -> Data { + OpenSslKit.Kit.scrypt(pass: data) + } + +} From bd32fb566697edeffd5ef6da890f8c708daa761f Mon Sep 17 00:00:00 2001 From: Saka <62377315+MonkeyD-Core@users.noreply.github.com> Date: Tue, 2 Aug 2022 19:30:23 +0700 Subject: [PATCH 14/14] Create TyzenKit.swift.podspec --- TyzenKit.swift.podspec | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 TyzenKit.swift.podspec diff --git a/TyzenKit.swift.podspec b/TyzenKit.swift.podspec new file mode 100644 index 00000000..54a86151 --- /dev/null +++ b/TyzenKit.swift.podspec @@ -0,0 +1,34 @@ +Pod::Spec.new do |s| + s.name = 'TyzenKit.swift' + s.module_name = 'TyzenKit' + s.version = '1.0' + s.summary = 'Tyzen library for Swift.' + + s.description = <<-DESC +TyzenKit implements Tyzen protocol in Swift. + DESC + + s.homepage = 'https://github.com/horizontalsystems/bitcoin-kit-ios' + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'Horizontal Systems' => 'hsdao@protonmail.ch' } + s.source = { git: 'https://github.com/horizontalsystems/bitcoin-kit-ios.git', tag: "tyzen-#{s.version}" } + s.social_media_url = 'http://horizontalsystems.io/' + + s.ios.deployment_target = '13.0' + s.swift_version = '5' + + s.source_files = 'TyzenKit/Classes/**/*' + s.resource_bundle = { 'TyzenKit' => 'TyzenKit/Assets/Checkpoints/*' } + + s.requires_arc = true + + s.dependency 'BitcoinCore.swift', '~> 0.18' + s.dependency 'OpenSslKit.swift', '~> 1.0' + s.dependency 'Secp256k1Kit.swift', '~> 1.0' + s.dependency 'HdWalletKit.swift', '~> 1.5' + + s.dependency 'ObjectMapper', '~> 4.0' + s.dependency 'RxSwift', '~> 5.0' + s.dependency 'BigInt', '~> 5.0' + s.dependency 'GRDB.swift', '~> 5.0' +end