Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

doc: candid serialization and raw calls #4662

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

crusso
Copy link
Contributor

@crusso crusso commented Aug 16, 2024

todo: harmonize with candid_ui.md

Copy link

github-actions bot commented Aug 16, 2024

Comparing from ad93a46 to a1dad45:
The produced WebAssembly code seems to be completely unchanged.

@crusso crusso changed the title doc: candid serialization and raw calls (DRAFT) doc: candid serialization and raw calls Sep 20, 2024
@crusso crusso marked this pull request as ready for review September 20, 2024 08:52
# Candid

Candid is an interface description language and serialization format designed specifically for the Internet Computer platform.
It's a crucial component that enables seamless communication between different services and canister smart contracts on the IC, regardless of the programming languages they're implemented in.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
It's a crucial component that enables seamless communication between different services and canister smart contracts on the IC, regardless of the programming languages they're implemented in.
It's a crucial component that enables seamless communication between different services and canister smart contracts on ICP, regardless of the programming languages they're implemented in.


# Candid

Candid is an interface description language and serialization format designed specifically for the Internet Computer platform.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Candid is an interface description language and serialization format designed specifically for the Internet Computer platform.
Candid is an interface description language and serialization format designed specifically for the Internet Computer protocol.

Comment on lines +10 to +15
At its core, Candid provides a language-agnostic way to describe and transmit data.
It ensures strong typing, which means data is correctly interpreted across different services and languages.
This type safety is complemented by an efficient binary format for encoding data, making it ideal for network transmission.
In the context of Motoko, Candid is deeply integrated into the language.
Motoko automatically generates Candid interfaces for canister smart contracts, and provides built-in functions like `to_candid` and `from_candid` for easy serialization and
deserialization of data to and from Candid format.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
At its core, Candid provides a language-agnostic way to describe and transmit data.
It ensures strong typing, which means data is correctly interpreted across different services and languages.
This type safety is complemented by an efficient binary format for encoding data, making it ideal for network transmission.
In the context of Motoko, Candid is deeply integrated into the language.
Motoko automatically generates Candid interfaces for canister smart contracts, and provides built-in functions like `to_candid` and `from_candid` for easy serialization and
deserialization of data to and from Candid format.
At its core, Candid provides a language-agnostic way to describe and transmit data.
Strong typing guarantees accurate data interpretation across various services and languages.
This type safety is complemented by an efficient binary format for encoding data, making it ideal for network transmission.
In the context of Motoko, Candid is deeply integrated into the language.
Motoko automatically generates Candid interfaces for canister smart contracts and provides built-in functions like `to_candid` and `from_candid` for easy serialization and deserialization of data to and from Candid format.

Motoko automatically generates Candid interfaces for canister smart contracts, and provides built-in functions like `to_candid` and `from_candid` for easy serialization and
deserialization of data to and from Candid format.

On the broader Internet Computer platform, Candid serves as the standard communication protocol between canisters. When one canister calls another, the arguments are serialized to Candid, transmitted, and then deserialized by the receiving canister. This standardization enables developers to create frontends in languages like JavaScript that can easily interact with backend canisters written in Motoko or Rust.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
On the broader Internet Computer platform, Candid serves as the standard communication protocol between canisters. When one canister calls another, the arguments are serialized to Candid, transmitted, and then deserialized by the receiving canister. This standardization enables developers to create frontends in languages like JavaScript that can easily interact with backend canisters written in Motoko or Rust.
In a broader scope, Candid serves as the standard communication protocol between canisters. When one canister calls another, the arguments are serialized to Candid, transmitted, and then deserialized by the receiving canister. This standardization enables developers to create frontends in languages like JavaScript that can easily interact with backend canisters written in Motoko or Rust.


On the broader Internet Computer platform, Candid serves as the standard communication protocol between canisters. When one canister calls another, the arguments are serialized to Candid, transmitted, and then deserialized by the receiving canister. This standardization enables developers to create frontends in languages like JavaScript that can easily interact with backend canisters written in Motoko or Rust.

The IC SDK includes various tools for working with Candid, such as utilities for generating interface files and creating TypeScript bindings from Candid definitions.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The IC SDK includes various tools for working with Candid, such as utilities for generating interface files and creating TypeScript bindings from Candid definitions.

Comment on lines +58 to +71
The `to_candid` and `from_candid` operators are keywords, built into the language and handle most common use cases automatically.
The operators ensure type safety and proper data encoding without requiring developers to manually handle the intricacies of Candid serialization.

:::danger

Although `to_candid` will return a valid Candid encoding of its argument, there are actually many different Candid encodings, and thus blobs, for the same value.
There is no guarantee that `to_candid` will always return the same `blob`, given the same argument.
That means that you should never use these blobs to compare values for equality, or be tempted to
compute a hash for a value, by hashing its Candid encoding.
The hash of a value should be unique, but if you compute it from one of several Candid encodings, it may not be.

:::

See the language manual for more details on [`Candid serialization`](../reference/language-manual#candid_serialization).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The `to_candid` and `from_candid` operators are keywords, built into the language and handle most common use cases automatically.
The operators ensure type safety and proper data encoding without requiring developers to manually handle the intricacies of Candid serialization.
:::danger
Although `to_candid` will return a valid Candid encoding of its argument, there are actually many different Candid encodings, and thus blobs, for the same value.
There is no guarantee that `to_candid` will always return the same `blob`, given the same argument.
That means that you should never use these blobs to compare values for equality, or be tempted to
compute a hash for a value, by hashing its Candid encoding.
The hash of a value should be unique, but if you compute it from one of several Candid encodings, it may not be.
:::
See the language manual for more details on [`Candid serialization`](../reference/language-manual#candid_serialization).
The `to_candid` and `from_candid` operators are keywords built into the language and handle most common use cases automatically.
The operators ensure type safety and proper data encoding without requiring developers to manually handle the intricacies of Candid serialization.
:::danger
Although `to_candid` will return a valid Candid encoding of its argument, there are actually many different Candid encodings, and thus blobs, for the same value.
There is no guarantee that `to_candid` will always return the same `blob`, given the same argument.
That means that you should never use these blobs to compare values for equality or be tempted to
compute a hash for a value by hashing its Candid encoding.
The hash of a value should be unique, but if you compute it from one of several Candid encodings, it may not be.
:::
See the language manual for more details on [`Candid serialization`](../reference/language-manual#candid_serialization).


## Dynamic calls

Most users will should never need to use `to_candid` and `from_candid`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Most users will should never need to use `to_candid` and `from_candid`.
Most users should never need to use `to_candid` and `from_candid`.

Comment on lines +77 to +84
One scenario in which the operations are useful is when calling canister methods dynamically using the `call` function from
the `ExperimentalInternetComputer` base library.

Although most canisters on the Internet Computer speak Candid, this isn't mandated by the Internet Computer Protocol. At the protocol level,
canisters communicate in raw binary data. Candid is just a common interpretation of that data that allows canisters written in different languages to interoperate.

The `call` function take a canister principal, the name of a method as text, and a raw binary blob and returns a future containing the result of the call, also
as a raw binary blob.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
One scenario in which the operations are useful is when calling canister methods dynamically using the `call` function from
the `ExperimentalInternetComputer` base library.
Although most canisters on the Internet Computer speak Candid, this isn't mandated by the Internet Computer Protocol. At the protocol level,
canisters communicate in raw binary data. Candid is just a common interpretation of that data that allows canisters written in different languages to interoperate.
The `call` function take a canister principal, the name of a method as text, and a raw binary blob and returns a future containing the result of the call, also
as a raw binary blob.
One scenario in which the operations are useful is when calling canister methods dynamically using the `call` function from the `ExperimentalInternetComputer` base library.
Although most canisters on ICP speak Candid, this isn't mandated by ICP. At the protocol level, canisters communicate in raw binary data. Candid is just a common interpretation of that data that allows canisters written in different languages to interoperate.
The `call` function takes a canister principal, the name of a method as text, and a raw binary blob and returns a future containing the result of the call, also as a raw binary blob.

Comment on lines +86 to +95
Dynamic calls are particularly useful when working with canisters or services that have complex or non-standard interfaces, or when you
need fine-grained control over the calling process. However, they require manual handling of binary encoding and decoding, which is
more error-prone than using the high-level abstractions provided by Motoko.

When the service does speak Candid, and you know the types of the method you want to invoke, you can use `to_candid` and `from_candid` to
deal with the binary format.

Typically, you might use `to_candid` to prepare the argument of a call, and `from_candid` to process its result.

In this example, we use the imported `call` function to make a (silly) dynamic call on the actor:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Dynamic calls are particularly useful when working with canisters or services that have complex or non-standard interfaces, or when you
need fine-grained control over the calling process. However, they require manual handling of binary encoding and decoding, which is
more error-prone than using the high-level abstractions provided by Motoko.
When the service does speak Candid, and you know the types of the method you want to invoke, you can use `to_candid` and `from_candid` to
deal with the binary format.
Typically, you might use `to_candid` to prepare the argument of a call, and `from_candid` to process its result.
In this example, we use the imported `call` function to make a (silly) dynamic call on the actor:
Dynamic calls are particularly useful when working with canisters or services that have complex or non-standard interfaces, or when you need fine-grained control over the calling process. However, they require manual handling of binary encoding and decoding, which is more error-prone than using the high-level abstractions provided by Motoko.
When a service does speak Candid and you know the types of the method you want to invoke, you can use `to_candid` and `from_candid` to deal with the binary format.
Typically, you might use `to_candid` to prepare the argument of a call and `from_candid` to process its result.
In this example, we use the imported `call` function to make a dynamic call on the actor:

In most cases, the standard inter-canister call mechanisms and automatic Candid handling in Motoko provide a safer and more convenient approach to canister interactions.


## Links
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
## Links
## Resources

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants