1. Introduction
Blockchain is an emerging technology that has many interesting real-world application areas such as medical, energy, and financial. However, there are several restrictions on this recent technology. The most significant one is the storage issue in blockchain systems since each node has to store a copy of all blocks. As time continues, storage is a huge problem because the number of blocks continuously increases in blockchain systems. Secret sharing mechanisms have been used in blockchain systems to share the data block and the secret values among nodes. They assist to strengthen the decentralization and security of data in blockchain as it helps to distribute information in a decentralized way such that the private information is protected from unauthorized access. By secret sharing method, blockchain systems can store information so that every node stores a certain number of shares instead of the entire body of data. Taking into account these benefits, the secret sharing method has vital importance in blockchain systems.
Recently, the concept of distributed storage blockchain has been proposed to distribute the storage costs by the secret sharing method among all nodes in the blockchain network (see for instance [
1,
2,
3,
4,
5]). In these works, some types of secret sharing methods such as Shamir’s secret sharing in [
4,
5], multi-secret sharing in [
1], and local secret sharing in [
3] have been employed to distribute the block data among nodes in the blockchain network. In this framework, we incorporate the threshold verifiable multi-secret sharing scheme, AES encryption algorithm for privacy, and Reed–Solomon (RS) code for encoding into the standard distribute storage blockchain to distribute privately the block data among nodes in the blockchain network.
In medical systems, a lot of devices are connected to share remotely the patient data, to make a decision on the health status of the patient, or to make research on the medical data anonymously. This system is so-called the internet of medical things (IoMT). IoMTs need not only to decide on machine learning tools but also to exchange private data with each other. The data exchange can be done either with a central authority or in a decentralized manner. In the later one, blockchain is recently utilized to deploy a practical solution for solving the privacy and security issues, where data updates are stored as blockchain transactions in the system, see [
6,
7,
8,
9,
10,
11]. It seems that it is vital to find new methods to enhance the privacy of the data stored in the blockchain ledger and to reduce the amount of data stored by each IoMT device.
The main contributions of the paper are listed as follows. First, motivated by the previous secret sharing methods introduced in [
12,
13], we enhance a threshold-based verifiable multi-secret sharing (VMSS) scheme without private channels, which is one of the well-known secret sharing schemes in cryptography. Second, inspired by the previous works [
1,
2,
3,
4], we apply the proposed threshold-based VMSS scheme to the distributed storage blockchain (DSB) system to distribute block data among all nodes in a blockchain network. We finally analyze the storage and recovery communication costs and the robustness of the DSB system based on the VMSS scheme. The proposed method reduces the recovery communication cost and improves robustness in the previous DSB systems. It also improves significantly the storage cost of traditional blockchain systems. In addition to the desirable properties of the previous schemes used in the DSB systems, the proposed scheme has the (quantum secure) verification algorithm and secret communication without private channels. We also note that the flexible threshold parameter of the proposed scheme eliminates a drawback of the previous DSB systems on their recovery communication costs and robustness.
The remainder of the paper is structured as follows. In
Section 2, we introduce brief history of secret sharing schemes. In
Section 3, we give the previous studies and background for distributed storage blockchain systems. In
Section 4, we propose a secure threshold-based VMSS scheme that shares securely both a secret key and hash value among nodes in the blockchain system. In
Section 5, we incorporate the proposed VMSS scheme into the DSB system. We also explain the distributing and recovering processes of the data block in the proposed DSB system. We finally analyze the storage and recovery communication costs as well as the robustness of the proposed method. We notice that our recovery communication cost and robustness are much better than the previous ones. We conclude the paper in
Section 6.
2. Related Works
In this section, we mention the previous studies on the types of secret sharing schemes. A secret sharing scheme is one of the most significant cryptographic protocols for sharing data securely. The first secret sharing scheme was introduced in 1979 by Blakley [
14] and Shamir [
15], independently, which are the threshold-based schemes. Shamir’s secret sharing scheme is based on polynomial interpolation over finite fields while Blakley’s scheme is based on finite geometry.
A secret sharing scheme consists of a dealer D, a group of n participants, a secret space S, n share spaces , a share computing procedure, and a secret recovering procedure. The dealer D chooses a secret s from S, and computes a share of s (with the sharing computing procedure) for each participant and then gives the share to for . The sharing computing procedure and the secret s are known only by D, while the secret recovering procedure is known by all participants in . A set of participants who can recover s from their shares is said to be an access set. Indeed, an access set is said to be a minimal access set if any of its proper subsets cannot recover s from their shares. The set of all access sets is said to be an access structure of a scheme.
The usual sharing scheme can only resist passive attacks but not active ones; that is, it is not secure against the dishonest dealer and the malicious participants. Thus, the dealer and the participants are generally assumed to be honest, however, this assumption is not realistic in real-life applications. To eliminate this assumption, the first verifiable secret sharing (VSS) scheme has been introduced in 1985 by Chor et al. [
16] by adding the verification algorithm to Shamir’s scheme, and later several VSS schemes have been proposed in the literature (see [
12,
17,
18,
19,
20]). In a VSS scheme, not only a dishonest dealer but also a malicious participant can be easily detected utilizing the verification process. It can be then said that a VSS scheme resists against two kinds of active attacks:
In 1995, He and Dawson [
21] introduced the first multi-secret sharing (MSS) scheme based on Shamir’s scheme that shares multiple secret values simultaneously. In an MSS scheme, only one share is assigned to each participant (indeed, each participant needs to protect only one share) while multiple secrets can be shared. Note that the size of the assigned share is almost the same as that of each secret value.
Harn (1995) [
22] introduced the first threshold-based verifiable multi-secret sharing (VMSS) scheme that not only shares multiple secrets simultaneously but also detects the dishonest dealer and participants. Moreover, several threshold-based VMSS schemes have been widely studied in the literature (see [
12,
13,
17,
20]). It can be said that the VMSS schemes are secure against both passive and active attacks.
In the usual secret sharing scheme, it is generally assumed that the shares are distributed and collected by the dealer through secure channels. However, the establishment of secure channels between the dealer and the participants has high requirements in the protocol. Thus, for the secure communication between them in a public channel, several techniques were proposed in the literature, one of which is public-key cryptography. For example, Hwang and Chang [
23] and Liu et al. [
12] made use of the RSA public-key encryption algorithm [
24] in their VMSS schemes for secure communication while Zhao et al. [
20] used the Diffie–Helman key exchange protocol [
25] in their practical VMSS scheme.
3. Preliminaries
In this section, the fundamental concepts of data storage in the blockchain systems are briefly given. We start with the traditional blockchain system, and then we discuss the distributed storage blockchain system.
In the traditional blockchain system, every data block and the hash value pointing to the previous block is stored by each node. It is formalized as follows. Let and be two hash functions. Let c be a constant and . Let be the data block to be stored in the t-th block and , where for . Every node in traditional blockchain system stores all pairs and for . For example, when a block is created for some by a node N, N needs to share the pair and with other nodes in the blockchain network. Then, all nodes will have a copy of the block in their storage. This brings a lot of storage costs for each node. Similarly, if a block is lost in a node, then it can be recovered by accessing any node in the blockchain network and copying the data block and the hash value, which is known as recovery communication cost. Hence, the traditional blockchain system has storage and recovery communication costs proportional to the size of for each node N at each block t. The maximum number of node failure which can be tolerated by the blockchain network is called its robustness. It is easy to observe that the traditional blockchain network with n nodes has the robustness .
The concept of distributed storage blockchain has been recently studied to reduce the storage cost of traditional blockchain systems. First, Dai et al. [
2] have adopted network coding to the notion of distributed storage to reduce the storage space for distributed ledger in blockchain systems, and they achieved significant improvement. Second, Raman and Varshney [
4,
5] have recently proposed the idea of a distributed storage blockchain, which significantly decreases the storage of transactions by using Shamir’s sharing scheme. In DSB, all nodes (say,
n nodes exist) are divided into
L distinct subsets of equal size
m, that is, let
be the partition of the set of
n nodes, and
. Each subset
has the secret key
to encrypt a block
as
for
. Then,
is divided into
m pieces and distributed to each node in
. Besides, the secret key
(the local secret) and the hash value
(the global secret) are shared to each node in
by two independent Shamir’s
sharing schemes. Their data distribution method is formalized in Algorithm 1.
Algorithm 1 DSB in [4,5] |
- Input.
Given a partition - 1:
for to do - 2:
Generate the secret key . - 3:
Encrypt with as . - 4:
Distribute and store among m peers in . - 5:
Store and by Shamir’s sharing. - 6:
end for
|
As seen in Algorithm 1, in DSB, each node has storage cost and recovery communication cost at each block t since the secret key and the hash value may be recovered by accessing m nodes in another subset. If the size of the hash value is extremely small compared to the size of the data block, which is usually the case in real-life applications, then the storage cost of traditional blockchain is excessively reduced by the DSB system. On the other hand, a single node failure in a subset causes the loss of the key in and so, data in can not be reachable anymore. This says that a blockchain network based on DSB with n nodes has robustness . We finally note that a single node failure in every subset in DSB causes the loss of the blockchain data inevitably.
Recently, Kim et al. [
3] have proposed a local secret sharing (LSS) scheme to improve the DSB storage by using locally recoverable codes (LRC) [
26] and trivial maximum distance separable (MDS) codes [
27] (Chapter 11). In particular, they first obtain the LSS scheme from LRC, and then LSS is used suitably in DSB. In DSB with LSS, the hash value
and the secret key
are simultaneously shared by LSS through all nodes in the blockchain network. Since a single error in an
-LRC of length
n and dimension
k can be recovered by
correct symbols [
26], then a single node failure in DSB with LSS can be tolerated by the blockchain network due to the proposed
-threshold LSS scheme. Right after, the encrypted data block is encoded by a trivial
-MDS code, which is a code with a single parity symbol. Hence, a blockchain network based on DSB with LSS has robustness
, and each node has
storage cost and
recovery communication cost at each block
t.
Very recently, to improve the DSB system, Chen et al. [
1] have proposed a low-storage scheme with a multi-secret sharing (MSS) scheme based on polynomial interpolation. The DSB with MSS divides the transaction block into multiple pieces and then stores them in different nodes, but it does not encrypt the transaction block. It stores only data block but not secret key and hash value. In this system, the block
is to be shared between
n parties. They first divide the block
into
m equal length pieces denoted by
such that their concatenation
and
The proposed MSS is based on recursion, and to encode the piece
for
, it generates a sharing polynomial
of degree
i over a finite field
, where
q is a large odd prime greater than pieces
and
n. Then, it distributes the shares
to the corresponding nodes, where
are the public indexes of nodes. This scheme is an
-threshold secret sharing since any
nodes or more can reconstruct the block
, but no group of
m or fewer nodes can do so. The reconstruction of this scheme is an inverse process. Any
of nodes can first reconstruct a polynomial
of degree
m with the constant term
, and then reconstruct recursively a polynomial
of degree
i with the constant term
for
. Thereafter, the block
is obtained by concatenating
. Hence, in DSB with MSS scheme [
1], each node has
storage cost and
recovery cost, and its robustness is
.
4. A Threshold-Based Verifiable Multi-Secret Sharing (VMSS) Scheme
In this section, we propose a secure threshold-based verifiable multi-secret sharing scheme based on Feldman’s VSS scheme introduced in [
19] (originally, based on Shamir’s threshold scheme introduced in [
15]).
4.1. Description of the Proposed Threshold-Based VMSS Scheme
Let n be a positive integer. Let D be the dealer and be a set of n participants. Let the threshold be denoted by t with . Let be a finite field for a prime , and . Let be a function on . These parameters are generated cooperatively by D and all participants. We now describe a secure -threshold verifiable multi-secret sharing scheme without private channels.
Construction phase. Let two distinct secrets and in be given to be shared. The dealer D performs the following steps.
- –
D chooses random elements for , and constitutes the -degree polynomial as
- –
D commits all coefficients of by masking them with a function , namely computes , for . This commitment guarantees that no one can do cheating in the scheme.
- –
D broadcasts the public commitments: for verification.
- –
D selects randomly distinct elements and computes the shares for a participant for .
- –
D constitutes the polynomial
of degree
n by using
points
by the Lagrange interpolation method.
- –
D encrypts with a public key encryption as by using the public key of for .
- –
D sends the pair to the participant in the public channel for .
- –
D selects randomly distinct elements , and evaluates for .
- –
D broadcasts the public points for .
Verification phase. Each participant can perform the following verification operation to verify her own share.
- –
privately decrypts with the public key decryption algorithm as by using her own private key for .
- –
checks the validity of her share
and its consistency with the public information, namely,
verifies whether
If the verification in (
2) holds for every
, then each
is valid, and hence
D is assumed to be honest.
Recovery phase. Suppose that any t authorized participants , where , can recover the shared secrets and .
- –
Each encrypts her share with a public key encryption as by using the public key of D, and sends the pair to D in the public channels for .
- –
D decrypts as by using her own private key for every .
- –
D verifies the validity of each
by using the verification equation in (
2) for every
. If each share
is valid, then the points
are accepted from
t authorized participants.
- –
The authorized participants
can cooperatively reconstruct the secret
by using their private points
for
from the following formula
Similarly, by using their private points
for
and
public points
for
, they can cooperatively recover the secret
from the the following formula
The proposed VMSS scheme has the following desirable properties to be applied in many practical systems such as decentralized mechanisms.
The proposed scheme can simultaneously share two secrets while storing only one share by each participant.
Due to the verification algorithm (
2) of the proposed scheme, both the dishonest dealer and malicious participants can be easily detected. To be more precise, the dealer’s cheating can be detected by a participant, and the dealer can detect any malicious participant.
The dealer can securely communicate with participants through public channels since the shares are encrypted with the public key encryption algorithm. Indeed, the proposed scheme realizes secret sharing without a private channel, which is a very significant property in many practical applications where a private channel is very hard to be established.
The participants can reuse repeatedly their shares in another reconstruction round because the employed function is fixed and the shares are encrypted by the public key algorithm.
Remark 1. Secret values and may have different threshold parameters, but we prefer to use the same threshold t for both and in the proposed scheme.
We note that the proposed VMSS scheme has some assumptions on the securities of function , encryption , and decryption . In the literature, is generally proposed to be the modular exponentiation function, so the security of the verification process depends on the hardness of the discrete logarithm problem (DLP). Similarly, for the encryption and decryption , the RSA public key algorithm is generally proposed in the literature, and its security depends on the hardness of the integer factorization problem (IFP). In the proposed VMSS scheme, the modular exponentiation function and RSA public key algorithm may be preferred, respectively, for , , and . In this case, the security of the proposed scheme is based on two intractable problems DLP and IFP, which are assumed to be hard problems at present. On the other hand, these intractable problems are not quantum secure, and they can be broken by Shor’s algorithm on a quantum computer. Therefore, we also suggest using quantum secure algorithms in the proposed scheme, which is rather important for its usability in the post-quantum world.
4.2. Post-Quantum Secure Methods
Lattice-based cryptosystems are known to be quantum secure as there has no feasible (traditional and quantum) attacks against them. Besides, lattices are so easy to implement in software and hardware environments. Therefore, several secret sharing schemes based on lattices were proposed in [
17,
28,
29,
30,
31]. For instance, the knapsack function
,
is proposed for the verification function in [
31], where
for some irreducible polynomial
of degree
N, prime
p, and random
. It is known that finding the inverse of
for any
is as hard as solving the approximate shortest polynomial problem [
32].
In this case,
is a polynomial over
such that
for
, and
. Here, for simplicity, we denote
. Then the verification phase (
2) is performed by the participants and the dealer from the public commitments
for
as follows
for
. Similarly, one can use lattice-based NTRU public key cryptosystem [
33] for functions
and
. Thus, the proposed VMSS becomes a lattice-based post-quantum scheme.
4.3. Security Analysis of the Proposed VMSS Scheme
In this subsection, we analyze the correctness and the security of the proposed scheme in terms of verifiability and privacy.
Theorem 1. The proposed -threshold VMSS scheme satisfies the following three security requirements.
- 1.
Correctness: Any t or more honest participants can correctly recover the secrets and if D is honest.
- 2.
Verifiability: D cannot distribute a fake share to any participant, and any participant cannot submit a false share to the recovery algorithm.
- 3.
Privacy: Any group of less than t participants cannot reach the shared secrets and .
Theorem 2. In the proposed -threshold VMSS scheme, the verification is succeeded if D and participants follow correctly the protocol.
Proof. Suppose that
is the modular exponentiation function. For simplicity, we assume
in
. If
D follows accurately the protocol, then we get the following
for every
. If the participants follow accurately the protocol, then we get similarly the following holds
for every
. Suppose that
in (
5) is used in the verification algorithm. Then, the participants can verify their shares as given in [
31] by checking
where
is the public commitment of the secret value
for
. The proof is then completed. □
As a result of Theorems 1 and 2, we conclude that the proposed VMSS is a (post-quantum) secure scheme against attackers and malicious users (that is, it resists both active and passive attacks).
5. DSB Based on the Proposed VMSS Scheme
In this section, we first incorporate the proposed threshold-based VMSS scheme into the original DSB system to distribute privately transaction data. We then describe the distribution and recovery processes of data at each block.
In the DSB system, each data block is stored in certain subsets of the set of all nodes by distributing it among nodes in each subset. Assume that the set of n nodes in a blockchain network is divided into distinct subsets in and each subset has m participants. Assume that each subset has the proposed -threshold VMSS scheme to share simultaneously the global secret and local secret for . In the -threshold VMSS scheme of the subset , is a set of m participants, is the dealer and is its own independent threshold for . We now incorporate the proposed VMSS scheme into the framework of the DSB system in Algorithm 2.
Remark 2. In Algorithm 2, we assume for all . Depending upon the applications of the blockchain systems, we may assume for some . In this case, to recover the global secret , we need at least more participants, who may be selected among the rest of the participants of the corresponding set or from the other subsets. For example, it may be assumed that each subset should collaborate to reconstruct the global secret .
5.1. Storing Data Block
We here describe how to distribute and store transaction data at each block. To distribute transaction data at each block, we first encrypt it by AES-256 for its confidentiality, then share privately the hash value of the block by the proposed scheme for its integrity, and finally encode by Reed–Solomon code.
Each subset
for
follows the following processes to distribute and store data at each block. Each subset
has the same data block
and the same hash value
of the
t-th block. Assume that
and
, where
p is a prime whose size about 256 bit-length and
q is an extremely large prime. Each
first generates the secret key
and then encrypts the data block
with the AES-256 symmetric key encryption algorithm using
as
. Here, the secret key
(the local secret) and the hash value
(the global secret) are simultaneously shared among
m nodes in
by the proposed
-threshold VMSS scheme, introduced in Algorithm 2. Thereafter, the encrypted data
is encoded into
by Reed–Solomon code
before distributing it among
m nodes in
. We note that RS-code is an example of non-trivial MDS codes [
27] (Chapter 11) and this coding process decreases the recovery communication cost and enhances the robustness. Finally, the encoded data
are distributed to each node in
so that any
authorized nodes in
can reconstruct it in the recovery phase. The DSB with the proposed VMSS scheme is summarized in Algorithm 3.
Algorithm 2 The proposed -threshold VMSS scheme for DSB |
- Input.
Given a partition and threshold parameters with - 1:
Set a global secret , commit and publish . - 2:
Generate random elements , commit and publish for . - 3:
Construct a global -degree polynomial . - 4:
for to do - 5:
Construction in : performs the following steps. - 6:
for to m do - 7:
Select distinct elements and evaluate the share . - 8:
Encrypt as by using the public key of . - 9:
Send the pair to in the public channel. - 10:
end for - 11:
Set a local secret . - 12:
Construct a local m-degree polynomial defined as in ( 1) for the secret . - 13:
for to do - 14:
Select distinct elements , and evaluate . - 15:
Broadcast the point . - 16:
end for - 17:
Verification in : performs the following steps. - 18:
for to m do - 19:
Decrypt as by using own private key . - 20:
Verify . - 21:
end for - 22:
Recovery in with -threshold VMSS scheme - 23:
for to do - 24:
encrypts as by using the public key of . - 25:
sends the pair to in the public channel. - 26:
decrypts as by using own private key . - 27:
verifies the validity of each as in Step 20. - 28:
if is valid then accept the points - 29:
else reject - 30:
end if - 31:
end for - 32:
By using the verified private points for , the global secret can be cooperatively recovered from the formula in ( 3). Here, at least points can do it since . - 33:
By using the verified private points for and the public points for , the local secret can be cooperatively recovered from the formula in ( 4). - 34:
return and . - 35:
end for
|
Algorithm 3 DSB based on the proposed -threshold VMSS |
- Input.
Given a partition - 1:
Set the hash value as the global secret. - 2:
for to do - 3:
Generate the secret key for the AES-256. - 4:
Encrypt with the AES-256 algorithm as . - 5:
Share and store and among m nodes in by -threshold VMSS given in Algorithm 2. - 6:
Encode into by . - 7:
Distribute and store among m nodes in . - 8:
end for
|
5.2. Recovering Data Block
The recovering method is an inverse process that is performed in a backward and first-out manner. We below describe how to recover the shared data block at each block. For each subset
, where
, the following steps are performed to recover the shared data at each block. Each
first reconstructs the encoded data
from the authorized
nodes, then
is decoded by Reed–Solomon code
, and hence
gets the encrypted data
. Thereafter, the authorized
nodes from
can reach the hash value
and its secret key
from the equation in (
4). Next,
decrypts the encrypted data
as
with the AES-256 encryption algorithm using its secret key
, and hence gets the data block
of the
t-th block. Finally,
checks its integrity with the corresponding hash value
. Algorithm 4 formalizes how to recover the shared data block
of the
t-th block.
Algorithm 4 Recovery algorithm for in the DSB based on VMSS |
- Input.
Given a partition - 1:
for to do - 2:
Concatenate from the authorized nodes in . - 3:
Decode from by . - 4:
Reconstruct both and by the proposed -threshold VMSS given in Algorithm 2. - 5:
Decrypt with the AES-256 algorithm as . - 6:
Check the integrity of with the hash value . - 7:
end for
|
5.3. Costs Analysis and Robustness for DSB Based on VMSS
In this subsection, we present the storage and recovery communication costs, and also the robustness of the proposed DSB system. We note that they depend on the threshold parameter of each subset for .
We assume that the data block of the t-th block is stored in , and the secret key and the hash value are stored in . In real-world applications, q is an extremely large prime when comparing a prime p of size about 256 bit-length.
Storage cost. We compute the storage cost for each node at the
t-th block. Algorithm 3 distributes and stores the data block
, hash value
and secret key
in each subset
. In Step 5, storing both
and
by the proposed
-threshold VMSS scheme has
storage cost for each node. In Step 7, the cost of storing
encoding by
to
among
m nodes is equal to
for each node. Hence, the storage cost
of the proposed DSB based on VMSS for each node in
is equal to
bit operations.
Recovery communication cost. We first recall that a single node failure can be easily tolerated by receiving the stored data from any node in the traditional blockchain. Moreover, a single node failure in each subset can be recovered by accessing all nodes and
nodes in the same subset for the original DSB and the DSB based on LSS, respectively. In the proposed DSB based on
-threshold VMSS scheme, a single node failure in the subset
can be recovered by accessing only
nodes in
. Thus, the recovery communication cost
of the proposed DSB based on VMSS is equal to
bit operations. Since
, the recovery communication cost of the proposed system is much better than that of both the original DSB in [
4] and the DSB based on LSS in [
3].
Robustness to node failures. We deal with the robustness of the proposed DSB system. The robustness is defined as the maximum number of node failures which can be tolerated by the blockchain network. A single node failure in each subset leads to an effective failure of all
m nodes in the original DSB while each subset can tolerate a single node failure in the DSB based on LSS. The proposed DSB based on VMSS can tolerate node failures up to
due to the employed
-threshold VMSS scheme in
. This says that the proposed DSB recovers data block up to
node failures if
nodes from one subset and
nodes from the others are failed, which implies that the robustness of the proposed DSB system is much better than that of both the original DSB in [
4] and the DSB based on LSS in [
3].
Remark 3. In the proposed DSB system, if nodes from each subset are failed (indeed, there are totally node failures), then data block cannot be recovered.
We summarize in
Table 1 the comparison of the previous DSB systems and the proposed DSB system in terms of storage and recovery communication costs, as well as robustness.
Remark 4. On the internet of medical things (IoMT), it is proposed that blockchain may be used for the immutable storage of data in a decentralized way, see for instance [10,11]. This causes tremendous storage costs in the blockchain nodes. By using the proposed -threshold VMSS scheme (Algorithm 3) for this case, one can reduce the storage cost by a factor . In addition, the privacy of data does not depend on solely one node, but at least nodes, that is, the data are leaked if at least nodes are fraudulent. Furthermore, any malicious node sharing fake data in the threshold-based VMSS system can be identified by using either (2) or (6). As the medical records have a high level of privacy for their owner, it seems that the proposed methods in this paper would be a good candidate for practical applications.