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

Last inherit failure #275

Open
uncomputable opened this issue Mar 20, 2025 · 2 comments
Open

Last inherit failure #275

uncomputable opened this issue Mar 20, 2025 · 2 comments

Comments

@uncomputable
Copy link
Collaborator

The last will example from the Simfony crate fails with the latest rust-simplicity version.

I constructed a minimal unit test (see below). Git bisect reveals that the test starts failing at the value byte vector rewrite. Investigating.

#[test]
fn last_will_inherit() {
    //use base64::engine::general_purpose::STANDARD;
    use crate::jet::elements::{ElementsEnv, ElementsUtxo};
    use crate::jet::Elements;
    use bitcoin::hex::FromHex;
    use elements::confidential;
    use elements::hex::ToHex;
    use hashes::Hash;

    fn create_default_transaction(
        lock_time: elements::LockTime,
        sequence: elements::Sequence,
        include_fee_output: bool,
    ) -> elements::Transaction {
        let mut tx = elements::Transaction {
            version: 2,
            lock_time,
            input: vec![elements::TxIn {
                previous_output: elements::OutPoint::default(),
                is_pegin: false,
                script_sig: elements::Script::new(),
                sequence,
                asset_issuance: elements::AssetIssuance::default(),
                witness: elements::TxInWitness::default(),
            }],
            output: vec![elements::TxOut {
                asset: confidential::Asset::default(),
                value: confidential::Value::default(),
                nonce: confidential::Nonce::default(),
                script_pubkey: elements::Script::default(),
                witness: elements::TxOutWitness::default(),
            }],
        };

        if include_fee_output {
            tx.output.push(elements::TxOut::new_fee(
                1_000,
                elements::AssetId::default(),
            ));
        }
        tx
    }

    /// Returns a dummy Elements environment with a provided transaction.
    pub fn dummy_with_tx(tx: elements::Transaction) -> ElementsEnv<Arc<elements::Transaction>> {
        let ctrl_blk: [u8; 33] = [
            0xc0, 0xeb, 0x04, 0xb6, 0x8e, 0x9a, 0x26, 0xd1, 0x16, 0x04, 0x6c, 0x76, 0xe8, 0xff,
            0x47, 0x33, 0x2f, 0xb7, 0x1d, 0xda, 0x90, 0xff, 0x4b, 0xef, 0x53, 0x70, 0xf2, 0x52,
            0x26, 0xd3, 0xbc, 0x09, 0xfc,
        ];
        let num_inputs = tx.input.len();

        ElementsEnv::new(
            Arc::new(tx),
            vec![
                ElementsUtxo {
                    script_pubkey: elements::Script::default(),
                    asset: confidential::Asset::default(),
                    value: confidential::Value::default(),
                };
                num_inputs
            ],
            0,
            Cmr::from_byte_array([0; 32]),
            elements::taproot::ControlBlock::from_slice(&ctrl_blk).unwrap(),
            None,
            elements::BlockHash::all_zeros(),
        )
    }

    /// Returns a dummy Elements environment with the given locktime and sequence.
    pub fn dummy_with(
        lock_time: elements::LockTime,
        sequence: elements::Sequence,
        include_fee_output: bool,
    ) -> ElementsEnv<Arc<elements::Transaction>> {
        let default_tx = create_default_transaction(lock_time, sequence, include_fee_output);
        dummy_with_tx(default_tx)
    }

    // let prog_base64 = "5wnQKEGJsWVABAmKSEGCrynMGLpUF69BbvwQFoAuY+y1ngQJfqSPabfWRZ9K3F2jdRYYBitLzfMz987l3WKtAxSudDhYOBTf5tlucUbKz5QK2LfAvMA1kChBh+DHCpJAk4cziqISK6EzABFXCwYvClhPYGFQusJfripGQssOAVt34AhgGJAoSQbgJxuBig/FJwqFobGHNddy8HoTqejIHGcv8bcleUZT57KmW1Vp7LXaMUR4qMQ4YBiE3n41BAOBgcOJFAGQOJwuLAGkHHAHHpBiBQbkHacYEf5RB7X1tMEVAbpXAfNhcd45LjO88p6usCblccJ7lByDCchhcRcOA4GJxgBwcGIGlafkwigGSWMMQSTRPhfidUim1MchFg2+ZsIYB8RO84Db5ByMCcj0kCT4YnM/BVazZBMsdgY/lS0WYcYfsNRJVmhtHQmf/PVrNEOe4wYBisgAAAAIGkKhambcTmCIv9QHGkTTAYXN78l9PRKwkaP7L+QgG2hgCZadW734oMAxC4AwcwLvfahR91ofRxdIEhoraXiTCljMruIwlAG9G26fy7ABhgGL4cEObxOhhI4BnviN4uejwVYdGCizvg8pDe+f7r9U2pQklHLAwDhITlckiyAAAAAAUKvhqObQQ6CxT1VyVCCLZUfrJhqhp/qbNkpewATHlLgTDwBZJgwDELSQkUM6IZzkLPP/t8aZ/NfTm5pw5IQ0J/duRiaFMIlp35sJi5uVAYBgObvJWcC0jz5LzKXn0/Nn/OQnPezJTiq+w46I+xAB5sdEwwDWQKEkH1m5aCgWDNug5tpVnanSODCL5dAHG0YZYXL7/GhLKIDD2ZYRxW4obTlfDAMQtRvoQT9zeJ/JSg1zVnOQ+dSDqBncb+M9zPuT55FUoWyEHDxeBVkAAAAAg4AFwB8NhzSoNzoMc1Ae/7Z55CGHj0gOG/ZVBjb5kbDqY2kAJh07WGAYhcGISKEGB4nAwHMDLqyIAl/t8mPC4rRGEfM1lVH7CAxNfptKDrOKJGwAHAYBrC4iNL6lcZ9HTU3CRlRyCoGVZzuEYuSi/jp604WRZrD9L3pYeQ4FCcTgcuhcLAcvAcWAchQuRgDmABzNhOZwDmDFyvAcwoOVQHLcHleBy6B5fgc34A==";
    // let wit_base64 = "dVIBu2KwqLjRj9EvwClR6jmYukK/xmZNqvig0imMrUPNwhNYx8gvN2VCddwv6oyFitvpe6ySgotJilojcATbbwA="; // simfony::update
    // let wit_base64 = "OqkA3bFYVFxox+iX4BSo9RzMXSFf4zMm1XxQaRTGVqHm4QmsY+QXm7KhOu4X9UZCxW30vdZJQUWkxS0RuAJtt4A="; // simfony::master
    // let prog_bytes = base64::Engine::decode(&STANDARD, prog_base64).unwrap();
    // let wit_bytes = base64::Engine::decode(&STANDARD, wit_base64).unwrap();
    //
    // println!("{}", prog_bytes.as_hex());
    // println!("{}", wit_bytes.as_hex());

    let prog_hex = "e709d0284189b1654004098a484182af29cc18ba5417af416efc1016802e63ecb59e04097ea48f69b7d6459f4adc5da3751618062b4bcdf333f7cee5dd62ad0314ae7438583814dfe6d96e7146cacf940ad8b7c0bcc03590284187e0c70a92409387338aa2122ba1330011570b062f0a584f606150bac25fae2a4642cb0e015b77e008601890284906e0271b818a0fc5270a85a1b18735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c438601884de7e3504038181c389140190389c2e2c01a41c70071e90620506e41da71811fe5107b5f5b4c11501ba5701f36171de392e33bcf29eaeb026e571c27b941c8309c86171170e038189c6007070620695a7e4c2280649630c4124d13e17e27548a6d4c721160dbe66c21807c44ef380dbe41c8c09c8f49024f862733f0556b364132c76063f952d1661c61fb0d44956686d1d099ffcf56b34439ee306018ac8000000081a42a16a66dc4e6088bfd4071a44d30185cdefc97d3d12b091a3fb2fe4201b686009969d5bbdf8a0c0310b80307302ef7da851f75a1f471748121a2b6978930a58ccaee2309401bd1b6e9fcbb00186018be1c10e6f13a1848e019ef88de2e7a3c1561d1828b3be0f290def9feebf54da94249472c0c038484e57248b200000000050abe1a8e6d043a0b14f557254208b6547eb261aa1a7fa9b364a5ec004c794b8130f0059260c0310b49091433a219ce42cf3ffb7c699fcd7d39b9a70e4843427f76e462685308969df9b098b9b9501806039bbc959c0b48f3e4bcca5e7d3f367fce4273decc94e2abec38e88fb1001e6c744c300d640a1241f59b96828160cdba0e6da559da9d238308be5d0071b46196172fbfc684b2880c3d99611c56e286d395f0c0310b51be8413f73789fc94a0d73567390f9d483a819dc6fe33dccfb93e79154a16c841c3c5e055900000000838005c01f0d8734a8373a0c73501effb679e421878f480e1bf6550636f991b0ea636900261d3b58601885c18848a1060789c0c073032eac88025fedf263c2e2b44611f3359551fb080c4d7e9b4a0eb38a246c001c0601ac2e2234bea5719f474d4dc24654720a8195673b8462e4a2fe3a7ad3859166b0fd2f7a58790e0509c4e072e85c2c072f01c58072142e4600e6001ccd84e6700e60c5caf01cc283954072dc1e5781cba0797e0737e0";
    // let wit_hex = "755201bb62b0a8b8d18fd12fc02951ea3998ba42bfc6664daaf8a0d2298cad43cdc21358c7c82f37654275dc2fea8c858adbe97bac92828b498a5a237004db6f00"; // simfony::update
    let wit_hex = "3aa900ddb158545c68c7e897e014a8f51ccc5d215fe33326d57c506914c656a1e6e109ac63e4179bb2a13aee17f54642c56df4bdd6494145a4c52d11b8026db780"; // simfony::master
    let prog_bytes = Vec::<u8>::from_hex(prog_hex).unwrap();
    let wit_bytes = Vec::<u8>::from_hex(wit_hex).unwrap();

    let prog = BitIter::from(prog_bytes);
    let witness = BitIter::from(wit_bytes);
    let prog = RedeemNode::<Elements>::decode(prog, witness).unwrap();

    // let mut mac = BitMachine::for_program(&prog).unwrap();
    let mut mac = BitMachine::for_program(&prog);
    let lock_time = elements::LockTime::ZERO;
    let sequence = elements::Sequence::from_height(25920);
    let env = dummy_with(lock_time, sequence, false);
    assert_eq!(
        env.c_tx_env().sighash_all().to_hex(),
        "0197352cfe81b504a15a30dba12faada120e2753ea9a9a4c2e6dbaadf1263b45"
    );
    mac.exec(&prog, &env).expect("execution should succeed");
}
@uncomputable
Copy link
Collaborator Author

I have a feeling that the issue is related to the encoding of sum values.

@apoelstra
Copy link
Collaborator

I will try to look at this tomorrow -- one thing that might help is to write a comparative fuzz test between master and the released version and see if we can produce values that encode differently on the two versions.

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

No branches or pull requests

2 participants