Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/staging' into start-stop-syncing
Browse files Browse the repository at this point in the history
  • Loading branch information
dguenther committed May 14, 2024
2 parents 87d95d6 + 62b7e71 commit 3c8f732
Show file tree
Hide file tree
Showing 20 changed files with 483 additions and 141 deletions.
9 changes: 6 additions & 3 deletions .github/workflows/build-ironfish-rust-nodejs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ jobs:
working-directory: ./ironfish-rust-nodejs

- name: Upload artifact
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: bindings-${{ matrix.settings.target }}
path: ironfish-rust-nodejs/*.node
Expand All @@ -85,9 +85,12 @@ jobs:
fail-fast: false
matrix:
settings:
- host: macos-latest
- host: macos-13
target: x86_64-apple-darwin

- host: macos-latest
target: aarch64-apple-darwin

- host: windows-latest
target: x86_64-pc-windows-msvc

Expand Down Expand Up @@ -124,7 +127,7 @@ jobs:
node-version: 18

- name: Download artifacts
uses: actions/download-artifact@v3
uses: actions/download-artifact@v4
with:
name: bindings-${{ matrix.settings.target }}
path: ./ironfish-rust-nodejs
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ jobs:

steps:
- name: Check out Git repository
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Use Node.js
uses: actions/setup-node@v4
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-brew.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:
jobs:
Deploy:
name: Deploy
runs-on: macos-12
runs-on: macos-13

steps:
- name: Check out Git repository
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/publish-binaries.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
fail-fast: false
matrix:
settings:
- host: macos-latest
- host: macos-13
arch: x86_64
system: apple

Expand All @@ -29,7 +29,7 @@ jobs:
arch: x86_64
system: linux

- host: macos-latest-xlarge
- host: macos-latest
arch: arm64
system: apple

Expand Down
1 change: 1 addition & 0 deletions ironfish-rust-nodejs/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ export interface Key {
export function generateKey(): Key
export function spendingKeyToWords(privateKey: string, languageCode: LanguageCode): string
export function wordsToSpendingKey(words: string, languageCode: LanguageCode): string
export function generatePublicAddressFromIncomingViewKey(ivkString: string): string
export function generateKeyFromPrivateKey(privateKey: string): Key
export function initializeSapling(): void
export function isValidPublicAddress(hexAddress: string): boolean
Expand Down
3 changes: 2 additions & 1 deletion ironfish-rust-nodejs/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ if (!nativeBinding) {
throw new Error(`Failed to load native binding`)
}

const { FishHashContext, KEY_LENGTH, NONCE_LENGTH, BoxKeyPair, randomBytes, boxMessage, unboxMessage, RollingFilter, initSignalHandler, triggerSegfault, ASSET_ID_LENGTH, ASSET_METADATA_LENGTH, ASSET_NAME_LENGTH, ASSET_LENGTH, Asset, NOTE_ENCRYPTION_KEY_LENGTH, MAC_LENGTH, ENCRYPTED_NOTE_PLAINTEXT_LENGTH, ENCRYPTED_NOTE_LENGTH, NoteEncrypted, PUBLIC_ADDRESS_LENGTH, RANDOMNESS_LENGTH, MEMO_LENGTH, AMOUNT_VALUE_LENGTH, DECRYPTED_NOTE_LENGTH, Note, PROOF_LENGTH, TRANSACTION_SIGNATURE_LENGTH, TRANSACTION_PUBLIC_KEY_RANDOMNESS_LENGTH, TRANSACTION_EXPIRATION_LENGTH, TRANSACTION_FEE_LENGTH, LATEST_TRANSACTION_VERSION, TransactionPosted, Transaction, verifyTransactions, UnsignedTransaction, LanguageCode, generateKey, spendingKeyToWords, wordsToSpendingKey, generateKeyFromPrivateKey, initializeSapling, FoundBlockResult, ThreadPoolHandler, isValidPublicAddress, multisig } = nativeBinding
const { FishHashContext, KEY_LENGTH, NONCE_LENGTH, BoxKeyPair, randomBytes, boxMessage, unboxMessage, RollingFilter, initSignalHandler, triggerSegfault, ASSET_ID_LENGTH, ASSET_METADATA_LENGTH, ASSET_NAME_LENGTH, ASSET_LENGTH, Asset, NOTE_ENCRYPTION_KEY_LENGTH, MAC_LENGTH, ENCRYPTED_NOTE_PLAINTEXT_LENGTH, ENCRYPTED_NOTE_LENGTH, NoteEncrypted, PUBLIC_ADDRESS_LENGTH, RANDOMNESS_LENGTH, MEMO_LENGTH, AMOUNT_VALUE_LENGTH, DECRYPTED_NOTE_LENGTH, Note, PROOF_LENGTH, TRANSACTION_SIGNATURE_LENGTH, TRANSACTION_PUBLIC_KEY_RANDOMNESS_LENGTH, TRANSACTION_EXPIRATION_LENGTH, TRANSACTION_FEE_LENGTH, LATEST_TRANSACTION_VERSION, TransactionPosted, Transaction, verifyTransactions, UnsignedTransaction, LanguageCode, generateKey, spendingKeyToWords, wordsToSpendingKey, generatePublicAddressFromIncomingViewKey, generateKeyFromPrivateKey, initializeSapling, FoundBlockResult, ThreadPoolHandler, isValidPublicAddress, multisig } = nativeBinding

module.exports.FishHashContext = FishHashContext
module.exports.KEY_LENGTH = KEY_LENGTH
Expand Down Expand Up @@ -294,6 +294,7 @@ module.exports.LanguageCode = LanguageCode
module.exports.generateKey = generateKey
module.exports.spendingKeyToWords = spendingKeyToWords
module.exports.wordsToSpendingKey = wordsToSpendingKey
module.exports.generatePublicAddressFromIncomingViewKey = generatePublicAddressFromIncomingViewKey
module.exports.generateKeyFromPrivateKey = generateKeyFromPrivateKey
module.exports.initializeSapling = initializeSapling
module.exports.FoundBlockResult = FoundBlockResult
Expand Down
8 changes: 8 additions & 0 deletions ironfish-rust-nodejs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use std::fmt::Display;

use ironfish::keys::Language;
use ironfish::serializing::bytes_to_hex;
use ironfish::IncomingViewKey;
use ironfish::PublicAddress;
use ironfish::SaplingKey;

Expand Down Expand Up @@ -96,6 +97,13 @@ pub fn words_to_spending_key(words: String, language_code: LanguageCode) -> Resu
Ok(key.hex_spending_key())
}

#[napi]
pub fn generate_public_address_from_incoming_view_key(ivk_string: String) -> Result<String> {
let ivk = IncomingViewKey::from_hex(&ivk_string).map_err(to_napi_err)?;
let address = PublicAddress::from_view_key(&ivk);
Ok(address.hex_public_address())
}

#[napi]
pub fn generate_key_from_private_key(private_key: String) -> Result<Key> {
let sapling_key = SaplingKey::from_hex(&private_key).map_err(to_napi_err)?;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
import { generateKeyFromPrivateKey, PUBLIC_ADDRESS_LENGTH } from '@ironfish/rust-nodejs'
import { PUBLIC_ADDRESS_LENGTH } from '@ironfish/rust-nodejs'
import bufio from 'bufio'
import {
IDatabase,
IDatabaseEncoding,
IDatabaseStore,
IDatabaseTransaction,
StringEncoding,
} from '../../../storage'
import { Account } from '../../../wallet'
import { MigrationContext } from '../../migration'
import { IDatabase, IDatabaseEncoding, IDatabaseStore, StringEncoding } from '../../../storage'

const KEY_LENGTH = 32

Expand Down Expand Up @@ -83,29 +75,3 @@ export function GetOldStores(db: IDatabase): {

return { accounts }
}

export async function GetOldAccounts(
context: MigrationContext,
db: IDatabase,
tx?: IDatabaseTransaction,
): Promise<Account[]> {
const accounts = []
const oldStores = GetOldStores(db)

for await (const account of oldStores.accounts.getAllValuesIter(tx)) {
const key = generateKeyFromPrivateKey(account.spendingKey)

accounts.push(
new Account({
...account,
version: 1,
proofAuthorizingKey: null,
viewKey: key.viewKey,
createdAt: null,
walletDb: context.wallet.walletDb,
}),
)
}

return accounts
}
9 changes: 9 additions & 0 deletions ironfish/src/rpc/clients/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ import type {
GetBannedPeersResponse,
GetBlockRequest,
GetBlockResponse,
GetBlocksRequest,
GetBlocksResponse,
GetChainInfoRequest,
GetChainInfoResponse,
GetConfigRequest,
Expand Down Expand Up @@ -853,6 +855,13 @@ export abstract class RpcClient {
).waitForEnd()
},

getBlocks: (params: GetBlocksRequest): Promise<RpcResponseEnded<GetBlocksResponse>> => {
return this.request<GetBlocksResponse>(
`${ApiNamespace.chain}/getBlocks`,
params,
).waitForEnd()
},

getDifficulty: (
params: GetDifficultyRequest = undefined,
): Promise<RpcResponseEnded<GetDifficultyResponse>> => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
{
"": [
{
"version": 4,
"id": "a7427a4a-181c-4b06-950d-c133a4ab330d",
"name": "test",
"spendingKey": "a14b8468a4eab4971a43abd848bc6456f6730f3870b829cd4b69def3fbb70e7f",
"viewKey": "4b78b19fd731aa5d7f3aac13985628c4c96d5df019b82654c8f620ecdfb5521ab3e13f27b78e3377b210d96b6dff84e7894f48a419ec5eb4323be08fb578fc56",
"incomingViewKey": "c0d14e83e16b122b4c3107f45d306af06b0f43999b9cfed93b78c3909b344b03",
"outgoingViewKey": "27d18c79c89b8eeb507be460265da970b550cc392b1a30ece617f3ea0013f0ae",
"publicAddress": "7cd11a7b3d49070babd5c65ae0823d3ff29a5d8656ef57a2f1703b8b91923b1b",
"createdAt": {
"hash": {
"type": "Buffer",
"data": "base64:R5HXrp+X3xAO8VWOhHctagm0N2I4goP3XG8goyqIqoY="
},
"sequence": 1
},
"proofAuthorizingKey": "bbb0172286cd6624fb59db3339bf7b0ab2eb7b7cf8a16d62ee67ea08c4cded0c"
},
{
"header": {
"sequence": 2,
"previousBlockHash": "4791D7AE9F97DF100EF1558E84772D6A09B43762388283F75C6F20A32A88AA86",
"noteCommitment": {
"type": "Buffer",
"data": "base64:+JgMgz0I6BhxXExCcTL1s+e5o9jpFo/IfSrcqhrUYRo="
},
"transactionCommitment": {
"type": "Buffer",
"data": "base64:WDiES2ikkfXnL8h4nCdxnkR6xpSmJwTY70ql0pCFPls="
},
"target": "9282972777491357380673661573939192202192629606981189395159182914949423",
"randomness": "0",
"timestamp": 1715291987949,
"graffiti": "0000000000000000000000000000000000000000000000000000000000000000",
"noteSize": 4,
"work": "0"
},
"transactions": [
{
"type": "Buffer",
"data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzKiP////8AAAAAb9D1oEcQMQXo/m0pO3n2qIxZk+JOnECY1/8iL7Vl6FWI9ZFyLUCNXyP3WrW+LxOik1GL82Vjp+iaqdpoCu4RbFJUtUCcFsI0rEppyghXHDqKwaBVQCVQfJ8FM4PL93sPJfOOaTCLmscaj7Rpr1UeaC/IKcv2qJhHZskFa2P1MCQMZPm4zFhDbUdrGsoGtKRWj1zXYfPdKzloG06jFqDUMvlL8heEiAHAUXDME2gZLlSnTmCZ5n1sXzBmjiFg741EXPF0z0e5iP2zMuwDMvSwvZN+3qGSDeIUYtCBD6p1h63WWLECRHKttDN05IQDKH+KPQqOJYwFKsUEWahThLzlAN/JVbAhQFeRyb5llhLXyzO7m58/fkJJswASpwGCYMIbMX0UUzubfA448mjqGYG5MN3k+jfKfJMGtV3tUJZmaY0xkjPb5C9N5jOlhtAMnq9xKWs5pxM24iekzYajz4uOhzelkGpZbSF0kL3HKKzq/akLdZ7BO34k/kaYCNnKK1NakUyul5n0A2wv+g6FlDrg4uQxqkj/M8jiZ+6ihyEoLhYA+3d8rx7dG2eFHu08uE2/bCRLgxrjdISDa8pJH/A6whKiaAnLvLSWBEVziHNpkpErnTDP2BU1kUlyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwmMEocFFpkk+Jbp6mpJU79scCSGcdDMk26FhIFo4tvs1bnARvEYt3BEPdI5Uuh/PrnS2H02rAOrXkginPgr4CAA=="
}
]
},
{
"header": {
"sequence": 3,
"previousBlockHash": "B510612D3173A72ADE75F8FD758F9681FBAD8029602186DF26AEB84E523706A7",
"noteCommitment": {
"type": "Buffer",
"data": "base64:w1VnTmyTP4q4K347NKXPvUaYABZRISC5P3Ga4bjYIU8="
},
"transactionCommitment": {
"type": "Buffer",
"data": "base64:cJuVSpwYLXd0yN0zJhxQRxbX+LLeOq17ymy0ZlI2sPk="
},
"target": "9255858786337818395603165512831024101510453493377417362192396248796027",
"randomness": "0",
"timestamp": 1715291990516,
"graffiti": "0000000000000000000000000000000000000000000000000000000000000000",
"noteSize": 7,
"work": "0"
},
"transactions": [
{
"type": "Buffer",
"data": "base64:AQAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/2vKiP////8AAAAA+L+4+wjYw9D7IJWwZc5YHm34gCGVLMcivjBIsZ/9qy6G7h+s0hrezaihkjibpq01Ha2Rf5gh5pEb9/W+fZpyEUkTbpixorCa5YaUX0lvx9a0fAeAiz/7RLvgGOW2S4PoRSC+GWLN/RDLx9wyApvfznjxTYGINptTTu+AL2SDE0QXhvpL1Y0J58DGEoHLSNkjcwY7G9X25wu5NjzgGfIQNE0jPG/VjvSZAiARO9oa5XaBbe2QV7rqHrJP63rCz1f1rE+jyOYVcMdAzfPPQ3yJYF8xPG4vAeAvpo+YjVpiiMKuG0kquzp/ur/6wATNzHAkQx+lqf2fBG1s8X57T3VvvUGP42zmjrERF9EAXUy8dHfCnn05CyEw/UV0LP0iZKhmkWAI/eoEiueZgdRnpWv4hNfltR2yAMwUJrVGqVmL5XJYs4z/jdbPt0ISG8e+dKRIXiKEGSmMbDD4MmWFD0touB041YYDk5S+S1eQabg2RFlG2J+QclGYysG4HiOLZzQ7KkmbgUH5CvCCZU8X05ImKbTRr/i32axOgP3UZkOe6AU+qdPUfl0BrfhTIcTaCo19azEWgO5uxxA+yMXQeDqw7MlQsquNRhzkjNMYlHSNeFz8HGWUJ082lklyb24gRmlzaCBub3RlIGVuY3J5cHRpb24gbWluZXIga2V5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwkX3WRVi99/y/hLVWdNH+DIvz9O/XylXCm5umoQoPwEXMVPjOZ/P4785gm9+3zBBJGFOyDKgoO09ZawPqOO5RAA=="
},
{
"type": "Buffer",
"data": "base64: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"
}
]
}
]
}
39 changes: 3 additions & 36 deletions ironfish/src/rpc/routes/chain/getBlock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
import * as yup from 'yup'
import { Assert } from '../../../assert'
import { getBlockSize, getTransactionSize } from '../../../network/utils/serializers'
import { getBlockSize } from '../../../network/utils/serializers'
import { FullNode } from '../../../node'
import { BlockHeader } from '../../../primitives'
import { GENESIS_BLOCK_SEQUENCE } from '../../../primitives/block'
import { BufferUtils } from '../../../utils'
import { RpcNotFoundError, RpcValidationError } from '../../adapters'
import { ApiNamespace } from '../namespaces'
import { routes } from '../router'
import { RpcBlock, RpcBlockSchema, serializeRpcBlockHeader } from '../types'
import { serializeRpcTransaction } from './utils'

export type GetBlockRequest = {
search?: string
Expand Down Expand Up @@ -109,40 +109,7 @@ routes.register<typeof GetBlockRequestSchema, GetBlockResponse>(
const transactions: GetBlockResponse['block']['transactions'] = []

for (const tx of block.transactions) {
transactions.push({
hash: tx.hash().toString('hex'),
size: getTransactionSize(tx),
fee: Number(tx.fee()),
expiration: tx.expiration(),
notes: tx.notes.map((note) => ({
commitment: note.hash().toString('hex'),
hash: note.hash().toString('hex'),
serialized: note.serialize().toString('hex'),
})),
spends: tx.spends.map((spend) => ({
nullifier: spend.nullifier.toString('hex'),
commitment: spend.commitment.toString('hex'),
size: spend.size,
})),
mints: tx.mints.map((mint) => ({
id: mint.asset.id().toString('hex'),
metadata: BufferUtils.toHuman(mint.asset.metadata()),
name: BufferUtils.toHuman(mint.asset.name()),
creator: mint.asset.creator().toString('hex'),
value: mint.value.toString(),
transferOwnershipTo: mint.transferOwnershipTo?.toString('hex'),
assetId: mint.asset.id().toString('hex'),
assetName: mint.asset.name().toString('hex'),
})),
burns: tx.burns.map((burn) => ({
id: burn.assetId.toString('hex'),
value: burn.value.toString(),
assetId: burn.assetId.toString('hex'),
assetName: '',
})),
signature: tx.transactionSignature().toString('hex'),
...(request.data?.serialized ? { serialized: tx.serialize().toString('hex') } : {}),
})
transactions.push(serializeRpcTransaction(tx, request.data.serialized))
}

const main = await context.chain.isHeadChain(header)
Expand Down
Loading

0 comments on commit 3c8f732

Please sign in to comment.