diff --git a/.editorconfig b/.editorconfig index 54b362a..cb19453 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,72 +1,20 @@ # editorconfig.org - -# top-most EditorConfig file root = true [*] charset = utf-8 end_of_line = lf -file_header_template = SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited\nSPDX-License-Identifier: MIT indent_size = 2 indent_style = space insert_final_newline = true trim_trailing_whitespace = true +file_header_template = SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited\nSPDX-License-Identifier: LGPL-3.0-only + [*.cs] indent_size = 4 -csharp_indent_labels = one_less_than_current -csharp_space_around_binary_operators = before_and_after -csharp_using_directive_placement = outside_namespace:silent -csharp_prefer_simple_using_statement = true:suggestion -csharp_prefer_braces = true:silent -csharp_style_namespace_declarations = file_scoped:warning -csharp_style_prefer_method_group_conversion = true:silent -csharp_style_prefer_top_level_statements = true:silent -csharp_style_expression_bodied_methods = false:silent -csharp_style_expression_bodied_constructors = false:silent -csharp_style_expression_bodied_operators = false:silent -csharp_style_expression_bodied_properties = true:silent -csharp_style_expression_bodied_indexers = true:silent -csharp_style_expression_bodied_accessors = true:silent -csharp_style_expression_bodied_lambdas = true:silent -csharp_style_expression_bodied_local_functions = false:silent -csharp_style_throw_expression = true:suggestion -csharp_style_prefer_null_check_over_type_check = true:suggestion -csharp_prefer_simple_default_expression = true:suggestion -csharp_style_prefer_local_over_anonymous_function = true:suggestion -csharp_style_prefer_index_operator = true:suggestion -csharp_style_prefer_range_operator = true:suggestion -csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion -csharp_style_prefer_tuple_swap = true:suggestion -csharp_style_prefer_utf8_string_literals = true:suggestion -csharp_style_inlined_variable_declaration = true:suggestion -csharp_style_deconstructed_variable_declaration = true:suggestion -csharp_style_unused_value_assignment_preference = discard_variable:suggestion -csharp_style_unused_value_expression_statement_preference = discard_variable:silent -csharp_prefer_static_local_function = true:suggestion -csharp_style_prefer_readonly_struct = true:suggestion -csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent -csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent -csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent -csharp_style_conditional_delegate_call = true:suggestion -csharp_style_prefer_switch_expression = true:suggestion -csharp_style_prefer_pattern_matching = true:silent -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -csharp_style_prefer_not_pattern = true:suggestion -csharp_style_prefer_extended_property_pattern = true:suggestion -csharp_style_var_for_built_in_types = false:silent -csharp_style_var_when_type_is_apparent = false:silent -csharp_style_var_elsewhere = false:silent - -dotnet_style_operator_placement_when_wrapping = beginning_of_line -dotnet_style_coalesce_expression = true:suggestion -dotnet_style_null_propagation = true:suggestion -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion -dotnet_style_prefer_auto_properties = true:silent -dotnet_style_object_initializer = true:suggestion -dotnet_style_collection_initializer = true:suggestion +#### Naming styles #### # Naming rules @@ -86,53 +34,58 @@ dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case dotnet_naming_symbols.interface.applicable_kinds = interface dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.interface.required_modifiers = +dotnet_naming_symbols.interface.required_modifiers = dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.types.required_modifiers = +dotnet_naming_symbols.types.required_modifiers = dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.non_field_members.required_modifiers = +dotnet_naming_symbols.non_field_members.required_modifiers = # Naming styles dotnet_naming_style.begins_with_i.required_prefix = I -dotnet_naming_style.begins_with_i.required_suffix = -dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = dotnet_naming_style.begins_with_i.capitalization = pascal_case -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = dotnet_naming_style.pascal_case.capitalization = pascal_case -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = dotnet_naming_style.pascal_case.capitalization = pascal_case +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_object_initializer = true:suggestion +dotnet_style_prefer_collection_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion dotnet_style_prefer_simplified_boolean_expressions = true:suggestion -dotnet_style_prefer_conditional_expression_over_return = true:silent -dotnet_style_prefer_conditional_expression_over_assignment = true:silent -dotnet_style_explicit_tuple_names = true:suggestion -dotnet_style_prefer_inferred_tuple_names = true:suggestion -dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion -dotnet_style_prefer_simplified_interpolation = true:suggestion -dotnet_style_prefer_compound_assignment = true:suggestion -dotnet_style_namespace_match_folder = true:suggestion -dotnet_style_readonly_field = true:suggestion -dotnet_style_predefined_type_for_locals_parameters_members = true:silent -dotnet_style_predefined_type_for_member_access = true:silent -dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent -dotnet_style_allow_multiple_blank_lines_experimental = true:silent -dotnet_style_allow_statement_immediately_after_block_experimental = true:silent -dotnet_code_quality_unused_parameters = all:suggestion -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent -dotnet_style_qualification_for_field = false:silent -dotnet_style_qualification_for_property = false:silent -dotnet_style_qualification_for_method = false:silent -dotnet_style_qualification_for_event = false:silent + +csharp_indent_labels = one_less_than_current +csharp_using_directive_placement = outside_namespace:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_prefer_braces = when_multiline:suggestion +csharp_style_namespace_declarations = file_scoped:suggestion +csharp_style_prefer_method_group_conversion = true:silent +csharp_style_prefer_top_level_statements = true:silent +csharp_style_prefer_primary_constructors = true:suggestion +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_var_for_built_in_types = true:silent +csharp_style_var_when_type_is_apparent = true:suggestion +csharp_style_var_elsewhere = false:suggestion diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f6a011d..742b2f6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,6 +3,7 @@ name: Test on: pull_request: push: + branches: [main] workflow_dispatch: inputs: publish: @@ -40,7 +41,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Check out eip1962 repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: nethermindeth/eip1962 ref: feature/bindings @@ -60,7 +61,7 @@ jobs: run: cargo build --release --target ${{ matrix.target }} --features eip_196_c_api,eip_2357_c_api - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.rid }} path: eth_pairings/target/${{ matrix.target }}/release/${{ matrix.library }} @@ -75,10 +76,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out eth-pairings-bindings repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: path: src/Nethermind.Crypto.Pairings/runtimes @@ -92,9 +93,7 @@ jobs: mv -f win-x64/eth_pairings.dll win-x64/native/eth_pairings.dll - name: Set up .NET - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 7 + uses: actions/setup-dotnet@v4 - name: Install dependencies working-directory: src @@ -102,7 +101,7 @@ jobs: - name: Build working-directory: src/Nethermind.Crypto.Pairings - run: dotnet build -c ${{ env.BUILD_CONFIG }} --no-restore -p:ContinuousIntegrationBuild=true + run: dotnet build -c ${{ env.BUILD_CONFIG }} --no-restore #- name: Test # working-directory: src/Nethermind.Crypto.Pairings.Test diff --git a/.gitignore b/.gitignore index 8a30d25..665f15b 100644 --- a/.gitignore +++ b/.gitignore @@ -378,10 +378,10 @@ FodyWeavers.xsd # VS Code files for those working on multiple tools .vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json +#!.vscode/settings.json +#!.vscode/tasks.json +#!.vscode/launch.json +#!.vscode/extensions.json *.code-workspace # Local History for Visual Studio Code @@ -396,3 +396,7 @@ FodyWeavers.xsd # JetBrains Rider *.sln.iml +.idea/ + +## macOS +.DS_Store diff --git a/global.json b/global.json new file mode 100644 index 0000000..c33ebd2 --- /dev/null +++ b/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "8.0.0", + "allowPrerelease": false, + "rollForward": "latestFeature" + } +} diff --git a/src/Nethermind.Crypto.Pairings/Nethermind.Crypto.Pairings.csproj b/src/Nethermind.Crypto.Pairings/Nethermind.Crypto.Pairings.csproj index f7f2887..c347e34 100644 --- a/src/Nethermind.Crypto.Pairings/Nethermind.Crypto.Pairings.csproj +++ b/src/Nethermind.Crypto.Pairings/Nethermind.Crypto.Pairings.csproj @@ -1,10 +1,11 @@ - net7.0 + net8.0 enable enable true + true @@ -21,7 +22,7 @@ git https://github.com/nethermindeth/eth-pairings-bindings snupkg - 1.0.1 + 1.1.0 @@ -48,7 +49,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Nethermind.Crypto.Pairings/Pairings.cs b/src/Nethermind.Crypto.Pairings/Pairings.cs index 0941a9b..211d45b 100644 --- a/src/Nethermind.Crypto.Pairings/Pairings.cs +++ b/src/Nethermind.Crypto.Pairings/Pairings.cs @@ -3,14 +3,16 @@ using System.Runtime.InteropServices; using System.Reflection; +using System.Runtime.Loader; namespace Nethermind.Crypto; public static class Pairings { private const string LibraryName = "eth_pairings"; + private static string? _libraryFallbackPath; - static Pairings() => NativeLibrary.SetDllImportResolver(Assembly.GetExecutingAssembly(), LoadLibrary); + static Pairings() => AssemblyLoadContext.Default.ResolvingUnmanagedDll += OnResolvingUnmanagedDll; [DllImport(LibraryName)] private static extern unsafe uint eip196_perform_operation( @@ -92,34 +94,35 @@ private static unsafe bool BlsOp(byte operation, ReadOnlySpan input, Span< public static bool BlsMapToG2(ReadOnlySpan input, Span output) => BlsOp(9, input, output); - private static nint LoadLibrary(string libraryName, Assembly assembly, DllImportSearchPath? searchPath) + private static nint OnResolvingUnmanagedDll(Assembly context, string name) { - string platform; - - if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - libraryName = $"lib{libraryName}.so"; - platform = "linux"; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + if (_libraryFallbackPath is null) { - libraryName = $"{libraryName}.dll"; - platform = "win"; + string platform; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + name = $"lib{name}.so"; + platform = "linux"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + name = $"lib{name}.dylib"; + platform = "osx"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + name = $"{name}.dll"; + platform = "win"; + } + else + throw new PlatformNotSupportedException(); + + var arch = RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant(); + + _libraryFallbackPath = Path.Combine("runtimes", $"{platform}-{arch}", "native", name); } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - libraryName = $"lib{libraryName}.dylib"; - platform = "osx"; - } - else - throw new PlatformNotSupportedException(); - - if (NativeLibrary.TryLoad(libraryName, assembly, searchPath, out var handle)) - return handle; - - var arch = RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant(); - return NativeLibrary.Load( - Path.Combine("runtimes", $"{platform}-{arch}", "native", libraryName), assembly, searchPath); + return NativeLibrary.Load(_libraryFallbackPath, context, default); } }