`Signature` always be invalid, what am I doing wrong?

I have the following code:

pub async fn test_block() -> Result<Vec<u8>, SuiError> {
    let client = SuiClientBuilder::default()
        .build(RPC_URL)
        .await
        .unwrap();
    
    let mut private_key = decode_private_key(PRIVATE_KEY);
    private_key.insert(0, 0x00);

    let keypair = SuiKeyPair::from_bytes(&private_key).unwrap();
    let sender_address = SuiAddress::from(&keypair.public());
    let coins = client.coin_read_api().get_all_coins(sender_address, None, None).await.unwrap();
    let coin = coins.data.into_iter().next().unwrap();
    println!("{}", sender_address);

    let mut ptb = ProgrammableTransactionBuilder::new();
    let split_coint_amount = ptb.pure(1000u64).unwrap(); // note that we need to specify the u64 type
    ptb.command(Command::SplitCoins(
        Argument::GasCoin,
        vec![split_coint_amount],
    ));
    let argument_address = ptb.pure(SuiAddress::from_str(RECIPIENT_ADDRESS).unwrap()).unwrap();
    ptb.command(Command::TransferObjects(
        vec![Argument::Result(0)],
        argument_address,
    ));
    let builder = ptb.finish();

    let tx_data = TransactionData::new_programmable(
        sender_address, 
        vec![coin.object_ref()], 
        builder, 
        5_000_000, 
        client.read_api().get_reference_gas_price().await.unwrap(),
    );

    let signature = keypair.sign(tx_data.digest().as_ref());
    let transaction = Transaction::from_data(tx_data, vec![signature]);


    let bb = client.quorum_driver_api().execute_transaction_block(
        transaction, 
        SuiTransactionBlockResponseOptions::full_content(), 
        None
    ).await.unwrap();
    println!("{:?}", bb);

    Ok(vec![])
}

The signature generated always be invalid, what am I doing wrong?