Add Digest interface

This commit is contained in:
lash 2023-03-26 12:04:31 +01:00
parent 1e11d8df08
commit b3f6e45696
Signed by: lash
GPG Key ID: 21D2E7BB88C2A746
16 changed files with 171 additions and 30 deletions

View File

@ -0,0 +1,15 @@
@subsection Chrono
Define a creation time for a resource.
Complements @code{ERC5007}.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Chrono.interface
@item Solidity interface definition
@include ../../build/contract_Chrono.texi
@item Example implementation
@uref{https://git.defalsify.org/eth-erc721} (BadgeToken contract)
@end table

View File

@ -0,0 +1,17 @@
@subsection Digest
Allows encoding of digests according to a specific encoding scheme.
Primary use-case is the abstraction of self-describing @uref{https://multiformats.io/multihash/,Multhash} encoding.
A default encoding @emph{must} always be defined, and the encoding of a valid digest @emph{must} succeed with the default encoding.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Digest.interface
@item Solidity interface definition
@include ../../build/contract_Digest.texi
@item Example implementation
@uref{git://holbrook.no/eth-event-msg.git}
@end table

View File

@ -10,4 +10,6 @@ A contract defining an expiry @emph{must not} allow changing the expiration time
@include ../../build/Expire.interface @include ../../build/Expire.interface
@item Solidity interface definition @item Solidity interface definition
@include ../../build/contract_Expire.texi @include ../../build/contract_Expire.texi
@item Example implementation
@uref{https://git.grassecon.net/cicnet/erc20-demurrage-token.git}
@end table @end table

View File

@ -13,6 +13,8 @@ Furthermore, it @emph{should} be possible to refer to a resource by a fully-qua
@include ../../build/Locator.interface @include ../../build/Locator.interface
@item Solidity interface definition @item Solidity interface definition
@include ../../build/contract_Locator.texi @include ../../build/contract_Locator.texi
@item Example implementation
@uref{git://holbrook.no/eth-event-msg.git}
@end table @end table

View File

@ -12,4 +12,6 @@ The interface complements @code{Locator} and @code{MultiHash} to generate locat
@include ../../build/Msg.interface @include ../../build/Msg.interface
@item Solidity interface definition @item Solidity interface definition
@include ../../build/contract_Msg.texi @include ../../build/contract_Msg.texi
@item Example implementation
@uref{git://holbrook.no/eth-event-msg.git}
@end table @end table

View File

@ -1,25 +0,0 @@
@subsection Multihash
A complement to @code{Locator}, enabling validation and generation of multihashes for multicodecs that have been registered to the contract.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/MultiHash.interface
@item Solidity interface definition
@include ../../build/contract_MultiHash.texi
@end table
@subsubsection Using @code{Multihash} with @code{Locator}
Given the data @code{foo}, the digest algorithm @code{sha256} (multihash prefix @code{1220}) and a base url @code{https://contentgateway.grassecon.net}, the result of the methods may be as follows:
@table @code
@item toURI(sha256(foo))
-> @code{"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}
@item toURL(sha256(foo))
-> @code{"https://contentgateway.grassecon.net/12202c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}
@item tokenURI(toUint(sha256(foo)))
-> @code{"https://contentgateway.grassecon.net/12202c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}
@end table

View File

@ -50,6 +50,8 @@ The following well-known solidity interfaces are partially implemented in CIC na
@include declarator.sol.texi @include declarator.sol.texi
@include digest.sol.texi
@include expire.sol.texi @include expire.sol.texi
@include faucet.sol.texi @include faucet.sol.texi
@ -60,8 +62,6 @@ The following well-known solidity interfaces are partially implemented in CIC na
@include msg.sol.texi @include msg.sol.texi
@include multihash.sol.texi
@include registry.sol.texi @include registry.sol.texi
@include seal.sol.texi @include seal.sol.texi

31
doc/texinfo/seal.sol.texi Normal file
View File

@ -0,0 +1,31 @@
@subsection Seal
Some smart contract parameters may need to be mutable over part of a smart contract's lifetime.
This interface provides a method to explicitly signal when certain parameters have been rendered immutable.
The value of @code{sealState()} @emph{must not} decrease, and must not exceed @code{maxSealState}.
@code{maxSealState} is used to define that @emph{all mutable parameters} have been rendered immutable. The practical implications of this will vary between contracts.
The implementer is encouraged to use simple, descriptive names in the source code to describe the applicable seal states.
Use cases of sealing include:
@itemize
@item
Whether more tokens can be minted
@item
Allow ownership of a contract to be transferred
@item
The expiry time of a token (see @code{Expire})
@end itemize
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Seal.interface
@item Solidity interface definition
@include ../../build/contract_Seal.texi
@item Example implementation
@uref{https://git.grassecon.net/cicnet/erc20-demurrage-token.git}
@end table

View File

@ -24,4 +24,6 @@ Edit access control lists.
@include ../../build/Writer.interface @include ../../build/Writer.interface
@item Solidity interface definition @item Solidity interface definition
@include ../../build/contract_Writer.texi @include ../../build/contract_Writer.texi
@item Example implementation
@uref{https://git.grassecon.net/cicnet/erc20-demurrage-token.git}
@end table @end table

View File

@ -0,0 +1,27 @@
pragma solidity >=0.6.12;
// Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
// SPDX-License-Identifier: AGPL-3.0-or-later
// File-version: 1
// Extends the AccountsIndex contract to enable account removal and deactivation.
interface IAccountsIndexMutable {
// Active status of address changed, and by whom changed.
event AddressActive(address indexed _account, bool _active);
// Address removed from store, and by whom removed.
event AddressRemoved(address _account);
// Remove an entry from the index. Reduces the entry count.
function remove(address) external returns (bool);
// Deactivate account but keep in index. Does not affect entry count.
function deactivate(address) external returns (bool);
// Activate previously deactivated account. Does not affect entry count.
function activate(address) external returns (bool);
// Check if account exists and is active;
function isActive(address) external view returns (bool);
}

11
solidity/Chrono.sol Normal file
View File

@ -0,0 +1,11 @@
pragma solidity >=0.6.12;
// Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
// SPDX-License-Identifier: AGPL-3.0-or-later
// File-version: 1
interface IChrono {
// Returns the timestamp of when a resource corresponding to _idx was first created.
// int64 chosen as return value for simpler interoperability with ERC5007.
function createTime(uint256 _idx) external returns(int64);
}

23
solidity/Digest.sol Normal file
View File

@ -0,0 +1,23 @@
pragma solidity >=0.6.12;
// Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
// SPDX-License-Identifier: AGPL-3.0-or-later
// File-version: 1
interface IDigest {
// Returns the default digest encoding used by the contract instance.
function defaultDigestEncoding() external view returns (uint256 _encoding);
// Check if the given encoding has been implemented in the contract instance.
function haveDigestEncoding(uint256 _codec) external view returns(bool);
// Verify and encode the given digest for a specific hashing algorithm.
// Returns a zero-length byte array if digest is invalid.
// Must succeed if called with the defaultDigestEncoding and a valid digest.
function encodeDigest(bytes memory _data, uint256 _encoding) external view returns (bytes memory);
// Encodes the digest using the default digest encoding.
// Returns a zero-length byte array if digest is invalid.
// Must succeed with a valid digest.
function encodeDigest(bytes memory _data) external view returns (bytes memory);
}

15
solidity/ERC5007.sol Normal file
View File

@ -0,0 +1,15 @@
pragma solidity >=0.6.12;
// Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
// SPDX-License-Identifier: AGPL-3.0-or-later
// File-version: 4
// This is a representation of an officially approved Ethereum Improvement Proposal, written by Anders (@0xanders), Lance (@LanceSnow), Shrug <shrug@emojidao.org>.
// It was released under the CC0 license.
// The proposal source used as reference was a Markdown file with the following digest:
// - sha256:ec5a3d25822e616e032ef27faeb9a7191147a7b18064d95807df20fbc6b69870
interface IERC5007 {
function startTime(uint256 tokenId) external view returns (int64);
function endTime(uint256 tokenId) external view returns (int64);
}

17
solidity/ERC5192.sol Normal file
View File

@ -0,0 +1,17 @@
pragma solidity >=0.6.12;
// Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
// SPDX-License-Identifier: AGPL-3.0-or-later
// File-version: 4
// This is a representation of an officially approved Ethereum Improvement Proposal, written by Tim Daubenschütz (@TimDaub), Anders (@0xanders).
// It was released under the CC0 license.
// The proposal source used as reference was a Markdown file with the following digest:
// - sha256:c746922587ede699bd1560be0c0db5599104a25c976077d20706ec05340b3b7a
interface IERC5192 {
event Locked(uint256 tokenId);
event Unlocked(uint256 tokenId);
function locked(uint256 tokenId) external view returns (bool);
}

View File

@ -2,7 +2,7 @@ pragma solidity >=0.6.12;
// Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 // Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-License-Identifier: AGPL-3.0-or-later
// File-version: 3 // File-version: 4
interface ILocator { interface ILocator {
// URI that may or may not point to a specific resource location. // URI that may or may not point to a specific resource location.

View File

@ -15,8 +15,10 @@ interface IMultiHash {
} }
// All registered multicodecs // All registered multicodecs
function multiCodec(uint256 _codec) external view returns(MultiHash memory); function digestCodec(uint256 _codec) external view returns(MultiHash memory);
function haveDigestEncoding(uint256 _codec) external view returns(bool);
// Generate a multihash from the given digest and current selected multicodec // Generate a multihash from the given digest and current selected multicodec
function toMultiHash(uint256 _codec, bytes memory _digest) external view returns(bytes memory); function encodeDigest(uint256 _codec, bytes memory _digest) external view returns(bytes memory);
} }