Skip to content

Commit 194c508

Browse files
committed
add: hash_script_data
1 parent ee26c62 commit 194c508

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

src/hash/index.ts

+36
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@ import { blake2b } from "@noble/hashes/blake2b";
22
import {
33
AuxiliaryData,
44
AuxiliaryDataHash,
5+
Costmdls,
56
DataHash,
67
PlutusData,
8+
PlutusList,
79
PrivateKey,
10+
Redeemers,
11+
ScriptDataHash,
812
TransactionBody,
913
TransactionHash,
1014
Vkey,
@@ -37,3 +41,35 @@ export function hash_transaction(
3741
const bytes = tx_body.to_bytes();
3842
return TransactionHash.new(blake2b(bytes, { dkLen: 32 }));
3943
}
44+
45+
export function hash_script_data(
46+
redeemers: Redeemers,
47+
cost_models: Costmdls,
48+
datums: PlutusList | undefined
49+
): ScriptDataHash {
50+
const arr: number[] = [];
51+
52+
// If there are no redeemers and some datums, use the [ A0 | datums | A0 ] format
53+
if (redeemers.len() === 0 && datums !== undefined) {
54+
55+
// A0 = CBOR empty map
56+
arr.push(0xA0);
57+
// push datums.to_set_bytes()
58+
arr.push(...datums.as_set().to_bytes());
59+
60+
// A0 = another CBOR empty map
61+
arr.push(0xA0);
62+
} else {
63+
// Otherwise: [ redeemers | datums | language views ]
64+
arr.push(...redeemers.to_bytes());
65+
66+
if (datums !== undefined) {
67+
arr.push(...datums.as_set().to_bytes());
68+
}
69+
70+
arr.push(...cost_models.language_views_encoding());
71+
}
72+
73+
const buf = new Uint8Array(arr);
74+
return ScriptDataHash.new(blake2b(buf, { dkLen: 32 }));
75+
}

tests/hash/hash.test.ts

+50-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import {
22
BigNum,
33
ConstrPlutusData,
4+
Costmdls,
45
PlutusData,
56
PlutusList,
7+
Redeemers,
68
} from "../../src/generated";
7-
import { hash_plutus_data } from "../../src/hash";
9+
import { hash_plutus_data, hash_script_data } from "../../src/hash";
810

911
describe("hash_plutus_data Tests", () => {
1012
test("Hash of ConstrPlutusData with tag 0 and empty list", () => {
@@ -50,3 +52,50 @@ describe("hash_plutus_data Tests", () => {
5052
expect(hashHex).toBe(expectedHash);
5153
});
5254
});
55+
56+
describe("hash_script_data Tests", () => {
57+
test("Known plutus data hash", () => {
58+
59+
const redeemers = Redeemers.from_hex("a182000182d87980821a006acfc01ab2d05e00");
60+
const costmdls = Costmdls.from_hex("a10098a61a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0a");
61+
const plist = PlutusList.from_hex("9fd8799fd8799f581ca183bf86925f66c579a3745c9517744399679b090927b8f6e2f2e1bb4f6164617065416d616e734576616e73ffd8799f581c9a4e855293a0b9af5e50935a331d83e7982ab5b738ea0e6fc0f9e6564e4652414d455f38333030325f4c30ff581cbea1c521df58f4eeef60c647e5ebd88c6039915409f9fd6454a476b9ffff");
62+
63+
const hash = hash_script_data(redeemers, costmdls, plist);
64+
65+
expect(hash.to_hex()).toBe("e77f547d8249947bf0af31c432fcfff9c1872b2502b3f34d8107002255695e07");
66+
});
67+
68+
test("Known plutus data hash 2", () => {
69+
70+
const redeemers = Redeemers.from_hex("a182000182d87a808219ef741a01160878");
71+
const costmdls = Costmdls.from_hex("a10098a61a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0374f693194a1f0a");
72+
const plist = PlutusList.from_hex("9fd8799f581c45f6a506a49a38263c4a8bbb2e1e369dd8732fb1f9a281f3e88383871a03938700581cee8e37676f6ebb8e031dff493f88ff711d24aa68666a09d61f1d3fb34f43727970746f44696e6f3036333039ffff");
73+
74+
const hash = hash_script_data(redeemers, costmdls, plist);
75+
76+
expect(hash.to_hex()).toBe("f3ae8e52bff4c7b8d803469ee61eabf37e96e89f8a3bb80115ad068ab5dff598");
77+
});
78+
79+
test("Known plutus data hash with no datums", () => {
80+
81+
const redeemers = Redeemers.from_hex("a182000082d87980821a000cdcf41a0eab3111");
82+
const costmdls = Costmdls.from_hex("a10198af1a0003236119032c01011903e819023b00011903e8195e7104011903e818201a0001ca761928eb041959d818641959d818641959d818641959d818641959d818641959d81864186418641959d81864194c5118201a0002acfa182019b551041a000363151901ff00011a00015c3518201a000797751936f404021a0002ff941a0006ea7818dc0001011903e8196ff604021a0003bd081a00034ec5183e011a00102e0f19312a011a00032e801901a5011a0002da781903e819cf06011a00013a34182019a8f118201903e818201a00013aac0119e143041903e80a1a00030219189c011a00030219189c011a0003207c1901d9011a000330001901ff0119ccf3182019fd40182019ffd5182019581e18201940b318201a00012adf18201a0002ff941a0006ea7818dc0001011a00010f92192da7000119eabb18201a0002ff941a0006ea7818dc0001011a0002ff941a0006ea7818dc0001011a0011b22c1a0005fdde00021a000c504e197712041a001d6af61a0001425b041a00040c660004001a00014fab18201a0003236119032c010119a0de18201a00033d7618201979f41820197fb8182019a95d1820197df718201995aa18201a0223accc0a1a0374f693194a1f0a1a02515e841980b30a");
83+
const plist = undefined;
84+
85+
const hash = hash_script_data(redeemers, costmdls, plist);
86+
87+
expect(hash.to_hex()).toBe("5b235dbfaa999fb3616da9903d9affd09c7f2121c2d50db7ece0a9fb8587a038");
88+
});
89+
90+
test("No redeemers", () => {
91+
92+
const redeemers = Redeemers.new();
93+
const costmdls = Costmdls.new();
94+
const plist = PlutusList.from_hex("9fd8799fd8799fd8799f581c7fbb4763847b9ec49a132d5359bd86aaecde9275a03aef294ffb79d0ffd8799fd8799fd8799f581cfa34f3b651ecb6a75834c80dc1fd162feb1d1b4cdcef0d065a5785aaffffffffd8799fd8799f581c7fbb4763847b9ec49a132d5359bd86aaecde9275a03aef294ffb79d0ffd8799fd8799fd8799f581cfa34f3b651ecb6a75834c80dc1fd162feb1d1b4cdcef0d065a5785aaffffffffd87a80d8799fd8799f4040ff1a059eb214ff1a001e84801a001e8480ffff");
95+
96+
const hash = hash_script_data(redeemers, costmdls, plist);
97+
98+
expect(hash.to_hex()).toBe("fd53a28a846ae6ccf8b221d03d4af122b0b3c442089c05b87e3d86c6792b3ef0");
99+
});
100+
101+
});

0 commit comments

Comments
 (0)