Compare commits

...

3 commits

Author SHA1 Message Date
robevansuk
a05ef1d920
Merge 074c5dc237 into a2c40e6522 2026-05-24 13:29:21 +08:00
James Taylor
a2c40e6522
test-network-k8s: ghcr.io for Hyperledger images (#1416)
Some checks failed
Test Network BFT Orderer 🍟 / basic (java, cryptogen) (push) Has been cancelled
Test Network BFT Orderer 🍟 / basic (javascript, ca) (push) Has been cancelled
Test Network BFT Orderer 🍟 / basic (javascript, cryptogen) (push) Has been cancelled
Test Network BFT Orderer 🍟 / basic (typescript, ca) (push) Has been cancelled
Test Network BFT Orderer 🍟 / basic (typescript, cryptogen) (push) Has been cancelled
Test Network Events 💡 / events (go, events) (push) Has been cancelled
Test Network Events 💡 / events (java, events) (push) Has been cancelled
Test Network Events 💡 / events (javascript, events) (push) Has been cancelled
Test Network HSM 🍏 / hsm (go) (push) Has been cancelled
Test Network HSM 🍏 / hsm (java) (push) Has been cancelled
Test Network HSM 🍏 / hsm (javascript) (push) Has been cancelled
Test Network HSM 🍏 / hsm (typescript) (push) Has been cancelled
Kubernetes Test Network 🍒 / ccaas-java (push) Has been cancelled
Kubernetes Test Network 🍒 / ccaas-external (push) Has been cancelled
Kubernetes Test Network 🍒 / k8s-builder (push) Has been cancelled
Kubernetes Test Network 🍒 / multi-namespace (push) Has been cancelled
Kubernetes Test Network 🍒 / bft-orderer (push) Has been cancelled
Test Network Ledger 🥑 / basic (go, ledger) (push) Has been cancelled
Test Network Ledger 🥑 / basic (javascript, ledger) (push) Has been cancelled
Test Network Ledger 🥑 / basic (typescript, ledger) (push) Has been cancelled
Test Network Off Chain 🍔 / off-chain (go) (push) Has been cancelled
Test Network Off Chain 🍔 / off-chain (java) (push) Has been cancelled
Test Network Off Chain 🍔 / off-chain (javascript) (push) Has been cancelled
Test Network Off Chain 🍔 / off-chain (typescript) (push) Has been cancelled
Test Network Private 🔒 / private (go, private) (push) Has been cancelled
Test Network Private 🔒 / private (java, private) (push) Has been cancelled
Test Network Private 🔒 / private (typescript, private) (push) Has been cancelled
Test Network SBE 🎵 / SBE (java, sbe) (push) Has been cancelled
Test Network SBE 🎵 / SBE (typescript, sbe) (push) Has been cancelled
Test Network Secured 🔔 / secured (go, secured) (push) Has been cancelled
Default to using ghcr.io for Hyperledger images in the k8s test network

Signed-off-by: James Taylor <jamest@uk.ibm.com>
2026-05-21 11:30:24 +01:00
Rob Evans
074c5dc237 Fix transferFrom function so that we only delete token balances after we've verified the funds are available first - not before
Signed-off-by: Rob Evans <robevansuk@noreply.users.github.io>
2023-06-26 09:47:41 +01:00
2 changed files with 49 additions and 29 deletions

View file

@ -35,7 +35,7 @@ context CLUSTER_RUNTIME kind # or k3s for Rancher
context CONTAINER_CLI docker # or nerdctl for containerd
context CONTAINER_NAMESPACE "" # or "--namespace k8s.io" for containerd / nerdctl
context FABRIC_CONTAINER_REGISTRY hyperledger
context FABRIC_CONTAINER_REGISTRY ghcr.io/hyperledger
context FABRIC_PEER_IMAGE ${FABRIC_CONTAINER_REGISTRY}/fabric-peer:${FABRIC_VERSION}
context COUCHDB_VERSION 3.4.2
context NETWORK_NAME test-network

View file

@ -9,6 +9,7 @@ package chaincode
import (
"encoding/json"
"fmt"
"github.com/hyperledger/fabric-protos-go/ledger/queryresult"
"sort"
"strconv"
"strings"
@ -949,6 +950,8 @@ func removeBalance(ctx contractapi.TransactionContextInterface, sender string, i
}
defer balanceIterator.Close()
var deferredDeletions = []func() error{}
// Iterate over keys that store balances and add them to partialBalance until
// either the necessary amount is reached or the keys ended
for balanceIterator.HasNext() && partialBalance < neededAmount {
@ -972,16 +975,22 @@ func removeBalance(ctx contractapi.TransactionContextInterface, sender string, i
selfRecipientKeyNeedsToBeRemoved = true
selfRecipientKey = queryResponse.Key
} else {
err = ctx.GetStub().DelState(queryResponse.Key)
if err != nil {
return fmt.Errorf("failed to delete the state of %v: %v", queryResponse.Key, err)
}
deferredDeletions = append(deferredDeletions, deferredDelete(ctx, queryResponse))
}
}
if partialBalance < neededAmount {
return fmt.Errorf("sender has insufficient funds for token %v, needed funds: %v, available fund: %v", tokenId, neededAmount, partialBalance)
} else if partialBalance > neededAmount {
} else {
// enough token funds have been found to perform the update
// now we can delete the token entries to supply updated token balances
for _, deleteFn := range deferredDeletions {
err := deleteFn()
if err != nil {
return err
}
}
if partialBalance > neededAmount {
// Send the remainder back to the sender
remainder, err := sub(partialBalance, neededAmount)
if err != nil {
@ -1009,10 +1018,21 @@ func removeBalance(ctx contractapi.TransactionContextInterface, sender string, i
}
}
}
}
return nil
}
func deferredDelete(ctx contractapi.TransactionContextInterface, queryResponse *queryresult.KV) func() error {
return func() error {
err := ctx.GetStub().DelState(queryResponse.Key)
if err != nil {
return fmt.Errorf("failed to delete the state of %v: %v", queryResponse.Key, err)
}
return nil
}
}
func emitTransferSingle(ctx contractapi.TransactionContextInterface, transferSingleEvent TransferSingle) error {
transferSingleEventJSON, err := json.Marshal(transferSingleEvent)
if err != nil {